参考答案
过滤器是Servlet2.3规范中定义的一种小型的、可插入的Web组件。用来拦截Servlet容器的请求和响应过程,以便查看、提取客户端和服务器之间正在交换的数据。过滤器通常是封装了一些功能的Web组件,这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。典型的应用包括记录请求和响应的数据、管理会话属性等。
参考答案
过滤器的开发步骤如下;
1. 编写一个Java类,实现Filter接口。
2. 在doFilter方法中实现拦截处理逻辑。
3. 将过滤器添加到Web程序中。
4. 把过滤器和Web应用一起打包部署。
参考答案
本题正确答案为C。
A选项说法错误。如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用各个过滤器。
B选项说法错误。过滤器既可以过滤请求动作,也可以过滤响应动作。
D选项说法错误。编写过滤器时实现javax.servlet.Filter接口即可。
参考答案
Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。
参考答案
本案例在课后练习“为NETCTOSS系统的登录增加验证码功能”基础上完成。通过监听session的创建动作,修改存储访问NETCTOSS系统的计数器。这个计数器保存在Servlet上下文中。
步骤一:新建CountListener类
新建CountListener类,该类实现HttpSessionListener接口,并实现sessionCreated方法;在该方法中实现访问NETCTOSS系统的计数功能,代码如下所示:
package web; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class CountListener implements HttpSessionListener { private int count = 0; public void sessionCreated(HttpSessionEvent se) { count++; HttpSession session = se.getSession(); ServletContext sct = session.getServletContext(); sct.setAttribute("count", count); } public void sessionDestroyed(HttpSessionEvent se) { } }
步骤二:配置监听器
在web.xml中配置监听器CountListener,代码如图-1所示。
图 -1
步骤三:修改listAccount.jsp页面
修改listAccount.jsp页面中的代码,添加获取计数的信息,代码如图-2所示。
图– 2
步骤四:运行查看结果
访问login.jsp页面,输入正确的帐号、密码以及验证码,如图-3所示。
图–3
点击“登录”按钮,成功登录后进入listAccount.jsp页面,如图-4所示。
图– 4
从listAccount.jsp页面上可以看出NETCTOSS系统被访问过1次。
由于Chrome浏览器再打开选项卡也是与第一个窗口共用sessionId,所以使用火狐浏览器来模拟第二个上线的用户。
打开火狐浏览器,访问login.jsp页面,输入正确的帐号、密码以及验证码,如图-5所示。
图–5
点击“登录”按钮,成功登录后进入listAccount.jsp页面,如图-6所示。
图– 6
从页面可以看出,NETCTOSS系统被访问过2次。回到Chrome浏览器,点击刷新,查看结果如图-7所示。
图 -7
从Chrome浏览器上的显示结果可以看出,点击火狐浏览器中的登出,然后回到Chrome浏览器刷新页面,查看的结果是一致的。
本案例的完整代码如下。
CountListener的完整代码如下所示:
package web; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class CountListener implements HttpSessionListener { private int count = 0; public void sessionCreated(HttpSessionEvent se) { count++; HttpSession session = se.getSession(); ServletContext sct = session.getServletContext(); sct.setAttribute("count", count); } public void sessionDestroyed(HttpSessionEvent se) { } }
web.xml文件的完整代码如下所示:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>actionServlet</servlet-name> <servlet-class>web.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>actionServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet> <servlet-name>ValidateCode</servlet-name> <servlet-class>web.ValidateCode</servlet-class> </servlet> <servlet-mapping> <servlet-name>ValidateCode</servlet-name> <url-pattern>/code</url-pattern> </servlet-mapping> <!-- 监听器 --> <listener> <listener-class>web.CountListener</listener-class> </listener> </web-app>
listAccount.jsp文件完整代码如下所示:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="entity.*,java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>达内-NetCTOSS</title> <link type="text/css" rel="stylesheet" media="all" href="styles/global.css" /> <link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" /> <script language="javascript" type="text/javascript"> //删除 functiondeleteAccount(accountid) { var r = window.confirm("确定要删除此账务账号吗?\r\n删除后将不能恢复,且会删除其下属的所有业务账号。"); document.getElementById("operate_result_info").style.display = "block"; } //开通或暂停 functionsetState() { var r = window.confirm("确定要开通此账务账号吗?"); document.getElementById("operate_result_info").style.display = "block"; } </script> </head> <body> <!--Logo区域开始--> <div id="header"> <img src="../images/logo.png" alt="logo" class="left" /> <a href="#">[退出]</a> </div> <!--Logo区域结束--> <!--导航区域开始--> <div id="navi"> <ul id="menu"> <li> <a href="../index.html" class="index_off"></a> </li> <li> <a href="../role/role_list.html" class="role_off"></a> </li> <li> <a href="../admin/admin_list.html" class="admin_off"></a> </li> <li> <a href="../fee/fee_list.html" class="fee_off"></a> </li> <li> <a href="../account/account_list.html" class="account_on"></a> </li> <li> <a href="../service/service_list.html" class="service_off"></a> </li> <li> <a href="../bill/bill_list.html" class="bill_off"></a> </li> <li> <a href="../report/report_list.html" class="report_off"></a> </li> <li> <a href="../user/user_info.html" class="information_off"></a> </li> <li> <a href="../user/user_modi_pwd.html" class="password_off"></a> </li> </ul> </div> <!--导航区域结束--> <!--主要区域开始--> <div id="main"> <form action="" method=""> <!--查询--> <div class="search_add"> <div> 身份证: <input type="text" value="不验证" class="text_search" /> </div> <div> 姓名: <input type="text" class="width70 text_search" value="不验证" /> </div> <div> 登录名: <input type="text" value="不验证" class="text_search" " /> </div> <div> 状态: <select class="select_search"> <option> 全部 </option> <option> 开通 </option> <option> 暂停 </option> <option> 删除 </option> </select> </div> <div> <input type="button" value="搜索" class="btn_search" /> </div> <input type="button" value="增加" class="btn_add" onclick="location.href='addAccount.jsp';" /> </div> <!--删除等的操作提示--> <div id="operate_result_info" class="operate_success"> <img src="../images/close.png" onclick="this.parentNode.style.display='none';" /> 删除成功,且已删除其下属的业务账号! </div> <!--数据区域:用表格展示数据--> <div id="data"> <table id="datalist"> <tr> <th colspan="6"> NETCTOSS系统被访问过<%=application.getAttribute("count")%>次 </th> </tr> <tr> <th> 账号ID </th> <th> 姓名 </th> <th class="width150"> 身份证 </th> <th> 登录名 </th> <th> 状态 </th> <th class="width200"></th> </tr> <% List<Account> accounts = (List<Account>) request .getAttribute("accounts"); for (Account account : accounts) { String strStatus = ""; if ("1".equals(account.getStatus())) { strStatus = "暂停"; } elseif ("2".equals(account.getStatus())) { strStatus = "删除"; } else { strStatus = "开通"; } %> <tr> <td><%=account.getAccountId()%></td> <td> <a href="account_detail.html"><%=account.getRealName()%></a> </td> <td><%=account.getIdcardNo()%></td> <td><%=account.getLoginName()%></td> <td><%=strStatus%></td> <td class="td_modi"> <input type="button" value="暂停"class="btn_pause" onclick="setState();" /> <input type="button" value="修改" class="btn_modify" onclick="location.href='load.do?accountId=<%=account.getAccountId()%>'" /> <input type="button" value="删除" class="btn_delete" onclick="location.href='delete.do?accountId=<%=account.getAccountId()%>'" /> </td> </tr> <% } %> </table> </div> <!--分页--> <div id="pages"> <a href="#">首页</a> <a href="#">上一页</a> <a href="#" class="current_page">1</a> <a href="#">2</a> <a href="#">3</a> <a href="#">4</a> <a href="#">5</a> <a href="#">下一页</a> <a href="#">末页</a> </div> </form> </div> <!--主要区域结束--> <div id="footer"> <p> [源自北美的技术,最优秀的师资,最真实的企业环境,最适用的实战项目] </p> <p> 版权所有(C)加拿大达内IT培训集团公司 </p> </div> </body> </html>