友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

JSP入门教程(DOC格式)-第12章

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




              /  

            

        

         



      只要注意 servlet 和 servlet…mapping 两部分就可以了。  



         a。  servlet 标签中定义一个了名字叫做 HelloServlet 的 servlet。  



            这个 HelloServlet 对应的 class 是 anni。HelloServlet,请注意 

            这里的 class 要写全名。  



         b。  servlet…mapping 标签则是把刚刚定义的HelloServlet 映射到“/” 

            这个请求路径上。  



            请回忆我们之前讲过的 第 3。4。1 节  “绝对路径与相对路径” 中 

            的部分,这里的“/”就代表当前应用的根路径,既 

            http://localhost:8080/06…01/,凡是有客户对此路径发出请求, 

            就会交由 HelloServlet 处理。  



例子在 lingo…sample/06…01 目录下,将整个目录放入tomcat 的webapps 即可使 

用。对应的源代码放在 lingo…sample/06…01/WEB…INF/src 目录下,要放到tomcat 

的webapps 目录下,才能使用pile。bat 脚本进行编译。  



6。2。 jsp 与 servlet 的关系  



通过上面的例子,我们可以看到 servlet 与 jsp 的功能差不多,都是处理请求并 

返回响应。甚至在操作时使用到的变量都极为相似,request,response,out 

这些在我们使用 jsp 的时候也遇到过。不同的时是,jsp 中这些变量拿来即用, 

servlet 中还要通过参数来获得。  



jsp 和 servlet 如此相似,它们之间难道有什么联系吗?为什么 sun 创造了两种 

功能相似的东西呢?  



其实 jsp 就是 servlet,你所写的 jsp 页面最终都会被服务器转换成 servlet。 

为了验证这一说法,我们编写一个效果与 HelloServlet 完全一样的 hello。jsp, 

它的内容就只有这么点儿。  



hello   



访问 http://localhost:8080/06…01/hello。jsp,会看到与刚刚一样的效果。  



                                 60 / 148  


…………………………………………………………Page 61……………………………………………………………

                                                                   



                                                                                                 



现在打开 tomcat 的work 目录。  



                                                                                              



在 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)) {  
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!