目录
5.6.3 使用 @ResponseBody 注解将 JavaBean 对象转换成 Json 返回
五、数据相应和结果视图
5.1 开发准备
5.1.1 导入jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cpz</groupId>
<artifactId>springmvc_response</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</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-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
5.1.2 配置 web.xml
<!-- SpringMVC的核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--处理乱码的过滤器-->
<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>
5.1.3 springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1:配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="com.cpz"></context:component-scan>
<!-- 2:配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 3:配置spring开启注解mvc的支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
5.1.4 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>响应测试</h1>
<a href="user/testUserController">测试UserController</a>
<hr/>
</body>
</html>
5.1.5 success.jsp
<body>
<h1>访问成功</h1>
</body>
5.1.6 Controller
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/testUserController")
public String testUserController(){
System.out.println("执行了 UserController 的 testUserController 方法 !!! ");
return "success";
}
}
5.2 返回值为字符串
5.2.1 response.jsp
<body>
<h3>返回字符串</h3>
<a href="user/testReturnString">返回字符串</a><br>
<a href="user/userUpdate">修改用户(表单回显)</a>
</body>
5.2.2 Controller
@RequestMapping(value = "/testReturnString")
public String testReturnString(){
System.out.println("执行了 UserController 的 testReturnString 方法 !!! ");
return "success";
}
@RequestMapping(value = "/testUserUpdate")
public String testUserUpdate(Model model){
System.out.println("执行了 UserController 的 testUserUpdate 方法 !!! ");
// 模拟从数据库中查询的数据,在页面上进行回显
User user = new User();
user.setUsername("张三");
user.setPassword("123456");
user.setAge(22);
model.addAttribute("user",user);
return "update";
}
5.2.3 update.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>修改用户</h3>
<%--${ requestScope }--%>
<form action="${ pageContext.request.contextPath }/user/update" method="post">
<input type="text" name="username" value="${ user.username }"/><br/>
<input type="text" name="password" value="${ user.password }"/><br/>
<input type="text" name="age" value="${ user.age }"/><br/>
<input type="submit" value="提交"/><br/>
</form>
</body>
</html>
5.2.4 点击提交
@RequestMapping(value = "/update")
public String update(User user){
System.out.println("执行了 UserController 的 update 方法 !!! ");
System.out.println(user);
return "success";
}
5.3 返回值为 void
5.3.1 response.jsp
<h3>无返回值void</h3>
<a href="user/testVoid">无返回值</a>
5.3.2 Controller
@RequestMapping(value = "/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("执行了 UserController 的 testVoid 方法 !!! ");
// 可以使用请求转发或者重定向跳转到指定的页面
// 请求转发
// request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
// 重定向
//response.sendRedirect(request.getContextPath()+"/user/testReturnString");
// 如果不指定转发和重定向,直接响应数据
// 直接响应数据
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("你好");
}
【小结】void:执行视图解析器(如果不想通过视图解析器指定页面路径,可以通过自定义转发和重定向完成页面跳转)
5.4 返回值是 ModelAndView 对象
5.4.1 response.jsp
<h3>返回ModelAndView对象</h3>
<a href="user/testModelAndView">ModelAndView</a><br/>
5.4.2 Controller
@RequestMapping(value = "/testModelAndView")
public ModelAndView testModelAndView(){
System.out.println("执行了 UserController 的 testModelAndView 方法 !!! ");
ModelAndView mv = new ModelAndView();
// 默认执行视图解析器,跳转到WEB-INF/pages/success.jsp的页面
mv.setViewName("success");
// 模拟从数据库中查询所有的用户信息
List<User> list = new ArrayList<User>();
User user = new User();
user.setUsername("zhangsan");
user.setAge(22);
User user2 = new User();
user2.setUsername("lisi");
user2.setAge(20);
list.add(user);
list.add(user2);
mv.addObject("list",list);
return mv;
}
5.4.3 导入 jstl 的坐标
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
5.4.4 success.jsp(遍历 list )
<h3>查询所有的数据</h3>
<c:forEach items="${ list }" var="user">
${ user.username } --- ${ user.age }
</c:forEach>
【小结】ModelAndView在企业中应用较多,执行视图解析器(既有模型的功能,也有视图的功能)
5.5 SpringMVC 框架提供的转发和重定向
5.5.1 response.jsp
<h3>转发和重定向</h3>
<a href="user/testForwardOrRedirect">ForwardOrRedirect</a>
5.5.2 forward 请求转发
@RequestMapping(value = "/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("执行了 UserController 的 testForwardOrRedirect 方法 !!! ");
// return "forward:/WEB-INF/pages/success.jsp";
return "forward:/user/testReturnString";
}
5.5.3 redirect 重定向
@RequestMapping(value = "/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("执行了 UserController 的 testForwardOrRedirect 方法 !!! ");
// return "redirect:/WEB-INF/pages/success.jsp"; //不成功!!
return "redirect:/user/testReturnString";
}
5.6 @ResponseBody 响应 json 数据
5.6.1 去掉静态资源的拦截
<!--方案一:-->
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/js/" mapping="/js/**"/>
<!--方案二:-->
<!--去掉所有的静态资源,让DispatchServlet不能拦截静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
5.6.2 使用 @RequestBody 获取请求的数据
response.jsp
<script src="js/jquery.min.js"></script>
<script>
$(function () {
$("#btn").click(function () {
//alert("ok");
$.ajax({
url:"user/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"username":"tom","password":"123","age":"25"}',
dataType:"json",
type:"post",
success:function (data) {
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
})
})
</script>
5.6.3 使用 @ResponseBody 注解将 JavaBean 对象转换成 Json 返回
Controller
@RequestMapping(value = "/testJson")
@ResponseBody
public User testJson(@RequestBody User user){
System.out.println("执行了 UserController 的 testJson 方法 !!! ");
System.out.println(user);
User u = new User();
u.setUsername("张三");
u.setPassword("123456");
u.setAge(30);
return u;
}
5.6.4 Jackson 的 jar 包
json 字符串和 JavaBean 对象相互转换的过程中,需要使用 jackson 的 jar 包
<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-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
5.6.5 小结
@RequestBody的使用(json字符串-->javabean)
@ResponseBody的使用(javabean-->json字符串