一、spring mvc 处理请求的流程。
二、在 web 中配置 DispatcherServlet
1. 配置 <context-param>
- <context-param>
- <param-name>
- contextConfigLocation
- </param-name>
- <param-value>
- classpath:spring-base.xml,classpath:spring-another.xml
- </param-value>
- </context-param>
通过 contextConfigLoaction 在 web.xml 里配置需要加载的 spring 配置文件
2. 配置 <listener>
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
在 web.xml 里配置 Listener,本 Listener 会去加载第一步中指定的配置文件,如果指定了要加载的文件, 则会去加载相应的 xml, 而不会去加载 / WEB-INF / 下的 applicationContext.xml。(指定加载即是第 1 步的配置) 如果没有指定的话,默认会去 / WEB-INF / 下加载 applicationContext.xml。
3. 配置 DispatcherServlet
- <servlet>
- <servlet-name>
- Servlet
- </servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <load-on-startup>
- 1
- </load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>
- Servlet
- </servlet-name>
- <url-pattern>
- *.do
- </url-pattern>
- </servlet-mapping>
配置了名为 Servlet 的 DispatcherServlet,它默认自动加载 / WEB-INF/Servlet-servlet.xml 的 spring 配置文件,启动 web 层的 Spring 容器。
可以通过 <servlet> 的 <init-param> 指定:
属性 namespace:对于 DispatcherServlet 的命名空间,默认为
属性 contextConfigLocation:如果 DispatcherServlet 对应上下文有多个 spring 配置文件,则可以使用该属性指定。
三、注解驱动的控制器
[email protected]
- /**
- * 接收GET请求
- * @return
- */
- @RequestMapping(value="/delete",method = RequestMethod.GET)
- public String get(){
- System.out.println("get");
- return "get";
- }
- /**
- * 接收POST请求
- * @return
- */
- @RequestMapping(value="/delete",method = RequestMethod.POST)
- public String post(){
- System.out.println("post");
- return "post";
- }
- /**
- * 只接收 name 参数
- * @return
- */
- @RequestMapping(value="/delete",params="name")
- public String params(String name){
- System.out.println("hello "+name);
- return "helloworld";
- }
- /**
- * 只接收请求头中 Content-Type 为 text/html;charset=UTF-8的请求
- * @return
- */
- @RequestMapping(value="/delete",headers="Content-Type:text/html;charset=UTF-8")
- public String headers(){
- System.out.println("headers");
- return "helloworld";
- }
2. 请求处理方法签名
Spring MVC 通过分析处理方法的签名,把 http 请求信息绑定到处理方法的相应入参中,然后再调用处理方法得到返回值。以下是四种绑定参数的方式:
- // ①请求参数按名称匹配的方式绑定到方法入参中,方法返回对应的字符串代表逻辑视图名
- @RequestMapping(value = "/handle1")
- public String handle1(@RequestParam("userName") String userName,
- @RequestParam("password") String password,
- @RequestParam("realName") String realName) {
- return "success";
- }
- // ②将Cooke值及报文头属性绑定到入参中、方法返回ModelAndView
- @RequestMapping(value = "/handle2")
- public ModelAndView handle2(@CookieValue("JSESSIONID") String sessionId,
- @RequestHeader("Accept-Language") String accpetLanguage) {
- ModelAndView mav = new ModelAndView();
- mav.setViewName("success");
- mav.addObject("user", new User());
- return mav;
- }
- // ③请求参数按名称匹配的方式绑定到user的属性中、方法返回对应的字符串代表逻辑视图名
- @RequestMapping(value = "/handle3")
- public String handle3(User user) {
- return "success";
- }
- // ④直接将HTTP请求对象传递给处理方法、方法返回对应的字符串代表逻辑视图名
- @RequestMapping(value = "/handle4")
- public String handle4(HttpServletRequest request) {
- return "success";
- }
3. 使用 HttpMessageConverter
1)概念:HttpMessageConverter<T> 负责把请求信息转换为一个对象,将对象输出作为响应信息。
2)使用:[email protected]@ResponseBody
- @RequestMapping(value = "/handle41")
- public String handle41(@RequestBody String body) {//把请求报文体转换为字符串绑定到RequestBody中
- System.out.println(body);
- return "success";
- }
- @ResponseBody//把数据输出到响应流中。
- @RequestMapping(value = "/handle42/{imageId}")
- public byte[] handle42(@PathVariable("imageId") String imageId)
- throws IOException {
- System.out.println("load image of " + imageId);
- Resource res = new ClassPathResource("/image.jpg");
- byte[] fileData = FileCopyUtils.copyToByteArray(res.getInputStream());
- return fileData;
- }
作用:
i) 该注解用于读取 Request 请求的 body 部分数据,使用系统默认配置的 HttpMessageConverter 进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把 HttpMessageConverter 返回的对象数据绑定到 controller 中方法的参数上。
作用:
该注解用于将 Controller 的方法返回的对象,通过适当的 HttpMessageConverter 转换为指定格式后,写入到 Response 对象的 body 数据区。
使用时机:
返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml 等)使用;
作用:
[email protected][email protected]
4. 处理模型数据
spring mvc 在调用处理方法前会创建一个隐含的模型对象,如果处理方法的入参为 Map 或者 Model 类型,则 spring mvc 会把隐形模型的引用传递给这些入参,一般是在方法参数写上 Model model,然后通过 model.addAttribute(key,value) 来添加数据。
- @RequestMapping(value = "/handle63")
- public String handle63(ModelMap modelMap) {
- User user = (User) modelMap.get("user");//springmvcv会把隐含模型对象传递给modelMap,所以可以访问模型的数据
- user.setUserName("tom");
- modelMap.addAttribute("testAttr", "value1");
- return "/user/showUser";
- }
四、处理方法的数据绑定 spring mvc 通过反射机制对目标处理函数的签名进行分析,将请求消息绑定到处理方法的入参中,核心部件是 DataBinder。
1. 数据格式化
spring 使用转换器进行源类型对象到目标类型对象的转换。spring 提供两个内建的实现类,分别支持数字及日期类型的注解驱动格式化。
@[email protected]
- <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
- <property name="converters">
- <list>
- <bean class="com.smart.domain.StringToUserConverter" />
- </list>
- </property>
- </bean>
- @DateTimeFormat(pattern="yyyy-MM-dd")
- private Date birthday;
- @NumberFormat(pattern="#,###.##")
- private long salary;
- form.add("birthday", "1980-01-01");
- form.add("salary", "4,500.00");
2. 数据校验
会默认装配一个 LocalValidatorFactoryBean,[email protected],即可让 spring mvc 在完成数据绑定后执行数据校验工作。
1)在 model 设置检验条件
- @Pattern(regexp="w{4,30}")//通过正则校验,匹配4-30个包含数字、字母、下划线的字符
- private String userName;
- @Pattern(regexp="S{6,30}")//通过正则校验,匹配6-30个非空白的字符
- private String password;
- @Length(min=2,max=100)//长度限制在2-100
- private String realName;
- @Past //时间值必须是个过去的时间
- @DateTimeFormat(pattern="yyyy-MM-dd")
- private Date birthday;
- @DecimalMin(value="1000.00")//数据必须在1000.00-100000.00之间
- @DecimalMax(value="100000.00")
- @NumberFormat(pattern="#,###.##")
- private long salary;
2)然后在处理函数中处理
- @RequestMapping(value = "/handle91")
- public String handle91(@Valid @ModelAttribute("user") User user,
- BindingResult bindingResult, ModelMap mm) {
- if (bindingResult.hasErrors()) {
- return "/user/register3";
- } else {
- return "/user/showUser";
- }
- }
在入参对象前添加了 @Valid 注解,同时在其后声明了一个 BindingResult 入参。然后通过 BindingResult 就可以进行判断,处理了。BindingResult 除了 hasErrors() 外还有以下几个接口:getFieldError(String field) 获取属性名对应的校验错误、getFiledErrors() 获取所有属性校验错误、getFiledValue(String field) 获取属性值、getErrorCount() 获取错误数量。
五、视图和视图解析器
请求处理方法执行完成后,最终返回一个 ModelAndView 对象,spring mvc 借助视图解析器得到最终的视图对象 View。视图对象是一个 bean,由视图解析器负责实例化。
在 xml 中配置试图解析器
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
- p:order="100" p:viewClass="org.springframework.web.servlet.view.JstlView"
- p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>
来源: http://www.bubuko.com/infodetail-2113728.html