一、@RequestMapping的用法
1、URL路径映射:作用于方法,可以将多个url映射到同一个方法。
单个地址映射:@RequestMapping("/list")
多个地址映射:@RequestMapping(value={"/list","/list2"})
2、窄化请求映射:作用于类,@RequestMapping可以写到Controller上。
3、请求方法限定:作用于方法,限制请求方式 method={RequestMethod.GET,RequestMethod.POST}
@RequestMapping(method=RequestMethod.GET):如果通过Post访问则报错:HTTP Status 405 - Request method 'POST' not supported
@RequestMapping(method=RequestMethod.POST):如果通过Post访问则报错:HTTP Status 405 - Request method 'GET' not supported
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST}):GET和POST都可以
二、Controller方法的返回类型
1、ModelAndView
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemList",list);//设置数据,相当于把数据放到request域中;"itemList"是在jsp配置的名字
modelAndView.setViewName("WEB-INF/jsp/itemList.jsp");//设置逻辑视图。逻辑视图,就是jsp的路径//WEB-INF/jsp/itemList.jsp
return modelAndView;
2、String
public String itemEdit(Model model){
model.addAttribute("item",items);
return "editItem";//逻辑视图:其实是返回jsp的路径。//WEB-INF/jsp/editItem.jsp
//return "redirect:list2Temp.do";//重定向,不同的request域
//return "forward:list2Temp.do";//请求转发,同一个request域
}
3、void:只能使用最原始的servlet的方法
public void itemEdit(HttpServletRequest request, HttpServletResponse response){
1、请求转发
request.getRequestDispatcher("页面路径").forward(request, response);//请求转发
2、重定向:
response.sendRedirect("页面路径");
3、也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
}
三、springmvc对restful风格的支持
什么是restful风格?url中没有参数,如:https://mp.csdn.net/postedit/103509565
正常模式: http://localhost:7001/xxx/itemEdit.do?id=2&name='牡丹'
restful风格:http://localhost:7001/xxx/itemEdit/2/牡丹
1、修改web.xml中DispatcherServlet的url-pattern: <url-pattern>*.do</url-pattern> 改成 <url-pattern>/</url-pattern>
2、修改方法的 @RequestMapping("/方法名/{参数1}/{参数2}")与@PathVariable("参数1")@PathVariable("参数2")保持一致
@RequestMapping("/itemEdit2Temp/{idXxx}/{idXxx2}")
public String itemEdit(@PathVariable("idXxx")int id,@PathVariable("idXxx2")int id2,Model model){...}
3、配置静态资源 如:http://ip:port/Xxx/js/jquery-1.4.4.min.js, 因为前端控制器现在是通过/过滤方法,很明显.js方法不属于需要过滤的方法。我们这里配置:以js开头的请求,直接从js文件夹中找相应的文件。pic文件也一样。
springmvc.xml文件:
<!-- 配置静态资源 -->
<!-- location:请求地址 mapping:映射的位置 -->
<mvc:resources location="/js/" mapping="/js/**"> </mvc:resources>
<mvc:resources location="/pic/" mapping="/pic/**"> </mvc:resources>
四、拦截器interceptor
1、定义
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
2、自定义拦截器,实现HandlerInterceptor接口
3、拦截器的配置
springmvc.xml:
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行,/** 任意层级的目录 -->
<mvc:interceptor>
<mvc:mapping path="/**/"/>
<bean class="com.ly.ssm.interceptor.MyHandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**/"/>
<bean class="com.ly.ssm.interceptor.MyHandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
4、测试:拦截器的顺序
MyHandlerInterceptor1----preHandle。。。
MyHandlerInterceptor2----preHandle。。。
MyHandlerInterceptor2----postHandle。。。
MyHandlerInterceptor1----postHandle。。。
MyHandlerInterceptor2----afterCompletion。。。
MyHandlerInterceptor1----afterCompletion。。。
注意:只有preHandle方法返回ture时,postHandle和afterCompletion方法才会执行(true:放行;false:拦截)
5、拦截器的应用:登录校验
//true:放行; false:拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object attribute = request.getSession().getAttribute("user");
if(null == attribute){
HandlerMethod HandlerMethod = (HandlerMethod)handler;
if(HandlerMethod.getMethod().getName().equals("login")){
return true;//放行
}
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false; //拦截
}else{
return true;//放行
}
}