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

第19部分

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

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

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





   符号   说明  



    +       加  



          减  



    *       乘  



  /或 div    除  



 %或 mod  求余  



  



表 13。3。 比较运算  



  符号                    说明  



 ==或 eq            相等(equals)  



 !=或 ne         不相等(not equals)  



  或 gt          大于(greater than )  



 =或 ge  大于等于(greater than or equals )  



  



表 13。4。 逻辑运算  



   符号        说明  



                                         121 / 148  


…………………………………………………………Page 122……………………………………………………………

                                                       



    符号         说明  



 && 或 and  逻辑和  



   ||或 or  逻辑或  



   !或 not      取反  



  



表 13。5。 特殊运算  



  符号                 说明  



 empty  是否为 null 或空字符串  



   ? :           三元运算符  



  



下面上所有运算符的显示结果,顺便说一下如果想在 jsp 中显示{name}而不让 

jsp把它当作 el计算出来,可以写成{name},这样最后显示的结果就是{name} 

了。  



                                                                                                                    



                                                  122 / 148  


…………………………………………………………Page 123……………………………………………………………

                                       



                        第 14 章 生命周期  



注意  



讲一下 servlet 的生命周期与运行时的线程模型,对了解 servlet 的运行原理有 

所帮助,这样才能避免一些有冲突的设计。  



如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章: 

第 15 章 分页。  



   1。  了解 servlet 的生命周期。  

   2。  了解 servlet 运行时的线程模型,及设计程序时需要注意的部分。  



14。1。 生命周期  



我们之前使用的都是 javax。servlet。http。HttpServlet,这个类实现了 

javax。servlet。Servlet 接口,而这个接口中定义的三个方法是所有 servlet 都 

必须实现的。  



package javax。servlet;  

  

public interface Servlet {  

  

    void init(ServletConfig config);  

  

    void service(ServletRequest request; ServletResponse response);  

  

    void destroy();  

  

}    



                                    123 / 148  


…………………………………………………………Page 124……………………………………………………………

                                          



                                                            



如图所示,tomcat 之类的服务器首先根据 web。xml 中的定义实例化 servlet,然 

后调用它的 init()方法进行初始化,init()方法的 ServletConfig 参数是服务 

器传递进 servlet 的,其中包含web。xml 配置的初始化信息和 ServletContext 

对象等共享内容。  



初始化后的 servlet 实例便进入等待请求的状态,当有与 servlet…mapping 匹配 

的请求进入时,服务器会调用 servlet 实例的 service 方法,传入 

ServletRequest 与 ServletResponse 两个参数等待 servlet 处理完毕。  



注意一点,对于每个 web 应用,内存中只存在一个 servlet 实例,所有请求都是 

调用这个 servlet 实例,所以我们说 servlet 不是线程安全的,所有操作都要限 

制在 service()方法中进行,不要在servlet 中定义类变量。(doGet()和doPost() 

是 HttpServlet 覆盖 service()方法后分支出来的辅助方法,实际上服务器调用 

的还是 service()。)  



当web 应用卸载时,服务器会调用每个已经初始化的 servlet 的 destroy(),然 

后销毁这些 servlet 实例,如果你需要在 servlet 销毁时释放什么资源的话,可 

以写在destory()方法中。  



那么 servlet 是在什么时候进行初始化的呢?我们可以通过 web。xml 中的 

load…on…startup 标签。  



  

    TestServlet  

    anni。TestServlet  

    1  



                                      124 / 148  


…………………………………………………………Page 125……………………………………………………………

                                         



   



load…on…startup 的值是一个整数,当它大于等于零的时候服务器会在web 发布 

的时候初始化servlet。当它小于零或者我们没有设置load…on…startup 的时候, 

服务器会在用户第一次访问 servlet 的时候才去初始化 servlet。  



或许你对 load…on…startup 为什么是一个整数存有疑问,为什么不是 true 和 

false 呢?这是因为如果我们在web。xml 中设置了多个 servlet 的时候,可以使 

用 load…on…startup 来指定 servlet 的加载顺序,服务器会根据 

load…on…startup 的大小依次对 servlet 进行初始化。不过即使我们将 

load…on…startup 设置重复也不会出现异常,服务器会自己决定初始化顺序。  



回头看看 javax。servlet。Filter 中也有 init()和 destroy()方法,它的声明周 

期与 servlet 基本一致,服务器使用 init()对 Filter 初始化,销毁 Filter 的 

时候调用 destroy()方法,只是过滤器就不在有 load…on…startup 设置了,它总 

是会在服务器启动的时候进行初始化,然后按照 web。xml 定义的顺序依次执行。  



14。2。 线程模型  



我们做一个试验,以此来证明某些编写 servlet 的方法是绝对错误的。  



第一步,我们打开浏览器,浏览 14…02 的 index。jsp 页面,输入“叮咚”。  



                                                               



第二步,我们再打开一个 14…02/index。jsp 页面,输入“lingirl”。  



                                                              



第三步,点击第一个页面的提交按钮,然后在 10 秒之内点击另一个页面的提交 

按钮,等两个页面都提交成功后,我们会看到如下页面。  



url 上有乱码这个就是提交“叮咚”的页面,会惊讶吧?本来这时应该显示“叮 

咚”的。  



                                     125 / 148  


…………………………………………………………Page 126……………………………………………………………

                                                 



                                                                                   



这个页面对应提交“lingirl”的页面,它似乎是显示正常的。  



                                                                             



到底是哪里出错了,为什么第一个页面提交了数据,却得到第二个页面提交的结 

果,首先让我们看一下 TestServlet 的代码。  



package anni;  

  

import java。io。IOException;  

import javax。servlet。ServletException;  

import javax。servlet。http。HttpServlet;  

import javax。servlet。http。HttpServletRequest;  

import javax。servlet。http。HttpServletResponse;  

  

public class TestServlet extends HttpServlet {  

  

    private String username;  

  

    public void doGet(HttpServletRequest request;  

                    HttpServletResponse response)  

            throws ServletException; IOException {  

        this。username = request。getParameter(〃username〃);  

  

        try  {  

            Thread。sleep(10000);  

        } catch (InterruptedException ex) {  

        }  

  

        response。getWriter()。write(this。username);  

    }  

  

}   



                                             126 / 148  


…………………………………………………………Page 127……………………………………………………………

                                      



doGet()方法中从 request 中获得username 参数,然后赋给 this。username,这 

是一个类变量。然后暂停 10 秒,这 10 秒我们假设正在进行一些很费时间的计算, 

这样我们就有十秒钟去点两个页面的提交按钮了。最后将 this。username 写入 

response。  



你也许在想:“这没有问题啊,第一个页面提交了数据,等待 10 秒返回,第二 

个页面再提交数据,等待 10 秒返回,两者并不冲突啊。”可实际上在多线程模 

型中不会有这种队列让请求一个一个执行,所有请求都是蜂拥而至。  



在这个例子里,第一个请求过来将“叮咚”赋值给 this。username 后进行等待, 

10 秒之内我们的第二个请求又调用了 doGet()方法,并把 this。username 修改为 

 “lingirl”,等到 10 秒后第一个请求结束等待后,获得的 this。username 已经 

是“lingirl”了。  



this。username 这种写法在 servlet 中是绝对禁用的,如果有什么信息需要保存, 

可以考虑放到 session 或 ServletContext 中。  



14。3。 在 jsp 中定义类变量  



写在之间的代码,在转换成 servlet 之后都会 service()方法内运行,所以 

我们不必担心出现上边 this。username 的问题。  



但是我们可以用 (注意多出来的感叹号)定义类变量或类方法,把上一个 

罪大恶极的 servlet 改造成 jsp 的话,就像这样。  



  

  

   



注意  



使用 14…03 下的例子可以测试 jsp 出错的效果,记得要在 10 秒之内点击两次。  



                                   127 / 148  


…………………………………………………………Page 128……………………………………………………………

                                            



似乎是一个巨大的陷阱,如果我们使用它定义类变量就一定会出现多线程 

错误。  



不过凡事都有正反两面,当我们需要在 jsp 中定义一个通用方法时,就需要借助 

的力量了,假设我们需要一个方法,根据用户的性别显示不同的html 内容, 

如果 sex = 0 就输出红色的“男”,如果 sex = 1 就输出绿色的“女”。为实现 

这个功能,我们可以定义一个 sexRenderer()方法。  



14…04/index。jsp 页面显示效果如下:  



                                                             



index。jsp 中的代码分两部分。  



第一部分定义 sexRenderer()方法和  



   



第二部分循环显示保存了性别信息的数组,显示的时候将会调用 sexRenderer() 

方法。  



  

                  



                                        128 / 148  


…………………………………………………………Page 129……………………………………………………………

                                         



                      

                  

   



好的,现在我们知道可以在中定义方法和变量了。但是同时也要了解的是 

已经脱离了 service()方法,这就导致不能在它里边使用 request, 

respon

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

你可能喜欢的