1. RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,甚至是HTML页面,来处理对请求的响应。
(1)RequestDispatcher对象由Servlet容器来创建,封装一个由路径所标识的服务器资源。
RequestDispatcher接口中定义了二种方法用于请求转发:
forward(ServletRequest,ServletResponse)方法,将请求转发给服务器上资源处理,必须在响应被提交给客户端之前调用,否则抛出异常。方法调用后在响应中的没有提交的内容被自动消除。
include(ServletRequest,ServletResponse)方法 :用于在响应中包含其他资源的内容。即请求转发后,转发到的Servlet对请求做出的响应将并入原先Servlet的响应对象中。
forward方法和include方法的区别:
forward方法调用后主导权在另一个资源中,在响应中的没有提交的内容被自动消除。 include方法:被调用的Servlet虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的Servlet。换言之,被调用的Servlet如果产生任何HTTP回应,将会并入原来的HttpResponse对象。
(2) 得到RequestDispatcher对象
1,利用ServletRequest接口中的getRequestDispatcher(String path)方法。
2,ServletContext接口中getNamedDispatcher(String path)和getRequestDispatcher(String path)方法。
ServletRequest接口和ServletContext接口中getRequestDispatcher方法区别:
1,参数的区别
参数虽然都是资源路径名,ServletContext接口的中参数路径必须以“/”开始,是相对于当前Servlet上下文根, ServletRequest接口中的参数路径不仅可以相对于当前Servlet上下文根,还可以相对与当前Servlet路径
2,跨WEB应用程序访问资源
通过ServletContext.getContext()方法获取另个WEB应用程序的上下文环境对象来 调用getRequestDispatcher(String path)方法将请求转发到另个WEB应用程序的资源。还需要在当前WEB应用程序配置中设置<context>元素,指定crossContext属性值为true。
(3),ServletResqonse接口中的sendRedirect()方法和forward()方法的区别
sendRedirect()方法原理:
1,客户端发送请求,Servlet1做出处理。
2,Servlet1调用sendReadirect()方法,将客户端的请求 重新定位 到Servlet2。
3,客户端浏览器访问Servlet2.
4,Servlet2对客户端浏览器做出响应。
forward()方法原理:
1,客户端发送请求,Servlet1做出处理。
2,Servlet1调用forward()方法,将请求转发给Servlet2来处理请求,为客户端服务。
3,Servlet2对客户端浏览器做出响应。
区别: 1,定位与转发
sendRedirect()方法实际上是告诉浏览器Servlet2所在的位置,让浏览器重新访问Servlet2。调用 sendRedirect()方法,会在响应中设置Location响应报头。显示的URL是重定向之后的URL,
forward()方法是转发到另外一个资源来处理请求。URL不会变化。隐藏了处理对象的变化。
2,处理请求的资源的范围
sendReadirect()方法可以跨WEB应用程序和服务器重新定位资源来处理请求。forward()方法只能在应用程序内部转发。
2.
127.0.0.1 request..getRemoteAddr();
request.getRemoteHost();
/oa/HelloWorldServlet request.getRequestURI()
http://127.0.0.1:8080/oa/HelloWorldServlet request.getRequestURL().toString();
/HelloWorldServlet request.getServletPath();
/oa request.getContextPath()
3.监听器
(1)种类
1) 监听web应用
a) ServletContextListener:用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
b).ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。
2)监听会话
c).HttpSessionListener:用于监听Session对象的创建和销毁,监听器类需要实现,只要有用户与 server连接,就算连接的是一个空白的jsp页面,会触发session事件,用来统计当前在线用户数最合适
d).HttpSessionActivationListener:用于监听Session对象的钝化/活化事件,监听器类需要实现 javax.servlet.http.HttpSessionListener接口或者 javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。
e).HttpSessionAttributeListener:用于监听Session对象属性的改变事件,监听器类需要实现javax.servlet.http.HttpSessionAttributeListener接口。
3)监听客户端请求
ServletRequestListener :ServletRequestAttributeListener和其他相关类。这些类可以用来管理和控制与ServletRequest动作有关的事件。
ServletRequestAttributeListener
eg:
public class SessionCount implements HttpSessionListener{
private static int count=0;
public void sessionCreated(HttpSessionEvent se){
count++;
System.out.println(“session创建:”+new java.util.Date());
}
public void sessionDestroyed(HttpSessionEvent se){
count--;
System.out.println(“session销毁:”+new java.util.Date());
}
public static int getCount(){
return(count);
}
}
3. Filter
可以对客户提交的数据进行重新编码,可以从系统中获得配置的信息,可以过滤掉客户的某些不应出现的词汇,可以验证客户是否已经登陆,可以记录系统的日志等
init(FilterConfig config)
void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain)
destroy()
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.jspdev.ch8.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/security/*</url-pattern>
</filter-mapping>