SpringMvc知识点记录

本篇博客只是记录一些零碎的SpringMvc知识点,方便后续查看,没有什么特殊的地方。

目录

本篇博客只是记录一些零碎的SpringMvc知识点,方便后续查看,没有什么特殊的地方。

2:参数绑定的。

3:常用注解

4:controller方法中返回值类型

​5:文件上传

6:异常处理

7:拦截器


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:使用关键字跳转页面。重定向和请求转发也可以使用关键字来实现,只是写法不一样。而且重定向的时候不用写全路径了。



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);
    }

}

这个请求就会经过我们定义的拦截器。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姑苏冷

您的打赏是对原创文章最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值