SpringMVC和struts2的区别
①struts2的值栈和Action对内存的消耗很大,每个struts2请求都会创建一个值栈和Action;SprignMVC是请求处理器类单例,效率高
②Struts的核心控制器是Filter ; SpringMVC的核心控制器是Servlet
③Struts2兼容Spring需要插件 ; SpringMVC却天然支持
④Struts2不支持Restful风格 ; SpringMVC却天然支持
⑥Struts2用Ajax很繁琐 ; SpringMVC很简洁,用@ResponseBody即可
⑦Struts2标签结合OGNL表达式爽翻天,页面的开发效率很高
1、RequestMapping映射
①根据请求方式映射
@RequestMapping(value="/testMethodMapping}", method=RequestMethod.GET) @RequestMapping(value="/testMethodMapping",method=RequestMethod.POST) //empID在from表单的请求参数里 @RequestMapping(value = "/list", method = {RequestMethod.POST, RequestMethod.GET})
②根据请求参数情况映射------[了解]
//请求参数中必须包含userName @RequestMapping(value="/testParamersMapping}",params="userName") //请求参数中不能包含userName @RequestMapping(value="/testParamersMapping}",params="!userName") //请求参数中必须包含userName且值必须为Tom @RequestMapping(value="/testParamersMapping}",params="userName=Tom") //请求参数中必须包含userName但值不能为Tom @RequestMapping(value="/testParamersMapping}",params="userName=!Tom") //请求参数中必须包含userName且值为Tom2015,同时必须包含userPwd但值不限 @RequestMapping(value="/testParamersMapping}",params={"userName=Tom2015","userPwd"})
③根据请求消息头内容映射------[了解]
//根据请求消息头必须为:Accept-Language:zh-CN,zh;q=0.8映射 @RequestMapping (value="/testHeaderMapping}",headers= "Accept-Language=zh-CN,en;q=0.8")
④使用Ant风格通配符
//映射单个字符 可以处理 value="/testSingleWord_a" value="testSingleWord_b" value="testSingleWord_c" ......的请求 @RequestMapping(value="/testSingleWord_?") //映射多个字符 可以处理 value="/testMultiWord_apple" value="testMultiWord_asf" ......的请求 @RequestMapping(value="/testMultiWord_*") //映射多级目录 可以处理 value="/testMultiFolder" value="/testMultiFolder/happy" value="/testMultiFolder/happy/good"......的请求 @RequestMapping(value="/testMultiFolder/**")
2、获取请求参数
①@RequestParam注解
@RequestMapping("/testRequestParam") public String testParam(@RequestParam(value="empName",required=false) String empName) { #获取 empName 这个参数 }
②从URL地址中通过通配符获取匹配的数据
@RequestMapping(value="/emp/{empId}", method=RequestMethod.GET) public String editEmp(@PathVariable("empId") String id) { #从Url地址中获取请求参数 }
③将请求参数注入到POJO中
@RequestMapping(value="/emp") public String saveEmp(Employee employee) { }
④获取请求消息头或Cookie
@RequestMapping("/testGetOther") public String getOtherValue(@RequestHeader("User-Agent") String userAgent, @CookieValue("JSESSIONID") String cookieValue) { //@RequestHeader("User-Agent") 获取请求消息头中的 User-Agent信息 赋值给userAgent //@CookieValue("JSESSIONID") 获取Cookie中的 JSSIONID信息 赋值给cookieValue }
3、经过处理请求后携带资源的视图跳转
@RequestMapping(value="/showList01") public String showList01e(HttpServltRequest request){ request.setAttribute("list", list); return "showList"; } @RequestMapping(value="/showList02") public String showList02(Map<String,Object> map){ map.put("list", list); return "showList"; } @RequestMapping(value="/showList03") public String showList03(Model model){ model.addAttribute("list", list); return "showList"; } @RequestMapping(value="/showList04") public String showList04(ModelMap modelMap){ modelMap.addAttribute("list", list); return "showList"; } @RequestMapping(value="/showList05") public ModelAndView showList05(){ ModelAndView modelAndView = new ModelAndView("showList"); modelAndView.addObject("list", list); return modelAndView; }
4、SpringMVC Controller重定向
//重定向1 model.addAttribute("payResult", payResult);model中的数据获取不到 response.sendRedirect(request.getContextPath()+"/H5DemoPay.jsp"); //重定向2 model.addAttribute("payResult", payResult);model中的数据以?payResult=xxxxxx的形式传递过去 return "redirect:/H5DemoPay.jsp"; //将页面写出来 httpServletResponse.setCharacterEncoding("UTF-8"); httpServletResponse.getWriter().write(payResult); //payResult若是一个HTML页面 则把整个页面就写出来了
5、SpringMVC Controller转发
//转发1 推荐使用 转发到 配置好的前后缀的页面 model.addAttribute("payResult", payResult); return "H5DemoPay"; //转发2 可以转发到不是配置好的前后缀的页面 model.addAttribute("payResult", payResult); return "forward:/H5DemoPay.jsp"; //转发3 此种转发会出现url多一层目录的情况 /shop/H5/H5DemoPay.jsp 多一个(/H5)目录 model.addAttribute("payResult", payResult); httpServletRequest.getRequestDispatcher("/H5DemoPay.jsp").forward(httpServletRequest,httpServletResponse);
6、forward:和 redirect:
// 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理。 // 如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理:将forward:和 redirect:当成指示符, // 其后的字符串可以是jsp页面,也可以是url地址跳转到另一个controller @RequestMapping(value="/testForward") public String testForward(){ return "forward:/views/login.jsp"; //转发到一个页面 return "forward:/demo/scanPay"; //转发到另一个controller 会携带此controller里的request的参数(因为是转发是同一个请求) } @RequestMapping(value="/testRedirect") public String testReddirect(){ return "redirect:/views/login.jsp"; //重定向到一个页面 return "redirect:/demo/scanPay"; //重定向到一个controller }
7、SpringMVC基础配置
<!-- 配置一个最常用的视图解析器 --> <bean id="viweResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 配置自定义视图 --> <!-- 配置自定义视图对应的bean --> <bean id="myViews" class="com.atguigu.spring.view.MyView" /> <!-- 配置 自定义的视图解析器 :BeanNameViewResolver--> <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"> <!-- 数值越小视图解析器的优先级别越高 --> <property name="order" value="20"></property> </bean> <!-- URL地址不经过handler直接访问WEB——INF下的页面 --> <!-- 配置通过URL地址直接访问jsp不通过handler,比如访问WEB-INF下的页面 ,比如登录页面,不转发的话到不了WEB-INF下 --> <a href="${pageContext.request.contextPath}/toLOginPage"></a> <!-- path属性:浏览器发送的URL地址 --> <!-- view-name属性:视图名称 --> <!-- 关于视图的两个概念:逻辑视图:login——视图的名称(jsp的名称) 物理视图:WEB-INF/views/login.jsp --> <!-- 此时如果只有<mvc:view-controller>标签的话,那么其他请求就会失效,所以需要增加一个额外的配置,<mvc:annotation-driver>标签来配合使用--> <mvc:view-controller path="/toLoginPage" view-name="login"/> <mvc:annotation-driven /> //配合使用 <!-- 为了能让项目中的静态资源可以被正常访问,需要加入如下配置 --> <mvc:default-servlet-handler/> <mvc:annotation-driven /> //配合使用
8、SpringMVC-Restful
Restful风格的URL地址
保存:http://localhost:8080/CRUD/emp POST请求 http://localhost:8080/CRUD/saveEmp 删除:http://localhost:8080/CRUD/emp/2 DELETE请求 http://localhost:8080/CRUD/removeEmp?empId=2 修改:http://localhost:8080/CRUD/emp PUT请求 http://localhost:8080/CRUD/updateEmp 查询:http://localhost:8080/CRUD/emp/2 GET请求 http://localhost:8080/CRUD/getEmp?empId=2将GET请求转化为DELETE请求
<!--所有的超级连接都是get请求,将get请求变为DELETE请求办法:再由jQuery将超级连接添加到表单的action并提交,此时仍然为post请求 写一个post请求表单,携带隐藏<input type="hidden" name="_method" value="DELETE" />,经由一个HiddenHttpMethodFilter过滤将改成DELETE请求,--> <a class="removeEmp" href="${pageContext.request.contextPath }/emp/${emp.empId }">删除</a></td> <form action="" method="post"> <input type="hidden" name="_method" value="DELETE"/> </form> $(function(){ //获取所有的删除超级链接对应的元素节点对象,并绑定响应的单机响应函数 $(".removeEmp").click(function(){ //获取空的from表单 var $form = $("form"); //把表单的action属性值设置为当前超级链接的href属性值 $form[0].action=this.href; //提交空的表单,此时表单请求为post请求,前往HiddenHttpMethodFilter改成DELETE请求 $form.submit(); //取消超级链接的默认跳转行为 return false; }); });
//这个过滤器可以拦截所有的资源,将表单的POST请求转换为PUT请求或DELETE请求 <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>