一、数据响应
1. 页面跳转
代码语言:javascript
复制① 返回字符串
@RequestMapping(value = "/find")
public String find(){
return "success";
}
# 注意
- 返回的字符串将被视图解析器解析
- 返回值省略了 forward:转发 【 redirect: 重定向 [ 不经过视图解析器 ] 】
- 需要配置视图解析器前后缀 // 自动拼接为 /WEB-INf/success.jsp ---> forward:/WEB-INf/success.jsp
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
② ModelAndView
【形式1】
//自己创建 ModelAndView
@RequestMapping("/find")
public ModelAndView find(){
//创建 ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
//设置视图名称
modelAndView.setViewName("success");
//设置数据
modelAndView.addObject("key", "SDFH-25S4-F56S-G2DF");
modelAndView.addObject("username", "Demo_Null");
//返回 ModelAndView
return modelAndView;
}
【形式2】
//将 ModelAndView 交给调用者创建,即 MVC
@RequestMapping("/find")
public ModelAndView find(ModelAndView modelAndView){
//设置视图名称
modelAndView.setViewName("success");
//设置数据
modelAndView.addObject("key", "SDFH-25S4-F56S-G2DF");
modelAndView.addObject("username", "Demo_Null");
//返回 ModelAndView
return modelAndView;
}
【形式3】
//创建 Model 直接返回 String
@RequestMapping("/find")
public String find(Model model){
//设置数据
modelAndView.addAttribute("key", "SDFH-25S4-F56S-G2DF");
modelAndView.addAttribute("username", "Demo_Null");
//返回 视图名称
return "success";
}
2. 写回数据
代码语言:javascript
复制① 直接写回字符串
@RequestMapping(value = "/find")
public void find(HttpServletResponse response) throws IOException {
//原始方法写回
response.getWriter().write("Hello");
}
# 注意
- HttpServletResponse response、HttpServletRequest request、HttpSession session等作为形参,MVC自动创建对象
- ServletContext context 不能作为形参,全局只能存在一个 ServletContext 域
② 直接写回 json 字符串
- 导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
------------------------------------------------------------------------
- 配置处理器映射器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</list>
</property>
</bean>
- 开启 MVC 注解驱动
<!-- 相当于处理器映射器 处理器适配器 -->
<mvc:annotation-driven />
------------------------------------------------------------------------
- 直接返回对象 底层将其转为 json
@RequestMapping("/find")
@ResponseBody
public User find(){
User user = new User();
user.setId(1);
user.setUsername("Demo_Null");
user.setPassword("111111111");
return user;
}
# 注意
@ResponseBody 标注该返回值为字符串而不是视图名称
二、请求数据
1. 获取请求参数
代码语言:javascript
复制① 简单数据类型
@RequestMapping(value = "/find")
@ResponseBody
public void find(String username, int id){
System.out.println(username "---" id)
}
# 注意
- 形参名称与前台出入参数名称一致时会自动封装
- 前台传入参数皆为字符串,底层将其转换为需要的数据类型
- 返回值为空时,若不加 @ResponseBody 注解,则会默认返回 该方法的路径
② POJO类型
@RequestMapping(value = "/find")
@ResponseBody
public void find(User user){
System.out.println(user)
}
# 注意
- 前台传入参数名称与类属性名称一致时会自动封装
③ 数组类型
@RequestMapping(value = "/find")
@ResponseBody
public void find(String[] str){
System.out.println(user)
}
# 注意
- 前台传入多个相同名称的参数会自动封装值后台同名称的数组中
④ 集合
【方法1】
//创建 VO 类,提供 set/get方法
import java.util.List;
public class VO {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "VO{"
"userList=" userList
'}';
}
}
//将 VO 作为形参
@RequestMapping("/find3")
@ResponseBody
public void find3(VO vo){
System.out.println(vo);
}
------------------------------------------------------------------
【方法2】
@RequestMapping("/find")
@ResponseBody
public void find(@RequestBody List<User> userList){
System.out.println(userList);
}
# 使用此种方式必须满足 使用 Ajax 请求 , contentType为 json格式
⑤ RequestBody 与 ResponseBody
- @RequestBody注解 可以将请求体中的参数,发送到服务器的json格式数据封装到参数中
* 接收参数: json转对象 ---> 用于post请求! (get没有请求体)
- @ResponseBody注解 可以将方法返回的对象转化为json格式数据响应给客户端
* 响应时: 对象转json
⑥ @RequestParam 参数绑定注解
- value:与请求参数名称
- required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
@RequestMapping("/find")
@ResponseBody
public void find(@RequestParam(value = "name", required = false, defaultValue = "china") String username){
System.out.println(username);
}
2. 获取请求头信息
代码语言:javascript
复制① @RequestHeader
- value:请求头的名称
- required:是否必须携带此请求头
@RequestMapping("/find")
@ResponseBody
public void find(@RequestHeader(value = "Use-Agent", required = false) String user_agent){
System.out.println(userList);
}
② @CookieValue
- value:指定cookie的名称
- required:是否必须携带此cookie
@RequestMapping("/find")
@ResponseBody
public void find(@RequestHeader(value = "JESSIONID", required = false) String jessionid){
System.out.println(jessionid);
}
三、其他配置
1. 开启静态资源访问
代码语言:javascript
复制<mvc:resources mapping="/js/**" location="/js/" />
或
<mvc:default-servlet-handler /> 开启资源请求未找到时将分配权交给服务器
2. 请求中文乱码
代码语言:javascript
复制<!--配置全局过滤的filter-->
<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>
# 不能解决响应乱码问题
3. 自定义类型转换器
代码语言:javascript
复制① 步骤
- 自定义 转换类 实现 Converter<带转换类型,目标类型> 接口
- 声明类型转换器
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="自定义转换类全限定名" />
</list>
</property>
</bean>
- 将转换器配置到注解驱动
<mvc:annotation-driven conversion-service="conversionService" />
② 注意
- 一般用于日期格式