1.搭建项目环境
web.xml配置和spring-mvc.xml的配置。同第一天
2.ModelAndView
与Model接口不同的是,这是一个类。
用法:返回一个ModelAndView对象
常用方法:
addObject() 添加对象(键值对)
setViewName 设置响应视图,底层交由spring视图解析器。
@RequestMapping("/testmodel")
public ModelAndView hi(ModelAndView mav){
mav.addObject("message", "ModelAndView组件你好");
mav.setViewName("helloworld");
return mav;
}
3.使用关键字来控制跳转
前面已经学习过Springmvc两种方式跳转,
第一种是有返回值:返回一个字符串通过视图解析器自动转发到对应路径下的页面。
第二种是无返回值时:方法体中声明request和response对象,调用转发和重定向完成操作
第三种就是使用关键字:同样返回一个字符串,
public String helloWorld(){
//特殊语法 forward: 或redirect:
//return "forward:/WEB-INF/jsp/helloworld.jsp";
//注意重定向不能到web-inf目录下,此处不用拼加项目路径,spring底层帮我们加了。
return "redirect:/success.jsp";
}
4.使用ResponseBody响应json数据
4.1 前端控制器DispatcherServlet会默认拦截所有的资源请求,导致静态资源不能被访问到,需要在spring-mvc.xml中添加如下配置
<!--设置静态资源请求不拦截 -->
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
4.2 使用ajax发送请求
ajax发送请求的属性格式是json格式的字符串。
$(function(){
$("#btn").click(function(){
//alert("hello guy!");
//发送ajax请求数据
$.ajax({
//编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
//请求参数数据
data:'{"uname":"cch","date":"2019-09-12"}',
//响应格式
dataType:"json",
//请求方式
type:"post",
//响应成功后的回调函数(data是返回的json数据)
success:function(data){
alert(data.uame);
}
});
});
});
4.3 ResponseBody响应json数据
@ResponseBody注解实现了将controller方法的返回对象转换为json格式响应给客户端
需要导入jackson的包
同时springmvc可以自动封装json类型的数据到参数对象中。
通过前端传来的json字符串,按照对应属性自动封装为user对象
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println(user);
return user;
}
Response响应json数据效果如图
获取到了后台传来的json对象字符串的uname属性。
5.SpringMVC文件上传和下载
1.使用fileupload工具包上传,传统代码步骤如下。
public String fileupload(HttpServletRequest req) throws Exception{
// 1.设置上传文件的路径
String uploadpath = req.getServletContext().getRealPath("/upload/");
// 2.判断该路径是否存在
File f1 = new File(uploadpath);
if (!f1.exists()) {
f1.mkdirs();
}
//3.获取磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//4.获取核心上传对象
ServletFileUpload upload = new ServletFileUpload(factory);
//5 解析request对象,返回一个文件项对象
List<FileItem> items= upload.parseRequest(req);
//6.遍历items
for(FileItem fi:items){
//判断是否是文件域
if(fi.isFormField()){
int count=0;
count++;
System.out.println("共有"+count+"个非文件项");
}
else{
//获取文件名称
String filename = fi.getName();
//完成文件上传
fi.write(new File(uploadpath,filename));
//删除临时文件
fi.delete();
}
}
return "success";
}
2.SpringMVC文件上传原理图
注意
1)spring提供了一个类MultipartFile,帮助我们解析request对象,只需要调用响应的方法即可完成上传操作,但是文件域中的name属性值必须要和参数属性名称相同(红线)。
2)我们还需要在spring-mvc-xml中配置spring的文件解析器对象,且此对象 的id必须是multipartResolver.不允许修改。
//SpringMVC的文件上传
@RequestMapping("/springmvcUpload")
public String springmvcUpload(HttpServletRequest req,MultipartFile upload) throws Exception{
// 1.设置上传文件的路径
String uploadpath = req.getServletContext().getRealPath("/upload/");
// 2.判断该路径是否存在
File f1 = new File(uploadpath);
if (!f1.exists()) {
f1.mkdirs();
}
//spring拿到了上传的对象,自动解析是否是文件域,调用上传的方法即可
//3.获取文件名称
String filename = upload.getOriginalFilename();
//4.上传文件
upload.transferTo(new File(uploadpath,filename));
return "success";
}
非常方便就完成了文件的上传。
3.springmvc之跨服务器的文件上传
从项目服务器上传到存放文件的服务器。此处模拟的是本地tomcat的跨服务器上传文件。步骤如下。
6.springmvc之异常处理
原理图
代码示例图
1).编写自定义异常类
设置提示属性message,和构造方法。
2).编写异常处理器实现类并设置错误页面信息。
知识点:if(实例 instanceof 类),该语法是检验一个对象是否是该类的实例或者是其子类孙类,或者是实现类,是返回true。
@Component
//编写系统异常处理器(解析器),实现springmvc异常处理器接口。
public class myExceptionResolver implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest req,
HttpServletResponse resp, Object obj, Exception ex) {
SysException se = null;
//如果异常处理器捕捉的异常对象是右边类的实例(或子类和实现类),则强转。
if(ex instanceof SysException){
se=(SysException)ex;
}//不是指定异常则抛出一个服务器异常信息。
else{
se= new SysException("服务器异常,请联系管理员");
}
//设置异常跳转相关信息。
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg", se.getMessage());
mv.setViewName("error");
return mv;
}
7.SpringMVC拦截器
拦截器和过滤器的区别:
拦截器是Springmvc自己的工具,只能拦截Controller中 方法,不拦截静态资源;过滤器可以拦截所有请求,所有web项目都可以使用。
使用拦截器的步骤:
1.编写自定义拦截器类,必须实现Springmvc的拦截器接口HandlerInterceptor。
可以看出,拦截器的操作是Spring经典的AOP切面编程思想
//方法执行预处理,返回值为true才执行方法体,执行下一个拦截器
/* 判断用户权限,是否登录等*/
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,
Object arg2) throws Exception {
System.out.println("Interceptor预处理执行了");
return true;
}
//后处理方法,在方法体执行后执行,但在方法转发页面加载之前执行
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("拦截方法执行后");
}
//完成(最终)方法
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception{
}
2.在springmvc配置文件中配置拦截器
<!--配置拦截器 (可以配置多个) -->
<mvc:interceptors>
<mvc:interceptor>
<!--设置拦截方法的请求路径 -->
<mvc:mapping path="/user/*"/>
<!--不拦截的(二选其一) <mvc:exclude-mapping path=""/> -->
<!--配置自定义拦截器的类-->
<bean class="com.borened.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
当有多个拦截器时,
按照定义的拦截器链,第一个拦截器的前处理方法执行后转发到第二个拦截器,在到Controller类的执行,再按顺序返回后方法和最终方法。
一个方法请求的执行路线如图所示: