1 简述什么是过滤器?

参考答案

过滤器是Servlet2.3规范中定义的一种小型的、可插入的Web组件。用来拦截Servlet容器的请求和响应过程,以便查看、提取客户端和服务器之间正在交换的数据。过滤器通常是封装了一些功能的Web组件,这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。典型的应用包括记录请求和响应的数据、管理会话属性等。

2 简述过滤器的开发步骤

参考答案

过滤器的开发步骤如下;

1. 编写一个Java类,实现Filter接口。

2. 在doFilter方法中实现拦截处理逻辑。

3. 将过滤器添加到Web程序中。

4. 把过滤器和Web应用一起打包部署。

3 下列说法正确的是()

参考答案

本题正确答案为C。

A选项说法错误。如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用各个过滤器。

B选项说法错误。过滤器既可以过滤请求动作,也可以过滤响应动作。

D选项说法错误。编写过滤器时实现javax.servlet.Filter接口即可。

4 简述什么是监听器

参考答案

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。

5 编写程序,监听用户访问NETCTOSS系统的频度

参考答案

本案例在课后练习“为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>