在 Catalina/localhost/06…01/org/apache/jsp 目录下,可以看到两个文件,分
别是 hello_jsp。class 和 hello_jsp。java。
打开 hello_jsp。java 可以看到里边的源代码,我们只挑出其中一部分来看。
out = pageContext。getOut();
_jspx_out = out;
61 / 148
…………………………………………………………Page 62……………………………………………………………
out。write(〃hello〃);
获得 pageContext 的输出流并将〃hello〃写入,于是浏览器上就看到了 hello 的
字样。
是的,这里的 hello_jsp。java 就是由 hello。jsp 生成的。服务器在获得请求的
时候会先根据 jsp 页面生成一个 java 文件,然后使用 jdk 的编译器将此文件编
译,最后运行得到的 class 文件处理用户的请求返回响应。如果再有请求访问这
jsp 页面,服务器会先检查 jsp 文件是否被修改过,如果被修改过,则重新生成
java 重新编译,如果没有,就直接运行上次得到的 class。
为什么第一次访问 jsp 的时候速度会那么慢?就是因为要经过生成 java 和编译
class 的步骤。以后再次访问同一页面就会感觉到速度明显变快,也是因为 class
文件已经生成的原因。
为什么 jsp 要经过这些步骤转换成 servlet 再去执行呢?因为 java 起初做网站
的时候就只有 servlet 可以使用,为此还专门指定了一套 servlet 标准,就是我
们在代码中看到的 javax。servlet包下的类。但是人们马上就发现,使用 servlet
62 / 148
…………………………………………………………Page 63……………………………………………………………
显示复杂页面太费力气了,使用 servlet 里的输出方式简直让人写到手抽筋,于
是就有了仿效 asp 和 php 的 jsp 出现,开发人员可以在美工做好的页面上直接嵌
入代码,然后让服务器将 jsp 转换成 servlet 执行。
有的朋友可能迷糊了,既然 jsp 是为了简化 servlet 开发,那么为什么我们现在
又要去学习 servlet?既然 servlet 那么麻烦为什么不直接使用 jsp 就好了呢?
这是因为 jsp 虽然比 servlet 灵活,却容易出错,你找不到良好的方式来测试
jsp 中代码,尤其在需要进行复杂的业务逻辑时,这一点儿很可能成为致命伤。
所以一般都不允许在 jsp 里出现业务操作有关的代码,从这点来看,我们上一章
中举的例子就严重违反了这一标准,CRUD 的操作都写在了 jsp 这种,一旦出现
问题就会让维护人员头大如斗。
servlet 是一个 java 类,需要编译之后才能使用,虽然显示页面的时候会让人
头疼,不过在进行业务操作和数据运算方面就比 jsp 稳健太多了。因此我们就要
结合两者的优点,在 servlet 进行业务操作和请求转发,jsp 全面负责页面显示,
这也是目前公司企业里常用的开发方式。
6。3。 使用 servlet 改写联系簿
63 / 148
…………………………………………………………Page 64……………………………………………………………
既然 jsp 就是 servlet,jsp 中的那些功能在 servlet 中也就都可以实现,当然
咱们不能再使用 jsp 指令(directive)和 jsp 动作(action)了,不过它们也
都有替代方法,我们以后慢慢介绍。
现在我们使用 servlet 改写第五章中联系簿的例子,将 CRUD 操作都转移到
servlet 中,让 jsp 只负责页面显示。
新建一个 ContactServlet。java,让它负责处理那些CRUD 操作,它会直接引用
ContactDao 操作数据,现在我们可以把 jsp 中对ContactDao 的引用删除了,所
有数据都将由 ContactServlet 提供,现在 jsp 只管从 request 里取出数据显示
出来即可。
为了让ContactServlet 起作用,在 web。xml 中添加处理请求的配置。
ContactServlet
anni。ContactServlet
ContactServlet
/contact。do
servlet 标签指定使用 anni。ContactServlet,servlet…mapping 将它绑定到
/contact。do 请求上,当我们看到浏览器上出现
http://localhost:8080/06…02/contact。do 的时候,就表明ContactServlet 在
起作用了。
请别 06…02 目录下去找contact。do 这个文件,它是不存在的。与之前提到的
forward()情况类似,虽然浏览器指定要 contact。do 这个资源,但服务器暗地里
把这个请求交给 ContactServlet 处理,你可以把 contact。do 当作一个地址,实
际上你要找的人是 ContactServlet。
不管怎样,只要是对 contact。do 发起的请求,最后都是由 ContactServlet 处理。
我们依然继承 HttpServlet,不过这次实现两个方法 doGet()和 doPost()分别处
理 http 的GET 和 POST 方式的请求。使用 GET 方式的请求会交由 doGet()方法处
理,使用 POST 方法的请求会交给 doPost()处理,这些都是由 HttpServlet 控制
的,我们可以直接使用。
/**
* 处理 get 请求。
*/
64 / 148
…………………………………………………………Page 65……………………………………………………………
public void doGet(HttpServletRequest request; HttpServletResponse
response)
throws ServletException; IOException {
this。process(request; response);
}
/**
* 处理 post 请求
*/
public void doPost(HttpServletRequest request;HttpServletResponse
response)
throws ServletException; IOException {
this。process(request; response);
}
为了方便,我们把 GET 和 POST 请求都交给 process()方法处理,在 process()
中根据不同的请求进行不同的操作。
/**
* 处理请求。
*/
public void process(HttpServletRequest request;HttpServletResponse
response)
throws ServletException; IOException {
request。setCharacterEncoding(〃gb2312〃);
String method = request。getParameter(〃method〃);
if (method == null) {
method = 〃list〃 ;
}
try {
// 分发请求
if (〃list〃。equals(method)) {
this。list(request; response);
} else if (〃save〃。equals(method)) {
this。save(request; response);
} else if (〃edit〃。equals(method)) {
this。edit(request; response);
} else if (〃update〃。equals(method)) {
this。update(request; response)
小说推荐
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章
- asp基础实用教程(DOC格式)
- 目 录一、关于ASP二、ASP的新功能三、创建ASP页四、使用脚本语言五、使用变量和常量六、使用集合七、ASP内建对象八、向浏览器发送内容九、包含文件十、访问数据库十一、调试ASP脚本十二、维护ASP应用程序的安全一、关于ASP Active Server Pages(ASP)是服务器端脚本编写环境
- 最新章:第17章
- asp基础入门篇(DOC格式)
- ASP入门与实例-IIS的安装与配置1、运行环境与软件要求Windows 2000 以上(不包括Windows XP Home版)IIS 4.0 以上Microsoft Access 2000Dreamweaver MX2、IIS的安装与配置a.安装IIS若操作系统中还未安装IIS服务器,可打开"控
- 最新章:第23章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- Word2003使用技巧大全(DOC格式)
- Word使用技巧(二)表格使用大全更新时间:2009-11-16 19:32:15 本文共阅读了257次 作者:xushezheng 文章来源:电教组字体大小:大中小一、快速插入表格 拖动“插入表格”能插入的最大表格跟该图标位置、显示分辨率有关。如使用800×600分辨率时最大为18行×28列 二、
- 最新章:第1章
- Excel word ppt office使用技巧大全(DOC格式)
- -Page 1-Excel_word_ppt_使用技巧大全(完全版)Excelwordppt使用技巧大全(2011新版本)I-Page 2-Excel_word_ppt_使用技巧大全(完全版
- 最新章:第338章
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章