实验三Servlet应用(第3次实验,2学时,设计性)一、实验目的和要求1.了解Servlet的工作原理和生命周期;2.理解Servlet的常用接口和类;3.了解过滤器和监听器的作用:4.了解过滤器链。5.掌握过滤器和监听器的开发与部署的步骤;6.掌握过滤器和监听器的应用。二、实验内容1.编写一个过滤器改变编码方式(请求和响应)。2.编写一个ServletRequestListener事件监听器,记录某个页面自应用程序启动以来被访问的次数。三、实验原理1.过滤器是Web服务器上的组件,它们对客户和资源之间的请求和响应进行过滤。2.过滤器的工作原理是:当Servlet容器接收到对某个资源的请求,它要检查是否有过滤器与之关联。如果有过滤器与该资源关联,Servlet容器将把该请求发送给过滤器。在过滤器处理完请求后,它将做下面3件事:·产生响应并将其返回给客户;·如果有过滤器链,它将把(修改过或没有修改过)请求传递给下一个过滤器;·将请求传递给不同的资源。当请求返回到客户时,它是以相反的方向经过同一组过滤器返回。过滤器链中的每个过滤器够可能修改响应。3.过滤器API主要包括:Filter、FilterConfig和FilterChain接口。4.在Web应用程序中,事件的处理也是通过事件监听器接口处理的。Web应用事件处理的原理为:当Web应用中某些状态改变时,Servlet容器就产生某种事件,如ServletContext对象初始化时会产生ServletContextEvent事件,此时Servlet容器就会从注册的事件监听器中寻找处理该事件的监听器对象,并执行相应的代码。5.在Servlet2.4规范中共定义了6种事件类型和8个事件监听器接口,它们可以处理三种对象上的事件ServletContext、HttpSession和ServletRequest。四、实验步骤1.打开Eclipse,File->New->DynamilWebProject,命名test3。2.将jstljar和standard.jar复制到WEB-INF的lib目录下。3.在src目录下添加filter和listener。4.在WebContent目录下新建*jsp。5.新建Servlet
1 实验三 Servlet 应用 (第 3 次实验,2 学时,设计性) 一、实验目的和要求 1. 了解 Servlet 的工作原理和生命周期; 2. 理解 Servlet 的常用接口和类; 3. 了解过滤器和监听器的作用; 4. 了解过滤器链。 5. 掌握过滤器和监听器的开发与部署的步骤; 6. 掌握过滤器和监听器的应用。 二、实验内容 https://wenku.baidu.com/view/ddd7434577eeaeaad1f34693daef5ef7ba0d1291.html 1. 编写一个过滤器改变编码方式(请求和响应)。 2. 编写一个 ServletRequestListener 事件监听器,记录某个页面自应用程序启动以来被访问 的次数。 三、实验原理 1. 过滤器是 Web 服务器上的组件,它们对客户和资源之间的请求和响应进行过滤。 2. 过滤器的工作原理是:当 Servlet 容器接收到对某个资源的请求,它要检查是否有过滤 器与之关联。如果有过滤器与该资源关联,Servlet 容器将把该请求发送给过滤器。在 过滤器处理完请求后,它将做下面 3 件事: 产生响应并将其返回给客户; 如果有过滤器链,它将把(修改过或没有修改过)请求传递给下一个过滤器; 将请求传递给不同的资源。 当请求返回到客户时,它是以相反的方向经过同一组过滤器返回。过滤器链中的每个 过滤器够可能修改响应。 3. 过滤器 API 主要包括:Filter、FilterConfig 和 FilterChain 接口。 4. 在 Web 应用程序中,事件的处理也是通过事件监听器接口处理的。Web 应用事件处理 的原理为:当 Web 应用中某些状态改变时,Servlet 容器就产生某种事件,如 ServletContext 对象初始化时会产生 ServletContextEvent 事件,此时 Servlet 容器就会从 注册的事件监听器中寻找处理该事件的监听器对象,并执行相应的代码。 5. 在 Servlet 2.4 规范中共定义了 6 种事件类型和 8 个事件监听器接口,它们可以处理三种 对象上的事件 ServletContext、HttpSession 和 ServletRequest。 四、实验步骤 1. 打开 Eclipse,File->New->Dynamil Web Project,命名 test3。 2. 将 jstl.jar 和 standard.jar 复制到 WEB-INF 的 lib 目录下。 3. 在 src 目录下添加 filter 和 listener。 4. 在 WebContent 目录下新建*.jsp。 5. 新建 Servlet
6.测试运行。五、参考程序1.实验如下:(1)编写login.jsp页面<%@ page language="java"contentType="text/htmL;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC"-//W3C//DTDHTML4.o1Transitional//EN""http://www.w3.org/TR/html4/1oose.dtd"<html><headx<meta http-equiv="Content-Type"content-"text/html; charset=UTF-8"><title>实验31:使用过滤器改变请求编码</title></head><body><center><h2>用户登录</h2><form action="LoginServlet"method-"post"<table><tr>td>用户名:</td><td><inputtype="text"name="username"/td></tr><tr><td>密码:</td><td><inputtype-"text"name="password"×/td></tr><tr>td colspan-"2"align-"center"><inputtype-"submit"value-"提交"></td></tr></table></form></center></body></html>(2)创建处理请求的Servlet:LoginServlet.javapackage ycu.hx.servlet;import java.io.IoException;importiava.io.Printwriter:import javax.servlet.ServletException;importt javax.servlet.annotation.WebServletimportjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet (private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,HttpServletResponseresponse)throws ServletException,IoException (doPost(request,response);protectedvoid doPost(HttpServletRequest request,HttpServletResponseresponse)throws ServletException,IoException(String username = request.getParameter("username");String userpwd = request.getParameter("password");System.out.println("您输入的用户名是:"+username+",密码是:"+userpwd);Printwriter out = response.getwriter();out.print("您输入的用户名是:"+username+",密码是:“+userpwd);2
2 6. 测试运行。 五、参考程序 1. 实验如下: (1)编写 login.jsp 页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>实验3_1:使用过滤器改变请求编码</title> </head> <body> <center> <h2>用户登录</h2> <form action="LoginServlet" method="post"> <table> <tr><td>用户名:</td><td><input type="text" name="username"></td></tr> <tr><td>密码:</td><td><input type="text" name="password"></td></tr> <tr><td colspan="2" align="center"><input type="submit" value="提交 "></td></tr> </table> </form> </center> </body> </html> (2)创建处理请求的 Servlet:LoginServlet.java package ycu.hx.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String userpwd = request.getParameter("password"); System.out.println("您输入的用户名是:" + username + ",密码是:" + userpwd); PrintWriter out = response.getWriter(); out.print("您输入的用户名是:" + username + ",密码是:" + userpwd);
out.close();、Dhttp:/localhost:8080/test3/loginjsp用户登录用户名:张三密码:zhangsan提文#thttp://localhost:8080/test3/LoginServlet2??????察热笙?????zhangsanXX500000、-0SnippetsProblemsConsoleMatkersPropeTiesllServersnDataSourceExplTomcatv8.0Senveratlocalbost[ApacbeTomcatlC:Uavalire1.8/biniavaw.exe(2020tr4月17日下t4:04:18信息:Server startup in 5595 ms四月17,20204:e4:27下午org.apache.catalina.core.ApplicationContextlog信息:添加一个属性:org.apache.jasper.runtime.JspApplicationcontextImpl:org.apache.jasper.runtime.JspAp您输入的用户名是:%a,,密码是:zhangsan(3)创建改变编码的过滤器EncodingFilter.javapackage ycu.hx.filter,importjava.io.IOException;import javax.servlet.Filter,import javax.servlet.FilterChain,importjavax.servlet.FilterConfig,importjavax.servlet.ServletException;import javax.servlet.ServletRequest,import javax.servlet.ServletResponse;importjavax.servlet.annotation.WebFilter,@WebFilter("/*")publicclassEncodingFilterimplementsFilterpublicvoiddestroyOpublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChain chain)throwsIOException,ServletExceptionrequest.setCharacterEncoding("UTF-8").chain.doFilter(request,response)publicvoidinit(FilterConfigfConfig)throws ServletException)Ehttp://localhost:8080/test3/LoginServlet.?????????察热?????zhangsanMakehs Properties aServen i Data SourceEoploterSnippets ProblemsConsoleTomcat v8.0 Server at localhost [Apache Tomcat] C:Uavaljre1.8)binjavaw.exe (2020年4月17日下年4:06:15)信息:开始协议处理句柄["ajp-nio-80e9"]四月17,20204:06:22下午org.apache.catalina.startup.Catalina start信息:Server startup in5573 ms您输入的用户名是:张三,密码是:zhangsan过滤器的代码再做如下改变后:public void doFilter(ServletRequest request,ServletResponse response,3
3 out.close(); } } (3)创建改变编码的过滤器 EncodingFilter.java package ycu.hx.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; @WebFilter("/*") public class EncodingFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException {} } 过滤器的代码再做如下改变后: public void doFilter(ServletRequest request, ServletResponse response
FilterChain chain)throws IoException,ServletException(request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html"):chain.doFilter(request,response);用户做同样的输入后,执行结果变为:http:/localhost:8080/test3/LoginServletE您输入的用户名是:张三,密码是:zhangsanMarkersPropertiesWSorversDataSourceExplorerSnippetsProblemsConsoleTomcat v8.0 Server at localhost [Apache Tomcat] C:Uavare1.8)binjavaw.exe (2020年4月17日下年4:07:41]信息:Server startup in 567e ms四月17,2e204:e7:50下午org.apache.catalina.core.ApplicationContextlog信息:添加一个属性:org.apache.jasper.runtime.JspApplicationContextImpl:org.apache.jasper.runtime.JspApp您输入的用户名是:张三,密码是:zhangsan2.实现如下:(1)编写监听器AccessCountListenerjavapackage ycu.hx.listener;import javax.servlet.ServletRequestEvent;import javax.servlet.ServletRequestListener;importtjavax.servlet.annotation.WebListener;importjavax.servlet.http.HttpServletRequest;@webListenerpublic class AccessCountListener implements ServletRequestListener (private int count=o;public void requestDestroyed(ServletRequestEvent argo) {HttpServletRequest request(HttpServletRequest)argo.getServletRequest();if(request.getRequestuRI().equals("/test3/index.jsp"))(count++;argo.getservletContext().setAttribute("count",new Integer(count));77public void requestInitialized(ServletRequestEvent argo){1(2)index.jsp<body>欢迎您,您的IP地址是<%=request.getRemoteAddr()%<p>自应用程序启动以来,该页面被访问了<font_color="bLue"><%=application.getAttribute("count")%></font>次<br></body>(3)该页面的某次运行结果如下图所示:http://localhost:8080/test3/index.jsp4欢迎您,您的IP地址是0:0:0:0:0:0:0:1自应用程序启动以来,该页面被访问了2次
4 FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); chain.doFilter(request, response); } 用户做同样的输入后,执行结果变为: 2. 实现如下: (1)编写监听器 AccessCountListener.java package ycu.hx.listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpServletRequest; @WebListener public class AccessCountListener implements ServletRequestListener { private int count=0; public void requestDestroyed(ServletRequestEvent arg0) { HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest(); if(request.getRequestURI().equals("/test3/index.jsp")){ count++; arg0.getServletContext().setAttribute("count", new Integer(count)); } } public void requestInitialized(ServletRequestEvent arg0) { } } (2)index.jsp <body> 欢迎您,您的IP地址是<%=request.getRemoteAddr()%> <p>自应用程序启动以来,该页面被访问了 <font color="blue"><%=application.getAttribute("count")%></font> 次<br> </body> (3)该页面的某次运行结果如下图所示: