Spring MVC原理图
Spring MVC项目依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
</dependencies>
Spring MVC的xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd" >
<!--配置组件扫描 -->
<context:component-scan base-package="com.jt"/>
<!—启用MVC默认配置 (@RequestMapping) -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</beans>
Spring MVC的前端控制器
在web.xml里面配置DispatcherServlet对象
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-configs.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Spring MVC的后端控制器Controller
- @Controller注解:将类交给Spring MVC处理。
- @RequestMapping注解:定义url到Controller具体方法的映射,即地址栏通过该注解获得访问Controller里面的某一个方法的路径。
- @ResponseBody注解:是将方法的返回值当做字符串,直接输出到页面。而@RequestMapping注解是将方法返回值与Spring MVC配置文件中的视图解析器的前缀和后缀路径相结合,进行跳转。
- @PathVariable注解:用来修饰方法参数,通过此注解可以获得Rest风格url映射里面url中{}表达式的值
- @RequestParam注解:用来描述方法参数,适用于请求方式传递参数的名称中含有特殊字符等不是标示符或者定义新的参数名的情况下。
- @DateTimeFormat注解:指定服务端处理的日期格式。
- @RequestParam注解:用于声明map集合是用来封装请求参数的。
- @RequestHeader注解:获取请求头中的Accept属性的值,然后用参数进行接收。
- @CookieValue注解:从cookie里面取值,方法参数名要与cookie对象中的key值相同。
Spring MVC请求处理
请求路径映射
1.普通url映射
单个路径:@RequestMapping({“路径”)
多个路径:@RequestMapping(value={"/do",“user/doSay”})
2.Rest风格url映射
Rest(Representational State Transfer):表述性状态传递。是一种软件架构编码风格,是基于网络应用进行设计和开发的编码方式。可以降低开发的复杂度,提高程序的可伸缩性。
用法:@RequestMapping("{XXX}"),XXX为变量名。
两种方法获得变量XXX的值:1)在方法中的参数写@PathVariable(“XXX”) 参数类型 a。这种写法XXX变量名和a的变量名可以不一样。2)在方法中的参数写@PathVariable 参数类型 XXX。这种写法XXX变量名必须和url中变量的值一致。
请求方式映射
1.请求方式限定
@RequestMapping(value=”hello”,method=RequestMethod.POST):value表示请求的url,method表示请求的方式为post。
@GetMapping(“hello”):定义映射只能处理get请求
@PostMapping(“hello”):定义映射只能处理post请求
2.请求方式组合
@RequestMapping(value=”hello”,method=RequestMethod.POST,RequestMethod.GET)
可以用get方式,也可以用post方式。
请求参数映射
1.标准Servlet API
@RequestMapping(value="withRequest",method=RequestMethod.GET)
@ResponseBody
public String withRequest(HttpServletRequest request){
<!--通过Servlet用的request方法来获取参数数据 -->
System.out.println(request.getRequestURI());
return "Obtainer 'foo' query parameter value '"+request.getParameter("gid")+"'";
}
2.直接量对象
- 直接量:直接通过变量来接收请求参数的值。
- 直接量对象中的方法参数名必须与请求路径传递的参数名称一致。方法类型采用包装类,避免出现使用int类型而请求时没有传参报错的情况,使用包装类,没有传递参数的话,默认为null。
- 请求参数中如果带有特殊符号的情况下,使用@RequestParam(“xxx-xxx”)来获取参数值,然后赋值给方法中的参数。如果没有传递参数,而又设置了@RequestParam的情况下,在注解里面设置required属性为FALSE,就会避免出现错误。
@RequestMapping(value="withStringParam", method=RequestMethod.GET)
@ResponseBody
public String withStringParam(
@RequestParam(value="param-01",required=false) String foo) {
return "Obtained 'foo' query parameter value '" + foo + "'";
}
- 使用Date类型变量接受日期参数的值
- Spring MVC默认支持yyyy/MM/dd格式的日期,如果日期格式不匹配会报400异常
@RequestMapping(value="withDateParam")
@ResponseBody
public String withDateParam(Date birthday) {
return "Obtained date parameter value '" + birthday + "'";
}
- 用@DateTimeFormat设置接收的日期格式
@RequestMapping("doParam04")
@ResponseBody
public String doParam04(@DateTimeFormat(pattern="yyyy-MM-dd") Date date){
return "param date's value is " + date;
}
3.可变参数
- 使用可变参数(特殊数组必须写三个点)接收客户端请求参数数据
- 客户端传参时,参数之间用英文逗号隔开
@RequestMapping("doParam05")
@ResponseBody
public String doParam05(Integer... ids){
return "param date's value is " + Arrays.toString(ids);
}
4.Java Bean对象
使用pojo对象(普通的java对象)封装请求参数数据时,请求参数中的参数名要与pojo对象中的setXxx方法的Xxx有对应关系,参数名中的首字母不区分大小写,后面的区分大小写。
@RequestMapping("doParam06")
@ResponseBody
public String doParam06(Message msg){
return msg.toString();
}
5.集合Map对象
通过集合map接收页面参数时,Spring MVC默认map是用来封装响应数据的,因此如果封装请求数据,则需要用@RequestParam注解对map进行修饰。
@RequestMapping("doParam07")
@ResponseBody
public String doParam07(@RequestParam Map<String, Object> map){
return map.toString();
}
Spring MVC响应处理
响应数据封装
Servlet API对象
将请求数据直接封装到Request对象
@RequestMapping("doResponse01")
public String doResponse01(HttpServletRequest request) {
request.setAttribute("data", "hello..");
return "response";
}
在response.jsp页面直接使用EL表达式${data}方式获取数据
当方法中直接返回一个页面时,默认执行的是请求转发,假如需要实现重定向,可以在返回的地址后添加redirect重定向,格式为redirect:路径。
@RequestMapping("doResponse02")
public String doResponse02(HttpServletRequest request) {
request.setAttribute("data", "hello..");
return "redirect:responseUI.do";
}
Model And View对象
直接使用ModelAndView对象封装响应数据
@RequestMapping("doModelAndView")
public ModelAndView doModelAndView(ModelAndView mv) {
//ModelAndView mv=new ModelAndView();
<!-- ModelAndView对象由Spring创建,可以将数据存储到ModelAndView对象的ModelMap类型的属性中 -->
mv.addObject("data", "model and view");
mv.setViewName("response");//view
return mv;
}
Model对象
//将ModelAndView分为Model和view
@RequestMapping("doSayWelcome")
public String doSayWelcome(Model model){
//数据会默认存储到请求作用域范围
model.addAttribute("msg", "welcome");
//View,返回/xxx/hello.xxx(jsp)
return "hello";
}
响应数据转换成JSON
JSON概述
JSON(Javascript Object Notation):一种轻量级数据交换格式,通常作为客户端与服务端进行数据交互的一种标准。
客户端访问服务端时,服务器从数据库取出数据进行封装,然后再将对象转换为json串,通过网络传输到客户端。
Spring集成Jackson库
配置文件添加Jackson依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
将Map对象内容转换成字符串(Spring底层直接访问Jackson API将对象转换为字符串)
@RequestMapping("doRespJSON02")
@ResponseBody
public Map<String, Object> doRespJSON02(){
Map<String, Object> map=new HashMap<>();
map.put("id", 10);
map.put("name", "tmooc");
return map;
}
将JavaBean对象转换为JSON串
@RequestMapping("doRespJSON04")
@ResponseBody
public Message doRespJSON04(){
Message msg=new Message();
msg.setId(1000);
msg.setTitle("tedu");
return msg;
}
将Java List集合转换为JSON串
@RequestMapping("doRespJSON04")
@ResponseBody
public List<Message> doRespJSON04(){
List<Message> list=new ArrayList<>();
Message msg=new Message();
msg.setId(1000);
msg.setTitle("tedu");
list.add(msg);
msg=new Message();
msg.setId(520);
msg.setTitle("love");
list.add(msg);
return list;
}
Spring 集成FastJSON库
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
Spring配置文件中配置FastJSON为默认JSON转换器
<mvc:annotation-driven>
<!-- 设置fastjson的转换器对象 -->
<mvc:message-converters register-defaults="true">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
<value>application/json;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
实例
@RequestMapping("doRespJSON01")
@ResponseBody
public Map<String,Object> doRespJSON01(){
Map<String,Object> map=
new HashMap<String, Object>();
map.put("id", 100);
map.put("name","tmooc");
return map;
}