SpringMVC day02笔记
课前事项
[了解]今日课程内容
SpringMVC中Controller方法(Handler方法)返回值类型【掌握】
ModelAndView……
@ModelAttribute和@SessionAttributes【了解】
SpringMVC对Restful风格url的支持【掌握】
于我们而言,就是传参风格的一种变化
JSON数据交互【掌握】
SpringMVC的文件上传【应用】
方式一:上传到本地服务器
方式二:跨服务器上传
SpringMVC的异常处理【应用】
SpringMVC的全局异常处理机制
[掌握]Controller方法(Handler)的返回值
返回ModelAndView
返回字符串(直接返回逻辑视图名字符串,数据使用Model或者ModelMap封装)
ModelAndView = model + view(逻辑视图名)
/**Controller方法返回String使用Model
/**Controller方法返回String使用ModelMap
返回void(了解)
直接使用HttpServletRequest对象转发请求
直接使用HttpServletResponse对象重定向请求
直接使用HttpServletResponse输出结果
/**Controller方法返回void
/**Controller方法返回void
/**Controller方法返回void
转发和重定向(返回字符串形式)
/**Controller方法返回void
/**Controller方法返回void
[应用]@ModelAttribute@SessionAttributes
@ModelAttribute
场景有限
@SessionAttributes
/**
@RequestMapping(“getSessionValue”)
public String getSessionValue(ModelMap model) {
model.addAttribute(“nowDate”,new Date() + “—>>>从session取出数据:” + model.get(“field1”));
return “result”;
}
/*
SessionStatus提供setComplete方法用于清空session中通过@SessionAttributes
共享的数据
*/
@RequestMapping(“clearSession”)
public String clearSession(Model model,SessionStatus sessionStatus) {
sessionStatus.setComplete();
model.addAttribute(“nowDate”,new Date() + “—>>>清空@SessionAttributes共享的数据”);
return “result”;
}
[应用]SpringMVC对Restful风格URL的支持
直观而言,是传参风格的一种变化,原来参数跟在?后面,现在参数在url路径中
什么是RESTful?
RESTful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种url设计风格。基于这个风格设计的软件可以更简洁,更有层次。
资源:互联网所有的事物都可以被抽象为资源 url(只要互联网上的事物可以用一个url来表示,那么它就是一个资源)
资源操作:使用POST、DELETE、PUT、GET不同方法对同一资源(同一url)进行操作。
分别对应 添加、 删除、修改、查询
Http主要的请求方式
get 主要是想做select
post 主要是想做insert
put 主要是想做update
delete 主要是想做delete
以上是http协议的标准请求方式,当然你用post请求也完全可以完成crud操作(因为归根结底无非就是把参数传递到后台对应处理即可)
传统方式操作资源
操作啥 (原来url)?操作谁(传入的参数)
url中先定义动作,然后传递的参数表明这个动作操作的是哪个对象(数据)
先定位动作,然后定位对象
http://localhost:8080/springmvc02/user/queryUserById.action?id=1 查询
http://localhost:8080/springmvc02/ user /saveUser.action 新增
http://localhost:8080/springmvc02/ user /updateUser.action 更新
http://localhost:8080/springmvc02/ user /deleteUserById.action?id=1 删除
使用RESTful操作资源
先定义对象
http://localhost:8080/springmvc02/user/1操作的对象) 查询,GET
http://localhost:8080/springmvc02/ user 新增,POST
http://localhost:8080/springmvc02/ user 更新,PUT
http://localhost:8080/springmvc02/ user /1 删除,DELETE
HiddentHttpMethodFilter过滤器
作用:由于浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0之后添加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持 GET、POST、PUT 与DELETE 请求。
第一步:在web.xml中配置该过滤器
第二步:请求方式必须使用post请求
第三步:增加请求参数_method,该参数的取值就是我们需要的请求方式
测试用例Use_case11:SpringMVC对Restful风格url的支持
<%-- 点击测试--%> rest_get测试第四步:后台接收
@RequestMapping(value = “{id}”,method = RequestMethod.GET)
public String queryUserById1(@PathVariable(“id”) Integer id, Model model) {
System.out.println("======查询:" + id);
model.addAttribute(“nowDate”,new Date());
return “redirect:/default/gotoResult.action”;
}
@RequestMapping(value = “{id}”,method = RequestMethod.DELETE)
public String queryUserById2(@PathVariable(“id”) Integer id,Model model) {
System.out.println("======删除:" + id);
model.addAttribute(“nowDate”,new Date());
return “redirect:/default/gotoResult.action”;
}
@RequestMapping(value = “”,method = RequestMethod.POST)
public String queryUserById3(User user,Model model) {
System.out.println("======新增:" + user);
model.addAttribute(“nowDate”,new Date());
return “redirect:/default/gotoResult.action”;
}
@RequestMapping(value = “”,method = RequestMethod.PUT)
public String queryUserById4(User user,Model model) {
System.out.println("======更新:" + user);
model.addAttribute(“nowDate”,new Date());
return “redirect:/default/gotoResult.action”;
}
[应用]Json数据交互
Json数据是咱们企业级开发数据交互经常使用的一种方式,它比较轻量级,格式比较清晰(系统间接口调用/前后端调用,json数据格式都广为使用)
Json数据交互:前端传递json字符串到后台,后台如何能够自动转换为pojo对象;后台return 对象,能否前端直接接收到json格式的字符串
@RequestBody注解
作用:用于获取请求体(按照http协议进行一个完整的封装,往往都是由请求头+请求体等组成)内容,不适用于Get请求方式,只能使用post请求方式
更多的是用于将JSON字符串转换为POJO对象
引入json相关jar坐标
com.fasterxml.jackson.core
jackson-core
2.9.0
com.fasterxml.jackson.core
jackson-databind
2.9.0
com.fasterxml.jackson.core
jackson-annotations
2.9.0
前端ajax传递json字符串(post)到后台,后台直接接收为对象
@ResponseBody注解
作用:该注解用于将Controller的方法返回的对象转换为json字符串返回给客户端
代码
@RequestMapping(“sendJsonStr”)
public @ResponseBody User sendJsonStr(@RequestBody User user) {
user.setAddress(“上海”);
System.out.println("-------------->>>>sendJsonStr:" + user);
return user;
}
$(function () {
$("#ajaxBtn").bind(“click”,function () {
KaTeX parse error: Expected '}', got 'EOF' at end of input: … url:"{pageContext.request.contextPath}/user/sendJsonStr.action",
type:“post”,
data:’{“id”:1,“username”:“zhangsan”}’,
contentType:“application/json;charset=utf-8”,
dataType:“json”,
success:function (data) {
alert(data);
alert(data.address);
console.log(data);
}
})
})
})
[应用]SpringMVC实现文件上传
前提条件
引入坐标
commons-fileupload
commons-fileupload
1.3.1
编写Handler
@RequestMapping(“testUploadFile”)
public String testUploadFile(MultipartFile uploadFile, HttpServletRequest request) throws IOException {
// 文件原名,如xxx.jpg
String originalFilename = uploadFile.getOriginalFilename();
// 获取文件的扩展名,如jpg
String extendName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length());
String uuid = UUID.randomUUID().toString();
// 新的文件名字
String newName = uuid + “.” + extendName;
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
// 解决文件夹存放文件数量限制,按日期存放
String datePath = new SimpleDateFormat(“yyyy-MM-dd”).format(new Date());
File floder = new File(realPath + “/” + datePath);
if(!floder.exists()) {
floder.mkdirs();
}
uploadFile.transferTo(new File(floder,newName));
return “success”;
}
配置文件上传解析器
在文件服务器的tomcat配置中加入,允许读写操作
119行
主应用引入jar坐标
com.sun.jersey
jersey-core
1.18.1
com.sun.jersey
jersey-client
1.18.1
Handler处理程序
@RequestMapping(“testUploadFileRemote”)
public String testUploadFileRemote(MultipartFile uploadFile, HttpServletRequest request) throws IOException {
// 文件原名,如xxx.jpg
String originalFilename = uploadFile.getOriginalFilename();
// 获取文件的扩展名,如jpg
String extendName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length());
String uuid = UUID.randomUUID().toString();
// 新的文件名字
String newName = uuid + “.” + extendName;
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
// 解决文件夹存放文件数量限制,按日期存放
String datePath = new SimpleDateFormat(“yyyy-MM-dd”).format(new Date());
File floder = new File(realPath + “/” + datePath);
if(!floder.exists()) {
floder.mkdirs();
}
Client client = Client.create();
String baseUrl = "http://localhost:8081/fileserver/uploads/";
WebResource webResource = client.resource(baseUrl+newName);
String result = webResource.put(String.class,uploadFile.getBytes());
System.out.println(result);
return "success";
}
注意:文件上传解析器仍然需要配置
[理解]SpringMVC中的异常处理
Controller—>Service—>Dao层,异常统一向上抛出,可以自定义全局异常处理器统一处理异常
异常类型:编译异常、运行时异常;运行时异常、预期异常(自定义异常)
自定义异常
package com.itheima.springmvc.exception;
public class MyException extends Exception {
private String message;
public MyException(String message) {
this.message = message;
}
@Override
public String getMessage() {
return message;
}
}
自定义异常处理器
package com.itheima.springmvc.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
String message = null;
if(ex instanceof MyException) {
// 自定义异常
message = ex.getMessage();
}else {
// 运行时异常
message = "系统出现未知异常,请联系管理员";
}
// 跳转到一个友好的提示页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception",message);
modelAndView.setViewName("exception");
return modelAndView;
}
}
注册自定义异常处理器
作业
“应用”的部分练习一遍,用的时候知道从哪里找就可以
“掌握”的部分好好练习包括Json数据交互