过程:
1. 用户发出请求,传递url,例如:/product/list.shtml
2. 中央处理器(DispatcherServlet)拿到请求,然后将请求交给 映射器(RequestMappingHandlerMapping),映射器根据请求去扫描,直到找到@RequestMapping(value="/product/list.shtml")
public String list(){ }方法,然后将list方法返回给映射器(RequestMappingHandlerAdapter),映射器再交给中央处理器。
3. 中央处理器在拿到方法后,再通知适配器,去执行此方法,当方法执行完毕后再将 return的结果返回给中央处理器。
4. 中央处理器将结果交给视图解析器,视图解析器找到对应的视图进行渲染,返回给中央处理器,中央处理器再返回给用户界面。
对于拦截器,我们将它配置到映射器中。
在springmvc-front.xml中具体配置:
<!--jsp视图解析器-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/front_page/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<!--注入拦截器-->
<property name="interceptors">
<list>
<bean class="cn.hdu.li.core.web.SpringmvcInterceptor">//拦截器
<property name="adminId" value="1"/>
</bean>
</list>
</property>
</bean>
<!-- 适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
SpringmvcInterceptor类的实现:
//SpringmvcInterceptor实现类要想注入spring,必须要有个接口,此时接口为:HandlerInterceptor
public class SpringmvcInterceptor implements HandlerInterceptor {
@Autowired
private SessionProvider sessionProvider;
// 拦截"/buyer/"
private static final String INTERCEPTOR_URL = "/buyer/";
private Integer adminId;
//方法前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//设置flag给前台页面,来决定显示"退出、我的购物车",还是显示"登录、注册"
//去session中拿buyer,如果拿到就显示 "退出,我的购物车",如果为null,则没有登录,显示 "登录、注册"
//下面还要用到buyer
Buyer buyer = (Buyer) sessionProvider.getAttribute(request, Constants.BUYER_SESSION);
boolean flag = false;
if(buyer != null) {
flag = true;
}
request.setAttribute("isLogin", flag);
//此处才是核心,判断某一url是否拦截
String uri = request.getRequestURI();
if(uri.startsWith(INTERCEPTOR_URL)) {
//必须登录
if(buyer == null) {
response.sendRedirect("/shopping/login.shtml?returnUrl=" + request.getParameter("returnUrl"));
return false;
}
}
return true; //true就继续走,false就不往下走,拦住
}
//方法后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//页面渲染后
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}