Spring MVC 2018-10-18

2018-10-19  本文已影响0人  哈222

1.helloWorld

1.spring-config.xml 2.web.xml

init-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继续处理。

上一篇下一篇

猜你喜欢

热点阅读