原创讲解JSPqo器和监听?
BeanSoft(刘长? 2007q?1?
关于q个问题, 比较复杂的说. 不过我希望通过例子来解释会方便理解一?
假设有一个非常危险的d, 是九M? 需要你揣着炸药包从北^开车走高速\q保定去矛_庄把鬼子的碉堡给怺. 注意: q个d十分艰巨, 有可能半路炸药爆? 所以出发前你需要苦l?0元一本的<<铁布?gt;>, q需要立遗嘱交代一下后? 下面是\U图:
L路线: 北^ ==> 高速\收费站入?都有警察和警? A ==> 保定收费?B ==> 矛_庄收费站 C ==> 炸碉?D ==> 转R(刚才的R已经炸没? E =>
回来路线: 矛_庄收费站 ==> 保定收费?==> 高速\收费站出?都有警察和警? A ==> 安全回到北^ G
那么我们先简介可能发生的情况. A Ҏ可能被警察和警犬发现, 所以你只能被扭送回北^. 即不被发现, q可能出现收Ҏ发现10个现大洋一个\口的买\钱没?! ? 只能又回M. q有最惨的: 高速\入口写着: 对不? 到石家庄的\U因为施工不? 只好回家{着?
CB和C你可能还会被人发现带了炸药包, 或者发C路费带? 极有可能又被扭送回北^, 注意已经在半道了, 是不会让你l到矛_庄的, 所以你会被从R上逮下? 然后转到警R上带回来! 也就是从 B 或?C 直接q回.
好了, 最x况就是你怺堡, 也成功的q回? 然后你可以开心的?lt;<铁布?gt;>扔了, 然后宣告遗嘱作废.
OK, 以上q程, 是qo器和监听器的真实案例.
那么炸碉堡这个Q? q当于要调?JSP 或?Servlet 来获得执行结?炸碉?D ). 在执行之前你需要做一些准备工? 相当于要写一?br />监听?com.allanlxf.ums.web.ServiceListener
在里面你可以做一些事情例如初始化资源, 例如上文的苦l?lt;<铁布?gt;>, 立遗? q个相当于代码中?
public void contextInitialized(ServletContextEvent sce) q样一个初始化事g.
那么在整个Q务完成之? q些事情你就要考虑应该作废? 所以需?br />public void contextDestroyed(ServletContextEvent sce) q样一个销毁事? 例如?lt;<铁布?gt;>扔了, 然后宣告遗嘱作废, 也就是收回资?
那么qo器在哪里? 它位于Q务的 A B C ? 注意是双向\E都会经q的. 也就是请求和响应都会l过. 但是qo器也会检查不同的情况, 例如 A 点实际上有两个过滤功? 查炸药包和收买\? q就相当于配|了:
sessionFilter
* *.do
* REQUEST
* FORWARD
两个qo功能都要? 如果成功了怎么办呢? 会l让你走下一个\? 注意不是让你直接成功. 也就是代?
if(session.getAttribute("user") != null || path.equals("/login"))//若用户已l登录ƈ且当前\径仍然停留在d面 {
chain.doFilter(request, response);//l箋C面的qo器或者Q?不保证最lQ? 因ؓ下个qo器也可能让你回来)
只有当走?C 点的时? 下一步才是执行了最l的d: 执行JSP或者Servlet.
}
反过来怎么? 把你扭送上警R, q回! q样你连路口 B C 和最lQ务都无法讉K? 也就是不会让你访问下一个过滤器和执行最l的 JSP 或?Serlvet, 可以选择直接q回, 或者放警R上带回去.
{
return;// 直接q回
或?response.sendRedirect(request.getContextPath() + "/login.jsp");//则扭送上警R, q回到警察局
}
那么?E 点发生了什? 也就是你可能替换掉了原来?response 对象, 也就是换? q意味着你可以在qo器里U下修改h和响应对?
虽然已经不那么抽象了, 但是要理解可能还是需要耐心体会?
=====================================================================
? 原始问题
1.L下面一D代码和其注?
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class SessionFilter extends HttpFilter
{
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException
{
String path = request.getServletPath();//取得该servlet的\径名U?
path = path.substring(0, path.indexOf(".")); //获得路径?之前的部?
HttpSession session = request.getSession();//从请求中取得session为得是从session中读取用h否登录的标志?
if(session.getAttribute("user") != null || path.equals("/login"))//若用户已l登录ƈ且当前\径仍然停留在d面
{
* chain.doFilter(request, response);//则将当前滤镜加入到o镜链条当?
}else//若用户尚未成功登?
{
response.sendRedirect(request.getContextPath() + "/login.jsp");//则用请求重定向转到d面
}
}
}
/*
* 该Filter滤镜cLqo的是用户在浏览器中输入的
* 当前web application的访问\?通过判断用户?
* 否成功登录而决定是否对讉K路径加以限止
* 在该web application的web.xml配置文g中ؓ
* 该filte滤镜做了相应配置
*/
请问: 上面代码FilterChain对象盛装的是Filter对象, 可它是怎么工作的啊?
?L语句是何用意?不是qo路径? Z么要请求与响应加入?
2.L下面一D代?
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public abstract class HttpFilter implements Filter
{
private FilterConfig config;
public void init(FilterConfig config) throws ServletException
{
this.config = config;
init();
}
public void init() throws ServletException
{
}
public String getInitParameter(String name)
{
return config.getInitParameter(name);
}
public ServletContext getServletContext()
{
return config.getServletContext();
}
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException
{
doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);
}
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException;
public void destroy()
{
}
}
请问: 该类p样写了一?没有包含M行ؓ,它如何完成过滤工作啊?
3.L下面代码:
package com.allanlxf.ums.web;
import javax.servlet.*;
//import javax.servlet.http.*;
import com.allanlxf.ums.service.SystemService;
import com.allanlxf.ums.service.StudentService;
public class ServiceListener implements ServletContextListener
{
public void contextInitialized(ServletContextEvent sce)
{
ServletContext application = sce.getServletContext();
StudentService service = new StudentService();
application.setAttribute("studentService", service);
SystemService systemService = new SystemService();
application.setAttribute("systemService", systemService);
}
public void contextDestroyed(ServletContextEvent sce)
{
}
}
/*
*本类是该web application的监听器c?在该cM,
*两个无为本pȝ提供服务的两个对象写入到?
*application隐含对象?q样保证在该pȝ的Q?
*地方都能够取得这两个服务cd象的引用)
*在本pȝ的web.xml文g中对该监听器做了配置
*/
请问: Z么要服务类对象写入到程序上下文中呢,直接创徏不也一样吗?
监听器只有这L功能?是否q有其它功能?
3.L下面的配|文件内?
sessionFilter
com.allanlxf.ums.web.SessionFilter
sessionFilter
* *.do
* REQUEST
* FORWARD
com.allanlxf.ums.web.ServiceListener
请问: ?L三项是什么意?
当初老师讲的时?许多基本的原则原理尚不清?q些Ҏ没有听明?当然,老师也未l讲,只说会用卛_, 可是若不能明白其本质,用也只能用这一点儿, 怎么成呢, 希望您能够比较详悉的讲一? thank you very much!

文章来源:http://www.aygfsteel.com/beansoft/archive/2007/11/09/159374.html
]]>