SpringMVC和Mybatis(五)RESTful架构、拦截器、拦截器应用

RESTful架构
1.对url进行规范,写成RESTful格式的url
普通url:http://.../queryItems.action?id=001&type=T01
RESTful的url:http://.../items/001
特点简洁,将参数通过url传到服务器
2.http的方法进行规范
不管是删除、添加、更新。。使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加设
置post,更新put
后台controller方法:判断http方法,如果是delete就删除
3.对http的contentType进行规范
请求时指定contentType,要json,就设置成json格式的type。

查询商品信息,返回json数据。
controller
使用RESTful风格的url进行映射

输出json,使用@ResponseBody
URL模板映射
@RequestMapping(value="/viewItems/{id}"}:{}为占位符,请求的URL可以
是"/viewItems/1"或"/viewItems/2",通过在方法中使用@PathVariable获取{}的变量

@RequestMapping("/itemsView/{id}/{type}")

ItemsController.java

public @ResponseBody ItemsCustom itemsView(@PathVariable("id") Integer 
id,@PathVariable("type") Integer type)throws Exception{
ItemsCustom itemsCustom = itemsService.findItemsById(id);
return itemsCustom;
}
最重要要再配置一个RESTful的前端控制器
web.xml
<!-- springmvc前段控制器,RESTful -->
  <servlet>
  <servlet-name>springmvc_rest</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring/springmvc.xml</param-value>
  </init-param>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>springmvc_rest</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>

最终访问:http://localhost:8081/springmvc_mybatistest/items/itemsView/1

对静态资源的解析因为在url-partten中指定/,对静态资源无法解析。
在springmvc.xml中添加静态资源解析的方法
<!-- 静态资源的解析 包括js、css、img -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>
=============================================================================
拦截器
创建interceptor的包创建HandlerInterceptor1.java
1.springmvc针对HandlerMapping进行拦截设置。
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1" />
<ref bean="handlerInterceptor2" />
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.interceptor.HandlerInterceptor1" />
<bean id-"handlerInterceptor2" class="springmvc.interceptor.HandlerInterceptor2" />
一般不推荐使用,麻烦

2.springmvc还可以配置类似全局的拦截器。会自动注入到每个HandlerMapping中。
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 配置多个,顺序执行 -->
<mvc:interceptor>
<!-- 拦截包括子url路径 -->
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>

多个拦截器各个方法的执行
1.两个拦截器都放行,改return true
Interceptor1...preHandler
Interceptor2...preHandler
Interceptor2...postHandler
Interceptor1...postHandler
Interceptor2...afterCompletion
Interceptor1...afterCompletion
preHandler按顺序执行
postHandler和afterCompletion按逆向顺序执行
2.拦截器1放行,拦截器2不放行
Interceptor1...preHandler
Interceptor2...preHandler
Interceptor1...afterCompletion
拦截器1放行,拦截器2preHandler才会执行
拦截器2preHandler执行,拦截器其他不放行
只要有一个拦截器不放行,post方法就一定不会放行
3.拦截器1不放行,拦截器2不放行
Interceptor1...preHandler
只有按顺序1执行了开始

重要:在afterCompletion可以做日志的处理,只能放在第一个Handler拦截器里,并且一定是放行。统一日
志放在登录认证拦截器之前preHandler。权限校验的拦截器,放在登录认证拦截器之后afterCompletion。
======================================================================================
拦截器应用
判断请求的url是公开地址(无需登录即可访问的url),放行
1.登录的controller方法
LoginController.java
@Controller
public class LoginController {
//登录
@RequestMapping("/login")
public String login(HttpSession session,
String username,String password)throws Exception{
//调用service进行用户验证
//session中保存用户信息
session.setAttribute("username", username);

return "redirect:/items/queryItems.action";
}
//退出
@RequestMapping("/logout")
public String logout(HttpSession session)throws Exception{
//清除session
session.invalidate();
return "redirect:/items/queryItems.action";
}
}

login.jsp
  <body>
   <form action="${pageContext.request.contextPath }/login.action" method="post">
   username:<input type="text" name="username" /><br />
   password:<input type="password" name="password" /><br />
   <input type="submit" value="登录">
   </form>
  </body>
</html>

2.登录认证拦截器实现
LoginInterceptor.java
public class LoginInterceptor implements HandlerInterceptor{

//执行Handler完成之后,统一的异常处理,统一的日志处理
@Override
public void afterCompletion(HttpServletRequest arg0, 
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub

}

//在Handler方法之后,返回ModelAndView之前,将公用模型数据,菜单导航传入视图
@Override
public void postHandle(HttpServletRequest arg0, 
HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub

}

//进入Handler方法之前,身份认证和授权
@Override
public boolean preHandle(HttpServletRequest arg0, 
HttpServletResponse arg1, Object arg2) throws Exception {
//表示拦截
String url = arg0.getRequestURI();
//判断是否为公开地址
if (url.indexOf("login.action")>=0) {
return true;
}
//判断session
HttpSession session = arg0.getSession();
//取出session中用户信息
String username = (String) session.getAttribute("username");
if (username != null) {
//身份验证成功
return true;
}
//跳转到登录界面
arg0.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(arg0, arg1);
return false;
}

}

配置springmvc.xml
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

需要把其他interceptor放行
itemsList.jsp
 <body>
  当前用户:${username },
  <c:if test="${username!=null }">
  <a href="${pageContext.request.contextPath }/logout.action">退出</a>
  </c:if>

猜你喜欢

转载自blog.csdn.net/qq_33568065/article/details/79318120
今日推荐