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

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

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




和 request 中有同名变量,但是我想取得request 中的变量该如何是好呢?这就 

需要为 el 表达式引入作用域的概念了。  



{pageScope。username}  

  

{requestScope。username}  



我们可以直接访问 13…04 这个应用,看看 el 表达式支持的所有对象。  



                                    118 / 148  


…………………………………………………………Page 119……………………………………………………………

                                                     



                                                                                                       



下面我们分别对每个作用域对象进行讲解。  



表 13。1。 el 中的作用域  



  el 中的作用域                                   对应关系  



  pageContext                      当前页的 pageContext 对象  



    pageScope           把 page 作用域中的数据映射为一个 map 对象  



  requestScope         把 request 作用域中的数据映射为一个 map 对象  



   sessionScope        把 session 作用域中的数据映射为一个 map 对象  



 applicationScope  把 application 作用域中的数据映射为一个 map 对象  



      param                        对应 request。getParameter()  



  paramValues                  对应 request。getParameterValues()  



     header                         对应 request。getHeader()  



   headerValues                  对应 request。getHeaderValues()  



     cookie                         对应 request。getCookies()  



    initParam                 对应 ServletContext。getInitParamter()  



                                                 119 / 148  


…………………………………………………………Page 120……………………………………………………………

                                    



  



  例子中的{pageContext。request。contextPath}返回的是 

request。getContextPath()的值,在此例中就是/13…04,我们经常使用这个 

来拼接 jsp 中的绝对路径。  



这里的{pageContext。request。contextPath}是一种特殊用法,不能使用 

{request。contextPath}的形式替代。  



  pageScope; requestScope; sessionScope; appliationScope 都可以看作是 

Map 型变量,调用其中的数据可以使用{pageScope。name}或 

{pageScope'〃name〃'}的形式,这两种写法是等价的。  



在某些情况下只能使用{pageScope'〃content…type〃'},这里不能写成 

{pageScope。content…type},jsp 无法解析连字符(…)会出现错误。  



  需要注意的是{paramValues。name}得到的是一个字符串数组,如果需要获 

得其中某个值,还需要使用{paramValues。name'0'}指定数组中的索引。  



这与下面的{headerValues。name}是相似的。  



  {header。name}会取得 http 请求中的 header 参数,现实工作中很少用到这 

里的数据。  



例子中使用 Host 是指请求访问的主机地址,包括 ip 和端口号。而 Referer 

比较有趣,如果用户通过超链接跳转过来的,Referer 会保存上次访问页面 

的地址,我们就可以通过它来统计哪些用户是从哪里转来的了。  



  {cookie。name}将获得对应 cookie 的对象,比如我们用 jsp 将一段 cookie 

发送给客户端。  



Cookie cookie = new Cookie(〃username〃; 〃Username in cookie〃);  

response。addCookie(cookie);  



创建一个名称为 username,值为〃Username in cookie〃的Cookie 对象,然 

后发送给客户端。  



然后我们就可以使用{cookie。username}获得这个 cookie 了, 

{cookie。username。name}获得 cookie 名称,{cookie。username。value}获 

得 cookie 值。  



  ServletContext。getInitParamter()指的应用的初始变量,这些变量都是定 

义在 web。xml 中的。  



  

    username  

    username with context param  



                                 120 / 148  


…………………………………………………………Page 121……………………………………………………………

                                             



       



    {initParam。username}就会得到这里的变量值。  



以上都是死记硬背的东西,建议实际用到的时候翻看一下就好了,演示代码都放 

在 13…04 下,为了获得 param 和 cookie 还要点击一下最下边的连接才可以。  



13。3。 运算符  



el 表达式中支持 java 中所有的操作符,并且还有一些扩展,下面我们简要做一 

下对照。  



表 13。2。 加减乘除四则运算  



   符号   说明  



    +       加  



          减  



    *       乘  



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