八宝书库 > 文学其他电子书 > JSP入门教程(DOC格式) >

第10部分

JSP入门教程(DOC格式)-第10部分

小说: JSP入门教程(DOC格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






在 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);  



                                         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〃);后,有没有想要一劳永逸的方法 

呢?能不能一次性修改所

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的