MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。
M:model,模型层,指工程中的JavaBean,作用是处理数据
JavaBean分为两类:
实体类:一张表就是一个实体
业务处理类:service,dao
V:view,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
C:controller,控制层,指项目中的servlet,作用是接受请求和响应浏览器
MVC执行流程:用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层(Service->Dao)处理请求,处理完毕(Dao->Service)将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器
三层架构:
表现层:web层,负责接收客户端的请求,向客户端响应结果,通常客户端使用http协议请求web层,分为控制层(接收请求)和展示层(结果展示)
业务层:service层,负责业务逻辑的处理,和我们开发项目的需求息息相关
持久层:dao层,负责数据持久化,和数据库交互
springMVC位于项目的表现层
流程总结:
1.创建maven工程,配置tomcat
2.导入pom依赖
3.在web-xml中注册前端控制器
4.创建springmvc配置文件,开启组件扫描,配置Thymeleaf视图编译器
5.创建controller类,加注解
6.创建html文件
*控制层中的方法都是通过转发进行请求访问的
*如果运行后显示的内容是index.jsp中的内容不是index.html中的内容,把index.jsp的名字改了就行

在/WEB-INF/static/下创建index.html
在/main/java下创建一个类
tomcat启动运行


同级目录下创建target.xml内容随便,仅做测试


浏览器发送请求,若地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面。
功能:RequestMapping--请求映射,作用是将请求和处理请求的控制器方法关联起来,建立映射关系。
位置:
放在类上:设置映射请求的请求路径的初始信息
运用场景:如果有两个controller类,两个类中有同一个请求路径,那么将该注解加在类上做区分。因为请求路径必须唯一。
放在方法上:设置映射请求的请求路径的具体信息
证明路径必须唯一,在controller2这个类上加上@RequestMapping("/hello")注解
index.html中加一行
<a th:href="@{/target2}">访问目标页面target2.html</a>
controller2.Java中方法上的注解value变为traget2
测试是否能访问成功target2.html


说明Thymeleaf不会自动加类上的@RequestMapping中的初始路径,需要手动添加
String[] value():请求路径只要满足其中一个就可以访问成功,value可省略
(405)RequestMethod[] method():get/post/put/delete,匹配路径的同时匹配请求方式,可传多个值。如果匹配到了路径但是没匹配到请求方式,浏览器报405,不设置则任意请求方式都可以,method和value不可省略。在html中写个form表单post提交测试一下


两者等价👇 ,post、put、delete同理

仅了解即可
(400)String[] params():通过请求的请求参数匹配请求映射,所有条件同时满足
匹配规则:
"param":要求请求映射所匹配的请求必须携带param请求参数
"!param":要求请求映射所匹配的请求必须不能携带param请求参数
"param=value":要求请求映射所匹配的请求必须携带param请求参数且param=value
"param!=value":要求请求映射所匹配的请求必须携带param请求参数但是param!=value
仅了解即可
(404)String[] headers():通过请求的请求头信息匹配请求映射,匹配规则同params

String[] consumes():指定处理请求提交数据的类型(Content-Type),如果提交的数据不符合要求,报415不支持的媒体类型错误
String[] produces():设置响应类型和编码,即Content-Type

?:表示任意单个字符,访问的时候?可以时任意值(?和/不可以)
*:表示任意的0个或多个字符
:表示任意的一层或多层目录----spring-webmvc5.3以上版本已弃用
注意:使用时,只能使用//路径的方式
原始方式:/路径?属性名=属性值
restful方式:/路径/值
不能用request.getParameter取值

![]()





如何获取同名参数(复选框)
如果报错IllegalArgumentException,在pom.xml中的build标签内添加:



假如页面中的名字带下划线

required :默认为true,表示该value对应的参数必须传参,如果不传参报400错误。设置为false如果形参没有传参就为类型的默认值。
defaultValue: 设置没有传参时的默认值


将请求参数和控制器方法的形参创建映射关系
属性:
value:指定为形参赋值的请求参数的参数名
required:设置是否必须传输次请求参数,默认值为true
defaultValue:不管required属性值为true还是false,当value所指定的请求参数没有传输或传输值为空时,则使用默认值为形参赋值。
将请求头信息和控制器方法的形参创建映射关系
属性同RequestParam

将cookie数据和控制器方法的形参创建映射关系
属性同RequestParam



进行添加操作、或者更新操作时,页面中文本框较多,这些数据对应数据库中的一张表,表又对应一个实体类,可以在控制器方法的形参写一个实体类类型,前端页面传递的参数只需要和实体类的属性名相同即可完成把请求参数赋值给实体类
创建实体类
页面上写一个form表单
controller中


获取参数时出现中文乱码问题如何解决?
get请求的乱码是由tomcat造成的,需要在tomcat/conf/servlet.xml中设置,大概第70行
URIEncoding="UTF-8"

针对post请求获取参数中文乱码解决办法:在servlet执行前设置中文编码--->过滤器
在web.xml中注册过滤器(放在最前面)
五种方式均是将我们的数据包装成ModelAndView
4.1.1 使用servletAPI向request域对象共享数据
创建success.html页面
在控制器中存储一个域对象,转发到success页面

4.1.2 ★使用ModelAndView向request域对象共享数据

4.1.3 使用Model向request域对象共享数据

4.1.4 使用map集合向request域对象共享数据

4.1.5 使用ModelMap集合向request域对象共享数据

4.1.6 Model、ModelMap、Map的关系
三者的形参本质上都是BindingAwareModelMap

4.3 向application域对象共享数据
就是servletContext域

SpringMVC中的视图时View接口,视图的作用是渲染数据,将模型中的数据展示给用户
SpringMVC视图的种类有很多,默认有转发的视图是InternalResourceView和重定向视图RedirectView
当工程引入jstl的依赖,转发视图会自动转换成jstlView
若使用的视图技术为Thymeleaf,在SpringMVC配置文件中配置了Thymeleaf视图解析器,由此视图解析器解析之后所得的是ThymeleafView
当控制器方法中所设置的视图名称没有任何前缀和后缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得的最终路径,会通过转发的方式实现跳转,上面的return “html不带后缀的文件名”都是ThymeleafView。
SpringMVC默认的转发视图时InteralResourceVIew:当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InteralResourceVIew视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转。

SpringMVC中默认的重定向视图是RedirectView:当控制器方法所设置的视图名称以“Redirect:”为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀“Redirect:”去掉,剩余部分作为最终路径通过重定向的方式实现跳转。
转发和重定向的区别:
转发是浏览器一次请求,第一次是浏览器请求,第二次是服务器内部的请求,地址栏不会变化,转发可以获取请求域对象中的数据,可以访问web-inf下的资源,不能跨域
重定向是浏览器两次请求,地址栏会变化,重定向不能获取请求域对象中的数据,不可以访问web-inf下的资源,可以跨域
当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller标签进行表示。
path:设置请求地址
view-name:设置请求地址所对应的视图名称
SpringMVC控制文件中:
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
注意:当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射全部失效,此时需要在SpringMVC核心配置文件中设置开启mvc注解驱动的标签。


重新编写SpringMVC配置文件,

不需要写任何的跳转,启动tomcat服务器之后默认访问index.jsp,这个默认启动页是在tomcat的web.xml中配置好的,如果想改变默认启动页,可以在项目的web.xml中配置:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
按照配置的顺序依次查找页面,匹配到一个符合要求的就停止查找并访问页面

在jsp中实现页面的转发
在WEB-INF/dynamic下创建success.jsp文件


如果地址栏出现乱码(如下图),说明页面中的el表达式被当成字符串处理了,做如下修改:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>

资源状态转移,具体说,就是HTTP协议里面四个表示操作方式的动词:
GET:获取资源
POST:新建资源
PUT:更新资源
DELETE:删除资源
REST风格提倡URL地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为URL地址的一部分,以保证风格的一致性。
SaveUser
user--->post请求方式
删除操作 deleteUser?id=1user/1--->delete请求方式
更新操作 updateUser user--->put请求方式现在的项目web.xml如下
模拟user表的增删改查操作

点击两个超链接
form表单提交数据
由于浏览器只支持发送get和post方式的请求,那么如何发送put和delete方式呢?
只能使用过滤器
在web.xml中配置过滤器:HiddenHttpMethodFilter,放在字符集过滤器下边
模拟数据不连接数据库,在index.html中用这个超链接跳转全查页面
<a th:href="@{/user}">查看用户信息</a><br>
1.创建实体类
提供get、set、toString、全参构造、无参构造方法
2.dao层
用集合模具数据库中的数据,SpringMVC配置文件和web.xml用上面的
3.controller层全部代码
4.页面设计
4.1 user_list.html
4.2 user_add.html
4.3 user_update.html
5.核心配置文件






6.处理静态资源流程
列表页面使用的是/user请求,请求方式为get;删除使用了vue.js,通过超链接控制表单的提交,给超链接绑定了点击事件,通过vue处理点击事件,在vue中组织超链接的默认行为,最终以提交表达的形式提交;添加用户跳转到添加页面;修改跳转到修改页面并把请求方式改为put提交。
如果项目报错vue.js找不到,1.重新打包war包 2.配置文件中配置开启对静态资源的访问
开启对静态资源的访问和开启mvc注解驱动要同时配置,不然当前项目的所有请求都由默认的servlet处理,那么除了静态资源其它请求都无法访问。
报文信息转换器,将轻微报文转换为java对象,将java对象转换为响应报文
HttpMessageConverter提供了两个注解和两个类型
@RequestBody @ResponseBody
RequestEntity ResponseEntity
可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody进行标识,当前请求的请求体就会为当前注解所标识的参数赋值。
7.1.1 在index.html中写一个表单
7.1.2 controller



如果响应的是一个对象,是不能直接响应的,需要转换成json格式的字符串。
加入pom依赖

SpringMVC处理Ajax

封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息。

派生注解@RestController
等于@ResponseBody+@Controller,相当于给当前控制器内的所有方法都加上了@ResponseBody注解。
用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。
使用ResponseEntity实现下载文件功能
文件的上传功能(servlet3.0)
添加依赖
web.xml
核心配置文件添加
页面



请求-->过滤器-->DispacherServlet-->pre-->controller-->PostHandle-->ModelAndView-->after
一定要在配置文件中配置拦截器

把配置文件中对异常处理器的配置注释掉,依旧访问/testExceptionHandler,效果一样
创建web容器启动配置类(替换掉web.xml)

创建SpringMVC配置类

DispatcherServlet:前端控制器,不需要工程师开发,由框架提供
作用:统一处理请求和响应,整个流程控制中心,由它调用其他组件处理用户请求
HandlerMapping:处理器映射,不需要工程师开发,由框架提供
作用:根据url、method等信息查找Handler,即控制器方法
Handler(Controller):处理器,需要工程师开发
作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理
HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供
作用:通过HandlerAdapter对处理器(控制器方法)进行执行
ViewResolver:视图解析器,不需要工程师开发,由框架提供
作用:进行视图解析,得到相应的视图,例如:thymeleafView,InternalResorceView,RedirectView
View:视图,不需要工程师开发,由框架提供
作用:将模型数据通过页面展示给用户
到此这篇webflux和webmvc区别(webforms和mvc的区别)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!1.用户向服务器发送请求--->DispatcherServlet
2.DispatcherServlet对请求的URL进行解析,得到请求资源标识符(URI),判断请求的URI对应的映射是否存在:
不存在:配置mvc:default-servlet-handler
存在则继续
3.根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回
4.DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter
5.如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】
6.提取Request中的模型数据,填充Handler入参(形参),开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作
7.Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象
8.此时将开始执行拦截器的postHandle(...)方法【逆向】
9.根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行10.HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,11.根据Model和View,来渲染视图
12.渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】
13.将渲染结果返回给客户端
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/25047.html