Servlet Java Web开发(6) 内置对象, 监听器和过滤器
内置对象
Jsp 九大内置对象:无需创建可以直接使用的9个对象。
out//等同于response.getWriter();向客户端发送数据 config//对应Servlet中ServletConfig对象 page//转换成Servlet后的this对象 pageContext//当前页面的上下文,范围最小的域对象,配置属性,获取其他内置对象 exception//仅在错误页面中可以使用 request//类HttpServletRequest的对象 response//类HttpServletResponse的对象 application//ServletContext类的对象 session//类HttpSession的对象
<jsp:include page ="xxx.jsp"/>
<jsp:forward page="xxx.jsp"/>是运行时的请求包含和请求转发。
<%@include file="xxx.jsp"%>是编译期的文件包含
EL表达式的11个内置对象
pageScope,requestScope,sessionScope,applicationScope,param,paramValues;header;headerValues;initParam;cookie;pageContext;
基本都是Map类型,只做读操作
其中有四个jsp内置对象
pageScope//${pageScope.name}等同于pageContext.getAttribute(“name”); requestScope//${requestScope.name}等同于request.getAttribute(“name”); sessionScope//${sessionScope.name}等同于session.getAttribute(“name”); applicationScope//${applicationScope.name}等同于application.getAttribute(“name”);
全域查找:
${person}表示依次在pageScope、requesScopet、sessionScope、appliationScope四个域中查找名字为person的属性。
其他EL内置对象解释
param //${param.username}等效于request.getParameter("username"); //如果参数不存在,返回空字符串,不是null header //获取请求头中信息,比如${header.Host} initParam//对应了web.xml中的 <context-param>
监视器
在三大域ServletContext,HttpSession和ServletRequest在如下事情发生时,做出响应。
下面以ServletContext为例,其他2个类似。
1创建和销毁
创建类,实现接口ServletContextListener
public class AListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { //................ } @Override public void contextDestroyed(ServletContextEvent sce) { //....................... } }
在web.xml中添加
<listener> <listener-class>com.hello.AListener</listener-class> </listener>
2.属性操作。(添加属性,修改属性,移除属性)
创建类,实现接口ServletContextAttributeListener
public class BListener implements ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent scab) { System.out.println("您向application中添加了一个名为" + scab.getName() + ", 值为:" + scab.getValue() + "的属性"); } public void attributeReplaced(ServletContextAttributeEvent scab) { System.out.println(scab.getName() + "=" + scab.getValue() + ", " + scab.getServletContext().getAttribute(scab.getName())); } public void attributeRemoved(ServletContextAttributeEvent scab) { System.out.println(scab.getName() + "=" + scab.getValue()); } }
在web.xml添加
<listener> <listener-class>com.hello.BListener</listener-class> </listener>
过滤器
过滤器的操作
先定义一个类实现Filter接口,然后在web.xml配置该Filter
public class AFilter implements Filter { /** * 创建之后马上执行,用来做初始化! */ public void init(FilterConfig filterConfig) throws ServletException { } /** * 每次过滤时都会执行 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("AFilter#start"); chain.doFilter(request, response);//放行! System.out.println("AFilter#end"); } /** * 销毁之前执行,用来做对非内存资源进行释放 */ public void destroy() { } }
<filter> <filter-name>AFilter</filter-name> <filter-class>com.hello.AFilter</filter-class> </filter> <filter-mapping> <filter-name>AFilter</filter-name> <url-pattern>/AServlet</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping>
注意:1Filter类是全局单例,每一个类有仅有一个对象。
2.每一个Filter作用于一个URL,如果一个URL被多个Filter作用,该URL上的filter按照web.xml中Filter出现的
顺序依次执行。Filter类中的chain.doFilter方法就是让过滤链上的下一个Filter作用。
3.<dispatcher>配置可以没有,(此时默认为REQUEST)可以是REQUEST,FORWARD,INCLUDE,ERROR中若干组合。
表明该URL以这种方式被访问时,Filter才会作用。