Spring MVC 2018-10-18
1.helloWorld
1.spring-config.xml 2.web.xmlinit-param不配置,有默认文件,位于/WEB-INF/<servlet-name>-servlet.xml
3.注解方法:
@RequestMapping("/helloworld") 注解来映射请求的URL
public Stringhello(){
System.out.println("hello World!");
return "success"; }
通过配置试图解析器,可跳转到/WEB-INF/views/success.jsp页面
2.@RequestMapping 映射请求
1.除了修饰方法,还能修饰类
2.method属性,指定请求方式
例如:@RequestMapping(value="/testMethod", method = RequestMethod.POST)
3.params 、headers 请求参数和请求头等于或者不等于指定数值
4.支持通配符
?匹配文件名中一个字
*匹配文件名中任意字
** ** 匹配多层径
5.目标方法中取参数 @PathVariable
3.REST 资源表现层转化
GET 获取资源 /order/1
POST 新建资源 /order
PUT 更新资源 /order/1
DELETE 删除资源 /order/1
在web.xml文件中配置4.映射请求参数
获取请求参数
get获取请求参数 order?username=ai&age=12获取请求头参数
获取cookie中的参数
5.使用POJO对象绑定请求参数值-支持级联属性
Spring MVC 会按照请求参数名和 POJO 属性名进自动的匹配,为该对象填充属性值。支持级联属性。
6.Sevlet原生api作为参数
7.处理模型数据 ModelAndView
目标返回方法的返回值可以使ModelAndView类型
其中可以包含视图和模型类型
success.jsp内部原理:
springmvc会把modelandview的model中的数据放到request域对象中。
8.处理模型数据的Map
可从requestScope中获取
9.参数放入session中--只能放在类的上面,不能放在方法的上面
在Controller的类上面添加注解,可通过属性和对象类型把对象放入session中
@SessionAttributes(value={"user","password"},types={String.class})
10.ModelAttribute注解
使用场景:
①注解标记的方法,会在每个目标方法执行之前被springMVC调用
②可以修饰目标方法POJO类型的入参, 其value属性值有如下作用:
>SpringMvc会使用value属性值再implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中
>SpringMVC会把value为key,POJO类型的对象为value,存入到request中
运行流程:
1.执行该注解的方法:从数据库中去除对象,把对象放入Map中,键位:User--键名需要与目标方法的入参类型的第一个字母小写的字符串一致
2.springmvc从Map中取出User对象,并把表单的请求参数赋值给该User对象的对应属性
3.springmvc把上述对象传入目标方法的参数。
源码分析的流程:
1.调动@ModelAttribute注解修饰的方法,实际上把@ModelAttribute方法中Map的数据放在了implicitModel中。
2.解析请求处理器的目标参数,实际上目标参数来自于WebDatBinder对象的target属性
2.1创建WebDataBinder对象:
① 确定objectName属性:若传入的attributeName是空串,则objectName为类名第一个字母小写。
注意:attributeName.若目标方法的POJO属性使用了@ModelAttribute来修饰,则attributeName值即为@ModelAttribute的value属性值。
② 确定target属性:
>在implicitModel中查找,attributeName对应的属性值。若存在,ok。
>若不存在:则验证当前Handler是否使用了@SessoinAttribute进行修饰,若使用了,则尝试从Session中获取attrName所对应的属性值。若Session中没有对应的属性值,则抛出异常。
>若Handler没有使用@SessionAttribute进行修饰,或@SessionAttribute中没有使用value值指定的key和attrName相匹配,则通过反射创建了POJO对象。
2.2 spingmvc把请求表单的请求参数赋给了WebDataBinder的target对应的属性
2.3.SpringMvc会把WebDataBinder的attrName和target给到implicitModel
2.4把WebDataBinder的target作为参数传递给目标方法的入参
11.springMVC如何确定pojo的类型
12.视图解析器
无论返回String、View或ModelMap等类型,SpringMVC会在内部装配称一个ModelAndView对象,包含逻辑名和模型对象的视图。
SpringMVC借助视图解析器(ViewResolver)得到最终的物理视图-View对象。
视图对象由视图解析器负责实例化,由于是无状态的(每个请求创建新的对象),不会有线程安全问题。
13.mvc:view-controller标签
可直接按相应转发的页面,而无需进过Handler的方法,在spring 配置xml文件中添加
<mvc:view-controller path="/success" view-name="success"></mvc:view-controller>
使用该标签,需使用mvc:annotation-driven标签,否则controller不起作用
<mvc:annotation-driven></mvc:annotation-driven>
14.自定义视图
1.在spring配置文件中配置,通过order设置优先级,数值越小约高,默认视图解析器优先级最低
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="100"></bean>
2.创建视图类,实现View接口,并进行@Controller注释
3.返回字段为类名即可调用视图
15.重定向
在目标方法返回的路径前加 forward:/ 和redirect:/
16.CRUD
一、按照helloWorld进行配置,再为了能够获取到delete和put请求
把post请求转为delete或put请求
web.xml配置二、增加操作,使用spring的表单标签,在jsp页面中添加以下代码
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
form表单标签可以更快速的开发出表单页面,且更方便的进行表单值的回显,可通过modelAttribute属性指定绑定的模型属性,若没有指定该属性,则默认从request域对象中读取command的表单bean,如果该属性不存在,则会发生错误。request域中的对象,即在handler中存入map的对象。path:表单字段,对应html元素的那么属性,支持级联属性
<form:form action="emp" method="post" modelAttribute="employee">
LastName:<form:input path="lastName"></form:input>
</form:form>
三、删除操作
1.SpringMVC处理静态资源
问题:优雅的REST风格的资源URL不希望带.html或.do等后缀。若将DispatcherServlet请求映射配置为/,则SpringMVC将获取WEB容器的所有请求,包括静态资源的请求,SpringMVC会将他们当成一个普通的请求处理,因此找不到对应的处理器将导致错误。
解决:再SpringMVC的配置文件中配置
<mvc:default-servlet-handler/><mvc:annotation-driven></mvc:annotation-driven>
default-servlet-handler 将在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler,它会进入DispatcherServlet的请求进行筛选,如果发现是没有经过映射的请求,就将请求交由WEB应用服务器默认的Servlet处理。如果不是静态资源的请求,才由DispatcherServlet继续处理。