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

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

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





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