三个问题
1、什么是监听器?有什么作用?怎样用的?
监听器(listener)就是application、session、request三个对象创建、销毁
或者往其中添加修改删除属性时
自动执行代码的功能组件。
用法:
(1)定义一个类去实现ServletContextListener接口
public class BannerListener implements ServletContextListener {
/*ServletContext对象被创建*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
/**
* 创建表示spring容器的对象,ApplicationContext
* ApplicationContext就是表示Spring容器,通过容器获取对象了
* ClassPathXmlApplicationContext:表示从类路怪中加载spring的配置文件
*/
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
IBannerService bannerService = app.getBean(IBannerService.class);
List<Banner> bannerList = bannerService.findAllShowBanner();
ServletContext application = arg0.getServletContext();
application.setAttribute("bannerList", bannerList);
}
/*ServletContext对象被销毁*/
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
}
(2)web.xm里面的配置
<!--监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>com.phonemarket.listener.BannerListener</listener-class>
</listener>
2、什么是过滤器?有什么作用?怎样用的?
过滤请求的,对请求进行过滤,有“通行证”则放行,没有就指定它跳到哪个页面。
过滤器用法:
自定义一个类实现Filter接口
/*实现Filter接口*/
public class ManagerFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/*主要重写这个方法*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
Object user = httpServletRequest.getSession().getAttribute("user");
if (user == null){
//返回登录页面
httpServletRequest.getRequestDispatcher("/pages/user/login.jsp").forward(servletRequest, servletResponse);
}else {
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
web.xml的配置
<!-- 管理者页面ManagerFilter的拦截 -->
<filter>
<filter-name>ManagerFilter</filter-name>
<filter-class>com.java.filter.ManagerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ManagerFilter</filter-name>
<!-- 拦截路径,拦截orderServlet请求-->
<url-pattern>/pages/manager/*</url-pattern>
<url-pattern>/manager/bookServlet</url-pattern>
<url-pattern>/orderServlet</url-pattern>
</filter-mapping>
3、什么是拦截器?有什么作用?怎样用的?
拦截器也是过滤请求的,作用感觉和过滤器差不多,但他们还是有区别的,拦截器是spring框架的,过滤器是javaweb的三大组件之一(servlet、listener、filter)
拦截器用法:
三个方法,请求之前执行、controller获取数据后返回视图页面前执行、跳转完页面后执行。
普遍都是重写第一个方法,进行一些身份的验证
(1)定义一个拦截器类实现 HandlerInterceptor 接口
public class AdminLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
Admins admin = (Admins) httpServletRequest.getSession().getAttribute("admin");
if(admin!=null){
return true;
}
httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/view/admin");
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
(2)、这一部分是要写在 springmvc.xml的配置文件里面的,设置 拦截路径+绑定拦截器
<mvc:interceptors>
<!-- 对特定的请求进行拦截 -->
<mvc:interceptor>
<mvc:mapping path="/goods/detail" />
<mvc:mapping path="/cart/*" />
<bean id="UserLoginInterceptor" class="com.phonemarket.interceptor.UserLoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/view/toAdminIndex"/>
<bean id="AdminLoginInterceptor" class="com.phonemarket.interceptor.AdminLoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>