第一章响应数据和结果视图
1.返回值分类
1.1字符串(String)类型
- User.class
public class User {
private String username;
private String password;
private Integer age;
//getter/setter方法
}
- UserController.class
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 返回值为字符串
* @param model
* @return
*/
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString执行了....");
//模拟从数据库中查询出User对象
User user = new User();
user.setUsername("hk");
user.setPassword("520");
user.setAge(18);
//将数据存入到model对象中
model.addAttribute("user",user);
return "success";
}
}
- response.jsp
<a href="user/testString">testString</a>
- success.jsp
<h3>执行成功</h3>
//从request域中取出数据
${user.username}<br>
${user.password}<br>
-
运行结果
1.2void类型
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 返回值void的
* 请求转发一次请求,不用编写项目的名称
* 重写向是再次请求
* @param
*/
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
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;
}
}
- response.jsp
<a href="user/testVoid">testVoid</a>
- index.jsp
<h1>重写向跳转成功!</h1>
1.3ModelAndView对象
(1)ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
(2)代码实现
- User.class
public class User {
private String username;
private String password;
private Integer age;
//getter/setter方法
}
- UserController.class
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 返回ModelAndView对象
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//创建ModelAndView对象
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了.....");
//模拟从数据库中查询出User对象
User user = new User();
user.setUsername("hkk");
user.setPassword("5201314");
user.setAge(18);
//把user对象存储到mv对象中,也会把user对象存入到request域对象中
mv.addObject("user",user);
//跳转到哪个 页面
mv.setViewName("success");
return mv;
}
}
- response.jsp
<a href="user/testModelAndView">testModelAndView</a>
- success.jsp
<h3>执行成功</h3>
${user.username}<br>
${user.password}<br>
<h2>返回ModelAndView对象</h2>
-
执行结果
2.请求转发和重定向
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 使用关键字的方式进行转发或者重定向
* @param
* @return
*/
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect执行了....");
//转发方式实现页面跳转,相当于request.getRequestDispather("url").forward(request.response)
// return "forward:/index.jsp";
//重定向方式,相当于response.sendRedirect(url)
return "redirect:/index.jsp";
}
}
注意:在重定向时,如果要重定向某个jsp页面,那么这个jsp页面就不能存放到WEB-INF目录下,否则无法找到。
3.ResponseBody响应json数据
作用:
(1)该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。
3.1DispatherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能使用,解决问题就是要配置静态资源不进行拦截,在springmvc.xml文件中配置如下属性:

例如:
我们使用js绑定一个单击事件时,会运行不出结果,因为是被DispatcherServlet给拦截了,所以我们就设置不过滤就可以了:
- response.jsp
<head>
<title>Title</title>
<%--引入资源--%>
<script src="js/jquery-1.11.1.js"></script>
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
alert("hello btn");
});
});
</script>
</head>
<body>
<%-- 模拟异步请求ajax--%>
<button id="btn">发送ajax的请求</button>
</body>
- springmvc.xml
<!-- 前端控制器:哪些静态资源不用拦截-->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images" mapping="/images/**"/>
-
运行结果
3.2RequestBody获取请求体中的json数据
<head>
<title>Title</title>
<%--引入资源--%>
<script src="js/jquery-1.11.1.js"></script>
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
//alert("hello btn");
//发送ajax请求
$.ajax({
//编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hk","password","5201314","age","20"}',
dataType:"json",
type:"post",
success:function (data) {
//data服务器端响应的json的数据,进行解析
}
});
});
});
</script>
</head>
/**
* 获取请求体中的数据
* @param body
*/
@RequestMapping("/testJson")
public void testJson(@RequestBody String body){
System.out.println(body);
}
3.3使用@RequestBody注解把json的字符串转换成JavaBean的对象
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println(user);
}
}
<head>
<title>Title</title>
<%--引入资源--%>
<script src="js/jquery-1.11.1.js"></script>
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
//alert("hello btn");
//发送ajax请求
$.ajax({
//编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hk","password":"5201314","age":"20"}',
dataType:"json",
type:"post",
success:function (data) {
//data服务器端响应的json的数据,进行解析
alert(data);
alert(data.user);
}
});
});
});
</script>
</head>
3.4使用@ResponseBody注解将javaBean对象转换成json字符串,直接响应
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 模拟异步请求响应
*/
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax执行了...");
//客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
//做响应,模拟查询数据库
user.setUsername("hkkk");
user.setAge(18);
//做响应
return user;
}
}
<head>
<title>Title</title>
<%--引入资源--%>
<script src="js/jquery-1.11.1.js"></script>
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
//alert("hello btn");
//发送ajax请求
$.ajax({
//编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hk","password":"5201314","age":"20"}',
dataType:"json",
type:"post",
success:function (data) {
//data服务器端响应的json的数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
});
});
</script>
</head>
6.json字符串和javaBean互转的jackson的jar包
<!--json转换JavaBean-->
<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>
第四章文件上传
- 文件上传的jar包
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
4.1 传统方式实现文件上传
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 文件上传
* @return
*/
@RequestMapping("/fileupload1")
public String fileupload1(HttpServletRequest request) throws Exception {
System.out.println("文件上传.....");
//使用fileupload组件来完成文件上传
//上传文件的位置
String path = request.getSession().getServletContext().getRealPath("/uploads");
//判断该路径是否存在
File file = new File(path);
if (!file.exists()){
//创建该文件夹
file.mkdirs();
}
//解析request对象,获取上传文件项
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//解析request
List<FileItem> items = upload.parseRequest(request);
//遍历
for (FileItem item : items) {
//进行判断,当前item是否为上传文件项
if (item.isFormField()){
//说明普通表单向
}else {
//说明是上传文件项
//获取上传文件的名称
String filename = item.getName();
//把文件的名称设置唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
//完成文件上传
item.write(new File(path,filename));
//删除临时文件
item.delete();
}
}
return "success";
}
}
<%--传统方式上传文件--%>
<form action="user/fileupload1" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/>
<input type="submit" value="上传"/>
</form>
4.2 SpringMVC的文件上传方式
思路:
- springmvc.xml
<!-- 配置文件解析器对象-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
- index.jsp
<%--SpringMVC方式上传文件:注意选择文件中的name要与MultipartFile对象的名称一致--%>
<form action="user/fileupload2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传"/>
</form>
- UserController.class
@Controller
@RequestMapping("/user")
public class UserController {
/**
* SpringMVC文件上传
* @return
*/
@RequestMapping("/fileupload2")
public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
System.out.println("SpringMVC文件上传.....");
//使用fileupload组件来完成文件上传
//上传文件的位置
String path = request.getSession().getServletContext().getRealPath("/uploads");
//判断该路径是否存在
File file = new File(path);
if (!file.exists()){
//创建该文件夹
file.mkdirs();
}
//说明是上传文件项
//获取上传文件的名称
String filename = upload.getOriginalFilename();
//把文件的名称设置唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
//完成文件上传
upload.transferTo(new File(path,filename));
return "success";
}
}
4.3 SpringMVC跨服务器方式的文件上传
分服务器的目的:
应用服务器:负责部署我们的应用
数据库服务器:运行我们的数据库
缓存和消息服务器:负责处理大并发访问的缓存和消息

(1)配置两个服务器,我们用tomcat来模拟
-
图片服务器
-
应用服务器




