SpringMVC知识一锅烩

Spring简介

SpringMVC和Struts2一样都是属于表现层的框架,将前段发出的请求分发给对应的后端处理器即Controller

处理流程

  • 用户请求被前端控制前拦截,然后根据对应的拦截路径去处理器映射器中寻找对应的Handler,然后通过处理器适配器执行指定的Handler处理器适配器会将执行后的结果返回给前端控制器,前端控制器选择对应的视图解析器渲染和解析视图,最后将结果相应给用户。

配置文件

  • web.xml
  • 需要创建springmvc.xml文件放在根目录下,更改<param-value>classpath:springmvc.xml</param-value> 来指定配置文件的位置。
  • 路径问题
    • /* 拦截所有 jsp js png .css 真的全拦截 建议不使用
    • .action .do 拦截以do action 结尾的请求 肯定能使用 ERP
    • / 拦截所有 (不包括jsp) (包含.js .png.css) 强烈建议使用

springMVC的三大组件和核心

  • 核心 : DispatcherServlet(前端控制器)
  • 三大组件 :
    • ViewResolver : 视图解析器
    • HandlerMapping : 处理器映射器组件(查找路径名对应的Handler)
    • HandlerAdapter : 处理器适配器组件(执行Handler)

@RequestMapping

  • value : 访问此方法的访问路径,可以是数组
  • method : 可以设置表单提交方式(post/get) 如果表单不符合,就会出现异常,可以是数组
  • 可以添加在类上面,类似struts2的namespace 则下面的方法都需要有类上父路径才能访问

第一个Controller

  • 第一个Controller
  • @RequestMapping(value = "test.action") // 在方法上面添加注解 value 为访问路径
  • @Controller (需要添加Controller,并且在springMVC中配置注解扫描)

Controller返回值

  • Controller是单例的, 当每个线程进来的时候会从这个程序创建一个副本,然后线程访问这个副本.
  • ModelAndView : 返回view 和 model (数据)
    • mav.setViewName("test.jsp"); // 返回视图
    • mav.addObject("test", "this is mmmmm"); // 封装数据, 内部为封装的request.setAttribute
  • Model : 常用
    • public String UserList(Model model){}
    • 这样就可以直接return ""; 来返回视图
    • model.addAttribute("userList",id); 内部为封装的request.setAttribute
    • 重定向 : return 'redirect:/item/itemlist.action' // 提交表单最好使用重定向,这样可以防止表单重复提交
    • forward : return 'forward:/item/itemlist.action' // 默认
  • void : ajax
    • 不返回视图

参数绑定

  • 由于Controller是单例的,所以我们需要将参数封装到方法属性中
    • public String UserList(User user,Model model,String id){}
    • User : 前段的input name和user内的属性名相同,可以自动封装
    • String id : 接受超链接传过来的值
  • 也可以传递request,response,session
    • public ModelAndView toEdit(Integer id,HttpServletRequest request,HttpServletResponse response,HttpSession session,Model model){}
    • public ModelAndView updateitem(QueryVo vo){} 封装pojo
    • vo : User s , 前端 s.name
  • 参数绑定 : 数组
    • 直接在形参传递数组,可以接受例如checkbox之类的多选的值
  • 参数绑定 : list
    • 只能使用包装类来提交,不能再形参直接传递list
    • 前段用 itemList[0].name 作为name, 适用于批量修改

自定义参数绑定

  • 使用 <mvc:annotation-driven />
  • 如果某些数据的格式不正确(比如日期),则可以自定义日期转换
  • 首先在SpringMVC.xml 中配置类型转换器
  • 然后自定义转换器类,实现需要进行的转换
  • SpringMVC.xml 配置
  • 转换类

post提交乱码

  • 在web.xml中配置编码过滤器
  • xml

异常处理

异常处理器

  • 将下层抛上来的异常做一个统一的处理
  • 过程 :
    • 建一个类,并且实现HandlerExceptionResolver接口,实现对应的方法
      • ``` public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) { / request / response : 发生异常的响应 * obj : 发生异常的地方 * * */
          ModelAndView andView=new ModelAndView();    
          andView.addObject("error", e);     
          andView.setViewName("/error.jsp");     
          return andView; 
}

```

  • 在springMVC配置文件中配置这个bean
    • <bean class="com.lyh.exception.CustomerException"></bean>
  • 当有异常时就会按照你所想要的方式去处理

自定义异常

  • 知道异常为什么出现,然后可以进行对应的操作
  • 只需要自定义一个异常类,然后在异常处理器判断这个发生的异常是否是我们自定义的异常类,然后进行对应的操作

上传文件

  1. 设置表单name,设置表单post 以及enctype="multipart/form-data"
  2. 在controller中的的参数中设置MultipartFile multipartFile , 注意, 属性名要和name名相同
  3. 在springmvc中配置 , 在这里可以设置参数来限制上传大小,类型之类\
     <!-- 上传图片实现类  id 固定-->    
     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        
         <!-- 控制上传图片的大小 B         
         <property name="maxUploadSize" value="5000"></property>          
          -->    
     </bean>

4. 实现上传 multipartFile.transferTo(new File("D:\\upload\\"+ name+"."+suf)); //保存到指定地点

5. controller代码

json

前段:     
<script type="text/javascript">          
    $(document).ready(function(){              
        var saveDataAry=[];               
        var data1={"user":"ququ","age":1};               
        $.ajax({                  
            type:"POST",                  
            url:"${pageContext.request.contextPath }/jsonTest.do",                  
            dataType:"json",                      
            contentType:"application/json",    // 需要设置头为json                               
            data:JSON.stringify(data1), // 转换Json对象为字符串                 
            success:function(data){                  
            }               
         });          
    });       
</script> 
   @RequestMapping(value="json.action")        
      public void json(@RequestBody User user){        
   }
  • 方法添加注解 @ResponseBody , 返回json, 自动转换为json字符串
 @ResponseBody     
     public User json(@RequestBody User user){         
         return user;
 }

拦截器

自定义拦截器

  • 实现接口 HandlerInterceptor , 其中三个方法分别对应方法执行前 , 执行后 , 页面渲染后
  • 配置拦截器
     <mvc:interceptors>         
        <mvc:interceptor>             
             <mvc:mapping path="/*.action"></mvc:mapping>             
             <mvc:exclude-mapping path="/userList.action"></mvc:exclude-mapping>             
             <bean class="com.lyh.interceptor.InterceptorOne"></bean>         
        </mvc:interceptor>     
     </mvc:interceptors>
  • 拦截器的执行位置 : 对应方法执行前 , 执行后 , 页面渲染后

多个拦截器执行顺序

  • 拦截器内的跳转需要使序
    • 每个阶段都会执行所有拦截器的这个阶段的方法,执行完毕以后再进行下一个阶段的拦截
    • perHandler 按照拦截器定义顺序调用
    • postHandler 按照拦截器定义的逆序调用
    • afterCompletion 按照拦截器定义的逆序调用
    • postHandler 是在拦截器链所有拦截器返回成功调用
    • afterCompletion只有在preHandler返回为true的时候才调用

springMVC和Struts的区别

  • springMVC是单例, Struts2为多例
  • springMVC参数绑定在形参 , Struts2 绑定成员变量
  • springMVC没有值栈 Struts2 有值栈
  • springMVC的入口是一个Servlet, Struts2为一个Filter

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏肖蕾的博客

第五章:TTF字库使用(中文方案推荐版)FreeTypeFontGeneratorFreeTypeFontGenerator.FreeTypeBitmapFontData

1.定义:TTF字体发生器 2.用途:负责保存和解析 .ttf后缀格式文件 3.ttf文件名,必须是英文或者数字。

512
来自专栏逆向技术

C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原

      C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原 我们以前讲SEH异常处理的时候已经说过了,C++中的Try catch...

19810
来自专栏李家的小酒馆

Spring MVC面试整理

Spring MVC执行过程 1. 客户端的请求提交到dispatcherServlet 2. DispatcherServ...

1960
来自专栏Android 研究

Retrofit解析8之核心解析——ServiceMethod及注解1

上篇文章已经介绍了Retrofit里面的大多数类,今天就重点介绍ServiceMethod,本片文章主要内容如下:

764
来自专栏编程

《5》python字符串和编码

「5」python字符串和编码 ? 字符编码 最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大...

17710
来自专栏MasiMaro 的技术博文

windows平台调用函数堆栈的追踪方法

在windows平台,有一个简单的方法来追踪调用函数的堆栈,就是利用函数CaptureStackBackTrace,但是这个函数不能得到具体调用函数的名称,只能...

932
来自专栏java一日一条

Spring面试问答Top 25

本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时就会被问到。对于本文中未提及的Spring其他模块,我会单独分享...

462
来自专栏软件开发

前端MVC Vue2学习总结(六)——axios与跨域HTTP请求、Lodash工具库

一、axios Vue更新到2.0之后宣告不再对vue-resource更新,推荐使用axios,axios是一个用于客户端与服务器通信的组件,axios 是一...

39110
来自专栏学海无涯

Java Web之BaseServlet的抽取

在Java Web学习的初期,开发的小项目几乎都是JSP+Servlet+JDBC,长期开发下来,会发现当业务逻辑设计的接口一多的时候,充当控制器的Servle...

2785
来自专栏前端架构

jsp page指令详解

JSP 指令(directive)影响由 JSP 页面生成的 servlet 的整体结构。下面的模板给出指令的两种可能形式。属性值两边的双引号可以替换为单引号,...

575

扫码关注云+社区