按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
this。edit(request; response);
} else if (〃update〃。equals(method)) {
this。update(request; response);
65 / 148
…………………………………………………………Page 66……………………………………………………………
} else if (〃remove〃。equals(method)) {
this。remove(request; response);
}
} catch (Exception ex) {
System。err。println(ex);
}
}
为了解决中文编码问题,记得先要给 request 设置 gb2312 编码格式,第二步就
属于我们自己的设计方案了,为了分辨不同的操作,我们为每个请求都附加一个
method 参数,默认下是 method 等于 list,显示所有联系信息的列表。
一大堆的 if else 虽然比较丑,但流程非常直观,根据 method 的值执行对应的
方法。
method=list 的情况。
默认的索引页面 index。jsp 中,将 list。jsp 改成 contact。do?method=list,把
请求转发到 contact。do 顺便再带上操作参数。ContactServlet 里的 list()方法
如下。
/**
* 显示联系信息列表。
*/
public void list(HttpServletRequest request;HttpServletResponse
response)
throws Exception {
List list = contactDao。getAll();
request。setAttribute(〃list〃; list);
request。getRequestDispatcher(〃/list。jsp〃)。forward(request;
response);
}
调用 contactDao 的 getAll()方法获得联系信息列表,然后把 list 放到 request
里,因为 pageContext 是与 jsp 页面对应的,servlet 里要把变量放到 request
作用域里,保证使用 forward 转发请求之后在 jsp 里也可以使用这个变量。
进行操作之后即刻使用 forward 跳转到 list。jsp,记得这里要用 forward 才能
保证 request 中的变量不会消失。这样依赖 list。jsp 中改成从request 中获得
我们需要的数据。
66 / 148
…………………………………………………………Page 67……………………………………………………………
List list = (List) request。getAttribute(〃list〃);
其他的操作都与这个类似,比如把 save。jsp 改成 contact。do?method=save,把
edit。jsp?id=1 改成 contact。do?method=edit&id=1,把update。jsp?id=1 改成
contact。do?method=update&id=1,把 remove。jsp?id=1 改成
contact。do?method=remove&id=1。
经过一轮改造,原来的 save。jsp; update。jsp; remove。jsp 的内容都归入了
ContactServlet。06…02 目录下只剩下index。jsp; list。jsp; create。jsp;
edit。jsp 四个页面,看页面中的链接全部指向了contact。do,这下是不是觉得
清爽多了?
ContactServlet 作为统一的请求转发器发挥着强大的作用,基本所有的请求都
是由它接收并中转的,正因为有它的存在,我们才得以把进行数据库操作的
ContactDao 与表现层的 jsp 隔离开,让处理业务的代码更加集中。
这种分层方式通常被称为 MVC,Model View Controller 三层结构。请求由
Controller (控制器)开始,分发给对应业务代码,Model (模型)代表的数据
模型承担业务操作,最后将得到的结果送到 View (视图)层渲染显示。
这里 ContactServlet 对应的就是 Controller (控制器),用来做请求的分发。
Model (模型)就值得ContactDao 和数据库了,它提供我们需要的各种数据信息。
几个 jsp 构成了 View (视图)这一层,用来显示结果数据。
完整的例子在 lingo…sample/06…02 下,对应的源代码在 WEB…INF/src 下,将
06…02 复制到 tomcat 的webapps 下就可以执行 pile。bat 进行编译。
67 / 148
…………………………………………………………Page 68……………………………………………………………
第 7 章 使用 filter 过滤请求
注意
Filter 虽然很常用,但是覆盖的范围太广,这里我们只介绍设置编码和控制权
限的过滤器,其他的使用方式还需要大家自行积累。
如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:
第 8 章 配置 listener监听器。
1。 了解Filter 的使用。
7。1。 批量设置请求编码
编码问题会不会成为中国人学 java 的标志呢?
通过之前的讨论第 2。2。2 节 “POST 乱码”,我们知道为了避免提交数据的乱
码问题,需要在每次使用请求之前设置编码格式。在你复制粘贴了无数次
request。setCharacterEncoding(〃gb2312〃);后,有没有想要一劳永逸的方法
呢?能不能一次性修改所有请求的编码呢?
用 Filter 吧,它的名字是过滤器,可以批量拦截修改 servlet 的请求和响应。
我们编写一个 EncodingFilter。java,来批量设置请求编码。
package anni;
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;
public class EncodingFilter implements Filter {
public void init(FilterConfig config) throws ServletException {}
public void destroy() {}
public void doFilter(ServletRequest request;
68 / 148
…………………………………………………………Page 69……………………………………………………………
ServletResponse response;
FilterChain chain)
throws IOException; ServletException {
request。setCharacterEncoding(〃gb2312〃);
chain。doFilter(request; response);
}
}
在此 EncodingFilter 实现了 Filter 接口,Filter 接口中定义的三个方法都要
在 EncodingFilter 中实现,其中 doFilter()的代码实现主要的功能:为请求设
置 gb2312 编码并执行 chain。doFilter()继续下面的操作。
与 servlet 相似,为了让 filter 发挥作用还需要在 web。xml 进行配置。
EncodingFilter
anni。EncodingFilter
EncodingFilter
/*
filter 标签部分定义使用的过滤器,filter…mapping 标签告诉服务器把哪些请
求交给过滤器处理。这里的/*表示所有请求,/表示根路径,* (星号)代表所有
请求,加在一起就变成了根路径下的所有请求。
这样,所有的请求都会先被EncodingFilter 拦截,并在请求里设置上指定的
gb2312 编码。