友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



                                                                                       



与 forward 不同,url 地址一直在变化,红色的时候显示 red。jsp,绿色的时候 

显示 green。jsp。  



再看一下流程图吧:  



     1。  浏览器向 test。jsp 发送请求。  



                                                                                                      



     2。  test。jsp 计算客户选择的颜色,向浏览器发送一个页面重定向 

            (redirect)的响应,响应中包含red。jsp 的url 地址。  



                                                      29 / 148  


…………………………………………………………Page 30……………………………………………………………

                                                                 



                                                                                                                    



3。  浏览器根据页面重定向(redirect)响应中的red。jsp 地址,再次向服务 

      器发送请求,这次请求的就是 red。jsp 了。  



                                                                                                                  



4。  red。jsp 执行,返回响应。  



                                                          30 / 148  


…………………………………………………………Page 31……………………………………………………………

                                         



                                                                      



redirect 会触发另一个请求响应流程,第二次请求的时候是由浏览器发起对 

red。jsp 的请求,所以url 地址改变了。  



这就是页面重定向 redirect 了。例子见 lingo…sample/03…02/。  



3。4。 forward 和 redirect 的问题  



3。4。1。 绝对路径与相对路径  



    1。  如果咱们使用的 URL 网址是以“/”开头的,那么这个网址就叫做绝对路 

       径。  

   2。  如果咱们使用的 URL 网址不是“/”开头的,那么这个网址就叫做相对路 

       径。  



3。4。1。1。 相对路径  



在相对路径上,两者的表现是相同的。  



看看 lingo…sample/03…03/这个例子,如果我们去请求 relative/forward。jsp 

或 redirect。jsp,然后从这里再跳转向它下面的result/result。jsp 会怎样呢?  



    1。  forward 的例子:  



         



       这里的相对路径就是 result/result。jsp。  



                                      31 / 148  


…………………………………………………………Page 32……………………………………………………………

                                      



      因为刚刚请求的 test。jsp 是在/03…03/relative/下,所以我们的当前路 

      径就是/03…03/relative/,执行 forward 的时候会寻找当前路径下的 

      result/result。jsp,找到之后便转发请求。  



   2。  redirect 的例子:  



        



      这里的相对路径也是 result/result。jsp。  



      因为刚刚请求的 test。jsp 是在/03…03/relative/下,所以我们的当前路 

      径就是/03…03/relative/,执行 redirect 的时候会把当前路径加上 

      result/result。jsp,把结果作为重定向的地址发送给浏览器,浏览器再 

      去请求/03…03/relative/result/result。jsp,从而得到响应。  



3。4。1。2。 绝对路径  



问题出现了,绝对路径在forward 和 redirect 中出现了差别,还是刚才的情况, 

但使用绝对路径的时候写法便不同了。  



   1。  forward 的例子:  



        



      这里的绝对路径就是/relative/result/result。jsp。  



      在本地测试时,forward 把 http://localhost:8080/03…03/当作根路径, 

      在它的基础上计算绝对路径。  



      这是由 jsp 的部署方式决定的,webapp 里可以放好多项目,为了让这些 

      项目可以互不影响、独立运行,不能让请求从一个项目直接在服务器内部 

      转移到另一个项目。为了防止出现这种情况,在执行 forward 的时候干脆 

      把项目的路径当作根目录,开发者看不到其他项目,也就不会出现问题了。  



   2。  redirect 的例子:  



         



      这里的绝对路径却是/03…03/absolute/result/result。jsp。  



                                  32 / 148  


…………………………………………………………Page 33……………………………………………………………

                                         



       在本地测试时,redirect 把 http://localhost:8080/当作根路径,在它 

       的基础上计算绝对路径。  



       因为redirect 会让浏览器重新发起一个新请求,所以不会搅乱服务器里 

       多个项目之间的关系,也就不需要对它做限制,如果需要在多个项目之间 

       进行跳转,就只能使用 redirect。不过因为重新发起了新的请求,上次 

       请求的那些数据都会丢失,如果有什么重要的数据,记得要重新设置。  



3。4。2。 forward 导致找不到图片  



找不到图片,找不到 js 脚本,找不到 css 样式表,都属于这个问题。  



要演示这个问题,是非常容易的,只需要满足两个条件:  



    1。  forward 前后的 jsp 页面不在一个目录下。  

   2。  forward 后的 jsp 页面里使用相对路径引用一些资源,图片,js 脚本,css 

       样式表什么的。  



03…04 里就模拟了这样一个环境,你进入 http://localhost:8080/03…04/,选择 

 “有问题的”:  



                                                                



打开 03…04 可以看到如下的目录结构:  



 |……+ 03…04  

    |……index。jsp  

    |……test。jsp  

    |……+ result  

       |……success。jsp  

       |……failure。jsp  

       |……lingo。png  

              



刚才咱们看到的页面是 failure。jsp,它里边显示图片的部分是:  



  

              



                                     33 / 148  


…………………………………………………………Page 34……………………………………………………………

                                           



这时候就有疑问了,lingo。png 和 failure。jsp 明明在同一个目录下,为什么无 

法显示。  



现在请在无法显示的图片上,点击鼠标右键,选择属性,让我们看一下图片的请 

求地址:  



                                                                    



图片的位置本来在http://localhost:8080/03…04/result/lingo。png,但请求 

的地址却是http://localhost:8080/03…04/lingo。png。问题就是丢掉了中间的 

/result。  



再试一次 index。jsp 上的“没问题的”:  



                                                                    



这次我们看到的页面是 success。jsp,它里边显示图片的部分是:  



  

              



结果手工加上 result 这段路径后就可以显示图片了。  



这个问题还要追溯到浏览器对 html 的处理方式,在html 里包含的图片,css 样 

式表,js 脚本,视频等等外部资源,都需要浏览器再次向服务器发起请求。  



如果这些外部资源使用了相对路径,浏览器就会在当前请求路径的基础上,加上 

相对路径拼接出完整的 http 请求,发送给服务器。这个例子中,我们请求 

http://localhost:8080/03…04/test。jsp,浏览器得到的当前路径就是 

http://localhost:8080/03…04/,failure。jsp 中图片的相对路径是 lingo。png, 

那么拼接的结果是 http://localhost:8080/03…04/lingo。png。  



                                       34 / 148  


…………………………………………………………Page 35……………………………………………………………

                                      



不要怪浏览器太傻,是因为使用 forward 的时候浏览器并不清楚这些改变。它一 

直认为,既然自己请求的是 test。jsp,返回的自然就是 test。jsp 的内容,那么 

再使用 test。jsp 当作当前路径去计算相对路径当然没有问题。是我们欺骗了浏 

览器,在服务器偷偷改变了请求流向,返回了其他页面的内容。  



清楚了以上的请求流程,就知道如何应对这种问题了。  



   1。  第一种方法:不要在不同目录之间使用 forward 做请求转发,保证当前路 

      径不发生变化。  

   2。  第二种方法:像上例一样修改图片路径,或全部改为绝对路径。  



请根据实际需要进行选择。  



                                  35 / 148  


…………………………………………………………Page 36……………………………………………………………

                                   



                    第 4 章 四个作用域  



注意  



这里介绍的主要是作用域,但实际中是不允许在 jsp 写些么多代码的,如果你工 

作了还这样写,要么这个公司的水平有问题,要么你就要被大骂一顿了。请务必 

领会精神,不要死记硬背。  



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

第 5 章 结合 javabean 实现 CRUD。  



   1。  了解四个作用域(scope)的用处。  

   2。  了解 el (Expression Language)。  



4。1。 何为作用域  



先让我们看看效果:  



                                               



大概流程是这样的,我们访问 04…01/index。jsp 的时候,分别对pageContext;  

request; session; application 四个作用域中的变量进行累加。(当然先判断 

这个变量是不是存在,如果变量不存在,则要把变量初始化成 1。)计算完成后 

就从 index。jsp 执行 forward 跳转到 test。jsp。在 test。jsp 里再进行一次累加, 

然后显示出这四个整数来。  



从显示的结果来看,我们可以直观的得出结论:  



   1。  page 里的变量没法从 index。jsp 传递到 test。jsp。只要页面跳转了,它 

      们就不见了。  

   2。  request 里的变量可以跨越 forward 前后的两页。但是只要刷新页面,它 

      们就重新计算了。  

   3。  session 和 application 里的变量一直在累加,开始还看不出区别,只要 

      关闭浏览器,再次重启浏览器访问这页,session 里的变量就重新计算了。  



                                36 / 148  


…………………………………………………………Page 37……………………………………………………………

                               



  4。  application 里的变量一直在累加,除非你重启 tomcat,否则它会一直变 

     大。  



而作用域规定的是变量的有效期限。  



   1。  如果把变量放到 pageContext 里,就说明它的作用域是 page,它的有效 

     范围只在当前 jsp 页面里。  



     从把变量放到 pageContext 开始,到 jsp 页面结束,你都可以使用这个变 

     量。  



   2。  如果把变量放到 request 里,就说明它的作用域是 request,它的有效范 

     围是当前请求周期。  



     所谓请求周期,就是指从 http 请求发起,到服务器处理结束,返回响应 

     的整个过程。在这个过程中可能使用forward 的方式跳转了多个jsp页面, 

     在这些页面里你都可以使用这个变量。  



   3。  如果把变量放到 session 里,就说明它的作用域是 session,它的有效范 

     围是当前会话。  



     所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间 

     的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览 

     器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个 

     会话(session),而放到会话中的变量,就可以在当前会话的所有请求 

     里使用。  



  4。  如果把变量放到 application 里,就说明它的作用域是 application,它 

     的有效范围是整个应用。  



     整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到 

     服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务 

     器,就会把上面所有的应用都关闭了。  



     application 作用域里的变量,它们的存活时间是最长的,如果不进行手 

     工删除,它们就一直可以使用。  



     与上述三个不同的是,application 里的变量可以被所有用户共用。如果 

     用户甲的操作修改了 application 中的变量,用户乙访问时得到的是修改 

     后的值。这在其他 scope 中都是不会发生的,page; request; session 

     都是完全隔离的,无论如何修改都不会影响其他人的数据。  



我们使用 public Object getAttribute(String name)获得变量值,使用 public  

void setAttribute(String name; Object value)将变量值保存到对应作用域中。 

举个 pageContext 的例子就是:  



                            37 / 148  


…………………………………………………………Page 38……………………………………………………………

                                   



// page 
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!