本篇博客只是记录一些零碎的SpringMvc知识点,方便后续查看,没有什么特殊的地方。
目录
本篇博客只是记录一些零碎的SpringMvc知识点,方便后续查看,没有什么特殊的地方。
1: controller中定义的方法参数可以为空,如果想获取Servlet原生Api可以直接加上如下参数:
public String getUser(HttpServletRequest request, HttpServletResponse response){}
2:参数绑定的。
1)前端如果传递的参数名称和方法中的参数名称一致就会自动封装。
2)参数中的接收参数也可以直接为一个对象。但是要保证,前端提交的form表单中的属性名称和JavaBean中的属性名称一致。
3)如果接收对象中还有引用别的对象的属性也想封装数据,那表单提交中的属性名为: 接收对象中引用对象的属性名.引用对象中属性名
4)如果接收对象中还有集合,map属性,想封装,表单中的属性名要用: 接受对象中集合属性名[0].集合中对象属性名或 接收对象中map属性名[‘key’]来传递。
5)如果某个字段表单和controller方法中的形参无法保持一致,在方法的形参之前可以用@RequestParam("xxx")来手动匹配。
3:常用注解
1)@RequestBody, 写在controller的方法的String形参之前,可以直接得到前端的请求body,方便直接进行对象转换。或者直接加载实体类的参数前可以直接把前端的json数据封装到对象里面去。
2)@PathVaribale ,获取rest请求风格中的请求路径中的参数。
3)@CookieValue('xxx') ,获取cookie中的某个key对应的value。也是写在形参之前.
4)@ModelAttribute :
可以在方法上使用先处理数据,然后返回出来让下一个方法继续处理。
如果修饰没有返回值的方法,可以在形参上加一个Map属性,把它放进去,然后在另外一个方法上获取。
关于它更详细的介绍可以参考此博客: ModelAttribute
5)@SessionAttribute
作用:用于多次执行控制器方法间的参数共享。作用在类上。某个方法中存入request域中属性通过注解中的value属性
放入到session中,其他方法可以直接获取。
属性:value:用于指定存入的属性名称 type:用于指定存入的数据类型。
4:controller方法中返回值类型
1:在类上面加@Controller注解表示返回结果会配合视图解析器用,返回的字符串会找到对应的jsp。
2: 在类上面加@RestController注解表示返回结果可以直接为String,但是不会经过视图解析器,返回的字符串直接返回给前端。
3: 如果方法的返回值为空,方法可以重定向或者请求转发给下一个页面。
请求转发:
@GetMapping("/testRequest")
public void testRest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/request.jsp").forward(request,response);
return;
}
重定向:
@GetMapping("/testRediredct")
public void testRediredct(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect(request.getContextPath()+"/testRequest");
return;
}
4:ModelAndView
在方法中使用这个对象,可以直接把数据和返回的页面设置好。model.addObject(key,value) 和model.setViewName("xxx");
5:使用关键字跳转页面。重定向和请求转发也可以使用关键字来实现,只是写法不一样。而且重定向的时候不用写全路径了。
![](https://img-blog.csdnimg.cn/20200209210129128.png)
5:文件上传
注意前端上传文件的媒体类型以及input的标签的属性名字也要和MultipartFile 的对象名保持一致。
1:本地文件上传后台处理流程:
2:跨服务器上传,文件:需要使用其他jar包,jersey-client。
6:异常处理
SpringMvc发生异常之后可以自己定义处理逻辑,定义页面和异常来返回。自己定义异常类继承Exception。然后实现自定义的异常处理类既可以处理异常了。
@Service
public class ExceptionFilter implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
EntityException exception=null;
if (e instanceof Exception){
exception=(EntityException)e;
}else{
exception=new EntityException("系统在维护中");
}
modelAndView.addObject("error",exception.getErrorMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
@GetMapping("/errorTest")
public void testError () throws EntityException {
try {
int i= 10/0;
}catch (Exception e){
throw new EntityException("发生错误了");
}
return;
}
7:拦截器
SpringMvc的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。和过滤器类似也有拦截器链。
虽然它和过滤器很像,但也不是完全一样的。区别如下:
过滤器是servlet规范中的一部分,任何java web项目都可以使用。
拦截器是SpringMvc框架自己的,只有使用了SpringMvc框架工程才能用。
过滤器是在url-parttern中配置了/*之后,可以对所有要访问的资源进行拦截,包括静态资源。
拦截器它只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js,是不会进行拦截的。
它是AOP思想的具体应用。我们要自定义拦截器,要实现HandlerInterceptor接口。
在SpringBoot中可以按如下方式进行拦截器配置。
自定义拦截器内容如下:
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("请求controller之前执行");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("请求controller之后执行");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("视图渲染完执行,一般清除资源");
}
}
添加到配置中:如果有多个拦截器的话,就addInterceptor添加多个。
@Configuration
public class SpringMvcConfigure extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
这个请求就会经过我们定义的拦截器。