• SpringMVC知识一锅烩


    Spring简介

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

    处理流程

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

    mark

    配置文件

    • 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

    • 属性添加注解@RequestBody

      • 接受json,自动转化为对象(接受的要为json字符串,js中转换字符串的方式JSON.stringify(data))
       	前段:
      	<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

  • 相关阅读:
    MySQL Case When 用法
    Delphi磁性窗口
    一个灵巧的Delphi多播实事件现方案.
    Delphi bpl 插件框架
    Win7下超级管理员创建普通权限任务
    Delphi 插件(Plugins)创建、调试与使用应用程序扩展
    Dll中导出类Delphi实战
    让你的程序支持插件
    构造一个通用的回调Thunk.(把回调函数指向对象的方法的办法)
    打造类.NET带垃圾回收功能的Delphi版GDIPlus
  • 原文地址:https://www.cnblogs.com/liyuhui-Z/p/7800649.html
Copyright © 2020-2023  润新知