1.响应数据和结果视图
1.返回值分类
字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
void
当返回值为void时,会去请求当前访问路径的一个jsp页面
解决办法
1. 使用 request 转向页面
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("返回值为void的方法");
//编写请求转发的程序
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,
response);
//保障后面不在有其他代码执行
return;
}
2. 也可以通过 response 页面重定向
@RequestMapping("/testVoid")
public void testVoid(HttpServletResponse response) throws Exception {
// 重定向
response.sendRedirect("testReturnString");
return;
}
如果没有这么一个字符串路径方法这么办呢?
response.sendRedirect(request.getContextPath()+"/index.jsp");
这一串代码也是可以的,不需要RequestMapping注解的下的字符串
3. 也可以通过 response 指定响应结果
@RequestMapping("/testVoid")
public void testVoid(HttpServletResponse response) throws Exception {
// 设置中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 直接会进行响应
response.getWriter().print("你好");
return;
}
测试结果
直接就把数据输出到一个HTML页面
ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
public ModelAndView addObject(String attributeName, Object attributeValue)
:
该方法,是往前面的Model接口中存数据
例如mv.addObject("username", "张三");
public void setViewName(@Nullable String viewName
)
该方法是通过输入的字符串和视图解析器相结合,跳转到指定网页
例如mv.setViewName("success");
代码示例
/**
* 返回 ModeAndView
* @return
*/
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
ModelAndView mv = new ModelAndView();
mv.addObject("username", "张三");
mv.setViewName("success");
return mv;
}
其实前面的返回字符串底层也是用的这个方法
2.转发和重定向
1.forward 转发
/**
* 转发
* @return
*/
@RequestMapping("/testForward")
public String testForward() {
System.out.println("testForward 方法执行了。。。。");
return "forward:/WEB-INF/pages/success.jsp";
}
需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。
它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
2.Redirect 重定向
/**
* 重定向到testReturnString
* @return
*/
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("AccountController 的 testRedirect 方法执行了。。。。");
return "redirect:testReturnString";
}
@RequestMapping("/testReturnString")
public String testReturnString() {
System.out.println("testReturnString方法执行了。。。。");
return "success";
}
它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
3.ResponseBody响应json数据
@ResponseBody注解
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端
需求:使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。
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:"jc/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"name":"hehe","id":"123","money":30}',
dataType:"json",
type:"post",
success:function(data){
// data服务器端响应的json的数据,进行解析
alert(data);
alert(data.name);
alert(data.id);
alert(data.money);
}
});
});
});
</script>
</head>
<body>
<button id="btn">发送ajax的请求</button>
</body>
</html>
控制器代码
@Controller
@RequestMapping("/jc")
public class JsonController {
/**
* 模拟异步请求响应
*/
@RequestMapping("/testAjax")
public @ResponseBody Account testAjax(@RequestBody Account user){
System.out.println("testAjax方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟查询数据库
user.setName("haha");
user.setId(22);
// 做响应
return user;
}
}
网页显示结果
控制台输入结果
代码分析
2.SpringMVC实现文件上传
1.传统的javaweb方式实现文件上传
导入文件上传的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>
jsp页面表单
<h3>文件上传</h3>
<form action="Rq/fileUpload1" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="uploadsss"/><br/>
<input type="submit" value="上传文件"/>
</form>
表单分析
控制器代码
@RequestMapping("/fileUpload1")
public String fileupload(HttpServletRequest request) throws Exception {
/**解决文件上传到什么路径**/
// 先获取到要上传的文件目录
String path = request.getSession().getServletContext().getRealPath("/uploads");
// 创建File对象,一会向该路径下上传文件
File file = new File(path);
// 判断路径是否存在,如果不存在,创建该路径
if (!file.exists()) {
file.mkdirs();
}
/**解决如何解析request请求问题**/
// 创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 解析request对象
List<FileItem> list = fileUpload.parseRequest(request);
// 遍历
for (FileItem fileItem : list) {
// 判断文件项是普通字段,还是上传的文件
if (fileItem.isFormField()) {
//普通字段什么都不做
} else {
// 上传文件项
// 获取到上传文件的名称
String filename = fileItem.getName();
// 上传文件
fileItem.write(new File(file, filename));
// 删除临时文件
fileItem.delete();
}
}
System.out.println("上传成功");
return "success";
}
代码分析
2.SpringMVC传统方式文件上传
1.SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同。
既
jsp页面
<h3