04.SpringMVC返回值类型及响应数据类型
1 搭建环境、2 响应之返回值是String类型、3 响应之返回值是void类型、4 响应之返回值是ModelAndView类型
5 响应之使用forward和redirect进行页面跳转、6 响应json数据之过滤静态资源、7 响应json数据之发送ajax的请求
8 响应json数据之响应json格式数据
1 搭建环境
代码:
springmvc_day02_01_response
解决maven项目创建过慢的问题
archetypeCatalog
internal
pom.xml
<?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>cn.bjut</groupId>
<artifactId>springmvc_day02_01_response</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc_day02_01_response Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<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.15.RELEASE</spring.version>
</properties>
<!--Spring 上下文,核心依赖-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring Web 核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring MVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--web-->
<!--支持 Servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--支持 JSP-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--spring mvc-json依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
</dependencies>
<build>
<finalName>springmvc_day02_01_response</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
webapp/WEB-INF/web.xml
配置springMVC前端控制器,配置解决中文乱码的过滤器。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置springMVC前端控制器-->
<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:springmvc.xml</param-value>
</init-param>
<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>
</web-app>
resources\springmvc.xml
开启注解扫描包,视图解析器对象,前端控制器:哪些静态资源不拦截,开启springMVC框架注解支持
<?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">
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.bjut"/>
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--前端控制器,哪些静态资源不拦截-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven />
</beans>
webapp目录下新建 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>重定向</h3>
</body>
</html>
部署tomcat在IDEA中的配置
跳转提示成功的页面
在webapp目录下,新建pages目录(Directory)。然后新建success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h3>执行成功</h3> ${user.username} ${user.password} </body> </html>
2 响应之返回值是String类型
SpringMVC 第二天
第1章 响应数据和结果视图为了后面的测试,使得浏览器能提交不同的请求URL。在webapp目录下,新建一个response.jsp
http://localhost:8080/response.jsp 这个就是每次部署项目后,测试要访问的地址。
response.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery.min.js"></script>
<script>
// 页面加载,绑定单击事件
$(function(){
$("#btn").click(function(){
// alert("hello btn");
// 发送ajax请求
$.ajax({
// 编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hehe","password":"123","age":30}',
dataType:"json",
type:"post",
success:function(data){
// data服务器端响应的json的数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
});
});
</script>
</head>
<body>
<a href="user/testString" >testString</a>
<br/>
<a href="user/testVoid" >testVoid</a>
<br/>
<a href="user/testModelAndView" >testModelAndView</a>
<br/>
<a href="user/testForwardOrRedirect" >testForwardOrRedirect</a>
<br/>
<button id="btn">发送ajax的请求</button>
</body>
</html>
在java目录下,新建一个控制类。
cn.bjut.controller.UserController
@Controller @RequestMapping(value = "/user") public class UserController { @RequestMapping("testString") public String testString(){ System.out.println("testString方法执行了。。。"); return "success"; } }
如果:返回字符串,就会根据视图解析器去WEB-INF里面的目录下索引“字符串名称.jsp”页面。
在java目录下,新建一个实体类。
cn.bjut.domain.User
package cn.bjut.domain; import java.io.Serializable; public class User implements Serializable{ private String username; private String password; private Integer age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
在后面的控制类的方法里面,模拟查询到数据库对象。JSP通过EL表达式,获取到需要的数据。
在java目录下,修改那个控制类。
cn.bjut.controller.UserController
package cn.bjut.controller;
import cn.bjut.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "/user")
public class UserController {
/**
* 返回String
* @param model
* @return
*/
@RequestMapping("testString")
public String testString(Model model){
System.out.println("testString方法执行了。。。");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("华佗");
user.setPassword("123");
user.setAge(80);
// model对象
model.addAttribute("user",user);
return "success";
}
}
3 响应之返回值是void类型
在java目录下,在那个控制类新添加如下代码。
cn.bjut.controller.UserController
/**
* 是void
* 请求转发一次请求,不用编写项目的名称
*/
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoid方法执行了。。。");
// 编写请求转发的程序
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
// 重定向
// response.sendRedirect(request.getContextPath()+"/index.jsp");
// 设置中文,防止乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 直接会进行响应
// response.getWriter().print("你好");
return;
}
4 响应之返回值是ModelAndView类型
在java目录下,在那个控制类新添加如下代码。
cn.bjut.controller.UserController
/**
* 返回ModelAndView
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
// 创建ModelAndView对象
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了...");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("特斯拉");
user.setPassword("456");
user.setAge(30);
// 把user对象存储到mv对象中,也会把user对象存入到request对象
mv.addObject("user",user);
// 跳转到哪个页面(springmvc.xml里配置的视图解析器对象的目录)
mv.setViewName("success");
return mv;
}
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
该对象中有两个方法:
5 响应之使用forward和redirect进行页面跳转
1.2转发和重定向
1.2.1 forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:
/** * 转发 * @return */ @RequestMapping("/testForward") public String testForward() { System.out.println("AccountController 的 testForward 方法执行了。。。。 "); return "forward:/WEB-INF/pages/success.jsp"; }
需要注意的是,如果用了 forward: 则路径必须写成实际视图 url,不能写逻辑视图。
它相当于“ request.getRequestDispatcher("url").forward(request,response)” 。
1.2.2 redirect 重定向
contrller 方法提供了一个 String 类型返回值之后, 它需要在返回值里使用: redirect:
/** * 重定向 * @return */ @RequestMapping("/testRedirect") public String testRedirect() { System.out.println("AccountController 的 testRedirect 方法执行了。。。。 "); return "redirect:testReturnModelAndView"; }
它相当于“response.sendRedirect(url)” 。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面
不能写在 WEB-INF 目录中,否则无法找到。
在java目录下,在那个控制类新添加如下代码。
cn.bjut.controller.UserController
/**
* 使用关键字的方式进行转发或者重定向
* @return
*/
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法执行了...");
// 请求的转发
// return "forward:/WEB-INF/pages/success.jsp";
// 重定向
return "redirect:/index.jsp";
}
6 响应json数据之过滤静态资源
json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.9</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.9</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.9</version> </dependency>
@ResponseBody响应json数据
1. DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而
不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置。location元素表示webapp目录下的包下的所有文件
<!-- 设置前端控制器,哪些静态资源不被拦截 --> <mvc:resources location="/css/" mapping="/css/**"/><!-- 样式 --> <mvc:resources location="/images/" mapping="/images/**"/><!-- 图片 --> <mvc:resources location="/js/" mapping="/js/**"/><!-- javascript -->
2. 使用@RequestBody获取请求体数据
在webapp目录下新建一个Directory目录,名称为js
把 jquery-1.11.0.min.js 复制copy到js目录里面
然后把下面的语句粘贴到 webapp/response.jsp 的<head>标签体 里面。
<script src="js/jquery-1.11.0.min.js"></script>
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
alert("hello btn");
});
});
</script>
7 响应json数据之发送ajax的请求
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
//alert("hello btn");
// 发送ajax请求
$.ajax({
// 编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"kangmianfeng","password":"root","age":25}',
dataType:"json",
type:"post",
success:function(data){
// data服务器端响应的json的数据,进行解析
//alert(data);
//alert(data.username);
//alert(data.password);
//alert(data.age);
}
});
});
});
</script>
在java目录下,在之前的控制类新添加如下代码。
cn.bjut.controller.UserController
/**
* 模拟异步请求响应
*/
@RequestMapping("/testAjax")
public void testAjax(@RequestBody String body){
System.out.println("testAjax方法执行了...");
System.out.println(body);
}
8 响应json数据之响应json格式数据
cn.bjut.controller.UserController
/**
* 模拟异步AJAX请求的响应
*/
@RequestMapping("/testAjax")
public @ResponseBody User testAjax2(@RequestBody User user){
System.out.println("testAjax2方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟查询数据库
user.setUsername("haha");
user.setAge(20);
// 做响应
return user;
}
===================
end