SpringMVC知识一锅烩
Spring简介
SpringMVC和Struts2一样都是属于表现层的框架,将前段发出的请求分发给对应的后端处理器即Controller
处理流程
- 用户请求被前端控制前拦截,然后根据对应的拦截路径去处理器映射器中寻找对应的Handler,然后通过处理器适配器执行指定的Handler处理器适配器会将执行后的结果返回给前端控制器,前端控制器选择对应的视图解析器渲染和解析视图,最后将结果相应给用户。
配置文件
-
需要创建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
-
@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 中配置类型转换器
-
然后自定义转换器类,实现需要进行的转换
post提交乱码
-
在web.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>
-
当有异常时就会按照你所想要的方式去处理
-
自定义异常
-
知道异常为什么出现,然后可以进行对应的操作
-
只需要自定义一个异常类,然后在异常处理器判断这个发生的异常是否是我们自定义的异常类,然后进行对应的操作
上传文件
-
设置表单name,设置表单post 以及enctype="multipart/form-data"
-
在controller中的的参数中设置MultipartFile multipartFile , 注意, 属性名要和name名相同
-
在springmvc中配置 , 在这里可以设置参数来限制上传大小,类型之类
<!-- 上传图片实现类 id 固定--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 控制上传图片的大小 B <property name="maxUploadSize" value="5000"></property> --> </bean>
-
实现上传
multipartFile.transferTo(new File("D:\\upload\\"+ name+"."+suf)); //保存到指定地点
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