第8章 Servlet高级.docx
《第8章 Servlet高级.docx》由会员分享,可在线阅读,更多相关《第8章 Servlet高级.docx(25页珍藏版)》请在冰豆网上搜索。
第8章Servlet高级
第8章Servlet高级
案例8-1实现第一个Filter程序
一、案例描述
1、考核知识点
名称:
实现第一个Filter程序
编号:
028008002
2、练习目标
Ø掌握实际开发中Filter程序的基本实现和使用。
3、需求分析
Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。
在网站开发中,可以使用filter来进行路径过滤,对一些未登录用户进行拦截强制跳转到登录页面,对于主动登录的访问直接不用过滤直接跳转到登录页面。
本案例将演示如何编写简单的路径请求过滤跳转功能。
4、设计思路(实现原理)
1)创建LoginServlet类跳转到登录页面,
2)创建OrderServlet类编写跳转订单页面的功能,
3)创建MyFilter1类过滤器,对于未登陆用户进行过滤跳转到登录页面,
4)创建index.jsp网站首页面,有登录和查看订单链接功能,
5)创建login.jsp网站登录页面,
6)在web.xml中配置初始化参数和类的映射
7)通过浏览器访问index.jsp,展现页面servlet处理响应信息。
二、案例实现
编写LoginServlet,其代码如下:
publicclassLoginServletextendsHttpServlet{
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
doGet(req,resp);
}
}
编写OrderServlet,其代码如下:
publicclassOrderServletextendsHttpServlet{
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
req.getRequestDispatcher("/order.jsp").forward(req,resp);
}
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
doGet(req,resp);
}
}
编写MyFilter1,其代码如下:
publicclassMyFilter1implementsFilter{
publicvoidinit(FilterConfigfConfig)throwsServletException{
//过滤器对象在初始化时调用,可以配置一些初始化参数
}
publicvoiddoFilter(ServletRequestreq,ServletResponseresp,
FilterChainchain)throwsIOException,ServletException{
//用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
HttpServletRequestrequest=(HttpServletRequest)req;
Stringusername=(String)request.getSession().getAttribute("username");
if(username==null){
request.getRequestDispatcher("/login.jsp").forward(request,resp);
return;
}
chain.doFilter(request,resp);
}
publicvoiddestroy(){
//过滤器对象在销毁时自动调用,释放资源
}
}
编写index.jsp,其代码如下:
您好,请登录 我的订单
欢迎访问本网站!
!
!
编写login.jsp,其代码如下:
用户名:
密码:
配置web.xml文件:
MyFilter1
cn.itheima.MyFilter1
MyFilter1
/OtherServlet/*
LoginServlet
cn.itheima.LoginServlet
LoginServlet
/UserServlet/Login
OrderServlet
cn.itheima.OrderServlet
OrderServlet
/OtherServlet/order
启动Tomcat服务器,在地址栏中输入http:
//localhost:
8080/chapter08/index.jsp,浏览器显示的结果如下图所示:
然后点击登录链接,查看请求链接地址,同时浏览器显示的结果如下图所示:
然后再返回网站首页index.jsp,点击我的订单链接,查看请求链接地址,同时浏览器显示的结果如下图所示(过滤器对路径进行了拦截跳转):
三、案例总结
1、要学会理解filter过滤器的基本使用和配置
2、本案例简单模仿了不同路径的拦截,对于登陆或者注册等用户请求路径直接过掉不进行过滤,而对于其他路径请求,比如查看订单以及其他商品查看等等都需要进行路径过滤,先查看用户是否已经登录,如果登录直接放行,否者进行拦截跳转到登录页面。
案例8-2Filter映射
一、案例描述
1、考核知识点
名称:
Filter映射
编号:
028008003
2、练习目标
Ø熟悉Filter映射的基本使用和注意点。
3、需求分析
编写filter过滤器很容易实现,但针对不同路径请求进行过滤配置时,配置filter映射也尤其重要,对于多种类似路径可以使用多个路径映射,也可以使用类似通配符路径映射。
本案例将模拟使用多种方式进行演示filter过滤器映射配置并显示配置效果。
4、设计思路(实现原理)
1)创建Servlet1和Servlet1;
2)创建MyFilter2类过滤器,
3)在web.xml中配置初始化参数和类的映射
4)通过浏览器分别访问Servlet1和Servlet2,查看页面效果。
二、案例实现
编写Servlet1,其代码如下:
publicclassServlet1extendsHttpServlet{
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
PrintWriterout=resp.getWriter();
out.write("HelloServlet1");
}
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
doGet(req,resp);
}
}
编写Servlet2,其代码如下:
publicclassServlet2extendsHttpServlet{
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
PrintWriterout=resp.getWriter();
out.write("HelloServlet2");
}
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
doGet(req,resp);
}
}
编写MyFilter2,其代码如下:
publicclassMyFilter2implementsFilter{
publicvoidinit(FilterConfigfConfig)throwsServletException{
//过滤器对象在初始化时调用,可以配置一些初始化参数
}
publicvoiddoFilter(ServletRequestreq,ServletResponseresp,
FilterChainchain)throwsIOException,ServletException{
//用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriterout=resp.getWriter();
out.write("HelloMyFilter2");
}
publicvoiddestroy(){
//过滤器对象在销毁时自动调用,释放资源
}
}
配置web.xml文件:
MyFilter2
cn.itheima.MyFilter2
MyFilter2
/*
Servlet2
cn.itheima.Servlet2
Servlet2
/Servlet2
Servlet1
cn.itheima.Servlet1
Servlet1
/Servlet1
启动Tomcat服务器,在地址栏中输入http:
//localhost:
8080/chapter08/Servlet1,浏览器显示的结果如下图所示:
再在地址栏中输入http:
//localhost:
8080/chapter08/Servlet2,浏览器显示的结果同样如上图所示,所有的路径访问都被filter过滤器拦截到。
修改web.xml中的配置文件,修改如下:
MyFilter2
cn.itheima.MyFilter2
MyFilter2
/Servlet*
Servlet2
cn.itheima.Servlet2
Servlet2
/Servlet2
Servlet1
cn.itheima.Servlet1
Servlet1
/Servlet1
启动Tomcat服务器,在地址栏中输入http:
//localhost:
8080/chapter08/Servlet1,浏览器显示的结果如下图所示:
再在地址栏中输入http:
//localhost:
8080/chapter08/Servlet2,浏览器显示的结果如下图所示:
以上使用/Servlet*的配置方式完全没有过滤效果,然后再次修改web.xml文件如下:
MyFilter2
cn.itheima.MyFilter2
MyFilter2
/User/*
Servlet2
cn.itheima.Servlet2
Servlet2
/Other/Servlet2
Servlet1
cn.itheima.Servlet1
Servlet1
/User/Servlet1
启动Tomcat服务器,在地址栏中输入http:
//localhost:
8080/chapter08/User/Servlet1,浏览器显示的结果如下图所示(路径被过滤器拦截):
再在地址栏中输入http:
//localhost:
8080/chapter08/Other/Servlet2,浏览器显示的结果如下图所示(路径没有被过滤拦截,直接放行):
三、案例总结
实际开发中在配置filter过滤器映射的时候,会针对一种类型的请求进行路径过滤,针对另一种请求路径直接放行,这就需要了解filter过滤器映射配置的一些方法技巧以及一些通配符的注意事项。
案例8-3Filter链
一、案例描述
1、考核知识点
名称:
Filter链
编号:
028008004
2、练习目标
Ø掌握Filter链的请求与响应的拦截执行拦截顺序以及filter映射配置的影响。
3、需求分析
在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截,但是多个filter映射配置影响到了请求处理的不同。
本案例将模拟使用两个filter进行请求的过滤拦截,查看请求和响应的执行顺序以及filter映射的实际影响。
4、设计思路(实现原理)
1)创建MyFilter3和MyFilter4类,
2)创建FilterChain类,
3)在web.xml中配置映射信息。
4)通过浏览器访问FilterChain,展现页面输出的信息。
二、案例实现
创建MyFilter3类,代码如下:
publicclassMyFilter3implementsFilter{
publicvoidinit(FilterConfigfConfig)throwsServletException{
//过滤器对象在初始化时调用,可以配置一些初始化参数
}
publicvoiddoFilter(ServletRequestreq,ServletResponseresp,
FilterChainchain)throwsIOException,ServletException{
//用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriterout=resp.getWriter();
out.write("MyFilter3before
");
chain.doFilter(req,resp);
out.write("MyFilter3after
");
}
publicvoiddestroy(){
//过滤器对象在销毁时自动调用,释放资源
}
}
创建MyFilter4类,代码如下:
publicclassMyFilter4implementsFilter{
publicvoidinit(FilterConfigfConfig)throwsServletException{
//过滤器对象在初始化时调用,可以配置一些初始化参数
}
publicvoiddoFilter(ServletRequestreq,ServletResponseresp,
FilterChainchain)throwsIOException,ServletException{
//用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriterout=resp.getWriter();
out.write("MyFilter4before
");
chain.doFilter(req,resp);
out.write("MyFilter4after
");
}
publicvoiddestroy(){
//过滤器对象在销毁时自动调用,释放资源
}
}
创建FilterChain类,代码如下:
publicclassFilterChainextendsHttpServlet{
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
PrintWriterout=resp.getWriter();
out.write("FilterChain
");
}
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
doGet(req,resp);
}
}
在web.xml中配置映射信息:
MyFilter3
cn.itheima.MyFilter3