响应数据
响应方式:页面跳转、回写数据
-
页面跳转
-
直接返回字符串: 返回字符串和视图解析器的前后缀拼接后跳转
@RequestMapping("/test1") public String save(){ return "index.jsp"; }
-
通过ModelAndView对象返回(两种实现方式)
@RequestMapping("/test1") public ModelAndView save1(){ /* Model模型:封装数据 View视图:展示数据 */ ModelAndView modelAndView = new ModelAndView(); // 设置模型数据 modelAndView.addObject("username", "Tom"); // 设置视图页面 modelAndView.setViewName("index.jsp") return modelAndView; } // 推荐方式,写到参数中,spring框架会识别 @RequestMapping("/test2") public ModelAndView save2(ModelAndView modelAndView){ // 设置模型数据 modelAndView.addObject("username", "Tom"); // 设置视图页面 modelAndView.setViewName("index.jsp") return modelAndView; }
-
-
回写数据
-
直接返回字符串(web基础阶段,使用的是
resp.getWriter().print("hello world")
)- 加注解
@ResponseBody
@RequestMapping("/test3") public void save3(HttpServletResponse resp){ resp.getWriter().print("hello world"); } // 推荐方式, 加注解 @RequestMapping("/test4") @ResponseBody public String save4(){ return "hello world"; }
- 加注解
-
返回对象和集合(json数据)
@RequestMapping("/test5") @ResponseBody public String save5(){ User user = new User(); user.setUsername("Tom"); // json转换工具 (导入坐标) OjbectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); return json; } // 推荐方式:springMVC自动转换成json格式(需要配置spring-mvc.xml) @RequestMapping("/test6") @ResponseBody public User save6(){ User user = new User(); user.setUsername("Tom"); return user; } // 配置文件:注解驱动,底层配置对象和json数据转换 // 注意,需要添加mvc命名空间 <mvc:annotation-driven/>
-
请求数据
客户端请求参数的格式是:name=value&name=value...
服务器会自动封装数据,SpringMVC可以接收如下类型的参数:
- 基本类型
- POJO类型(简单JavaBean)
- 数组
- 集合
基本类型
访问地址栏参数和定义业务处理函数的参数一致即可
@RequestMapping("/test")
@ResponseBody
public void save(String username) {
System.out.println(username);
}
POJO
SpringMVC会自动把请求数据封装到类,直接使用即可
@RequestMapping("/test")
@ResponseBody
public void save(User user) {
System.out.println(user.getName());
}
数组
客户端请求数据如果为数组,格式为:xx=1&xx=2&xx=3...
@RequestMapping("/test")
@ResponseBody
public void save(String[] arr) {
System.out.println(Arrays.asList(arr));
}
集合
获取集合时,要将集合封装到一个POJO中(JavaBean中)。
class VO{
private List<User> userList;
public void setUserList(){}
public List<User> getUserList(){}
public void toString(){}
}
@RequestMapping("/test")
@ResponseBody
public void save(VO vo) {
System.out.println(vo);
}
如果使用ajax提交数据,指定json提交数据格式。那么就就可以直接接受集合数据。(使用js时,需要指定静态资源,下面再讲)
@RequestMapping("/test")
@ResponseBody
public void save(@RequestBody List<User> userList) {
System.out.println(userList);
}
静态资源访问
静态资源访问和@RequestMapping("/xxx")
冲突,需要在web.xml开启静态资源访问。
<!--js文件-->
<mvc:resources mapping="/js/**" location="/js/"/>
<!--img文件-->
<mvc:resources mapping="/img/**" location="/img/"/>
或者使用如下配置,表示如果SpringMVC找不到对应资源,就交给原始容器Tomcat,Tomcat可以找到静态资源。
<mvc:default-servlet-handler>
请求数据乱码
当post请求数据时,数据可能会出现乱码,我们可以在web.xml中设置一个过滤器来进行编码的过滤。
<!-- 过滤器:全局数据的编码设置-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
参数绑定注解
当请求参数和业务处理函数参数命名不一致时,可以使用@RequestParam
,它的参数有:
- value:与请求参数名称相同
- required:是否 必须包含指定参数,默认是
- defaultValue:当没有指定参数时,使用这个默认值
@RequestMapping("/test")
@ResponseBody
public void save(@RequestParam("name") String username) {
System.out.println(username);
}
获取Restful风格的参数
Restful风格是一种架构风格、设计风格,不是标准,是一种设计原则和约束条件。主要用于客户端服务器交互软件,这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
Restful风格的请求是使用"url+请求方式"表示一次请求目的,HTTP协议里面四个表示操作方式的动词如下:
- GET :获取资源
- POST:新建资源
- PUT:更新资源
- DELETE:删除资源
例如 :
- /user/1 GET:获取id=1的user
- /user/1 DELETE:删除id=1的user
在SpringMVC中,获取Restful风格参数就是使用占位符和注解@PathVariable
。
如,获取变量name的值。http://localhost:80/user/zhangsan
@RequestMapping("/user/{name}")
@ResponseBody
public void save(@PathVariable("name") String username) {
System.out.println(username);
}
自定义类型转换器
因为请求的都是字符串,所以SpringMVC提供了一些常用的类型转换器,如字符串转成int。但是还有一些如日期,它的数据格式多样,此时就需要自定义类型转换器。
步骤:
-
定义转换器类实现Converter接口
public class DateConverter implements Converter<String, Date> { @Override public Date convert(String source) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = format.parse(source); return date; } }
-
在sprin-mvc.xml配置文件中声明转换器
<!-- 声明转换器--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="baidu.controller.DateConverter"/> </list> </property> </bean>
-
在sping-mvc.xml配置文件中:使用
<annotation-driven>
引用转换器<!-- mvc的注解驱动--> <mvc:annotation-driven conversion-service="conversionService"/>
获取请求头
@RequestHeader
获取请求头,如:获取请求头并打印。
@RequestMapping("/test")
@ResponseBody
public void save(@RequestHeader(value = "User-Agent", required = false) String user) {
System.out.println(user);
}
直接获取请求头中的Cookie,可以使用@CookieValue
获取指定Cookie的值
@RequestMapping("/test")
@ResponseBody
public void save(@CookieValue(value = "MyCookieId", required = false) String cookie) {
System.out.println(cookie);
}