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

第6部分

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

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

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






这次我们看到的页面是 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  

Integer countPage = (Integer) pageContext。getAttribute(〃countPage〃);  

if  (countPage == null) {  

    pageContext。setAttribute(〃countPage〃; 1);  

} else  {  

    pageContext。setAttribute(〃countPage〃; countPage + 1);  

}   



这里先从 pageContext 中取出名为 countPage 的整数,因为返回的都是 

java。lang。Object 类型,所以需要强制转换成我们需要的整形。这里取得的变 

量如果不存在就会返回 null,通过判断 countPage == null 来辨别变量是否存 

在,如果不存在就设置为 1,如果存在就进行累加,最后使用 setAttribute() 

方法将修改后的变量值放入 pageContext。  



将其中的 pageContext 换成 request; session; application 就可以操作其他三 

个作用域中的变量。  



在显示这些变量值的时候,我们没有写 

而是使用了{countPage}的形 

式,这种{}的形式叫做 el 表达式,是 jsp…2。0 规范的一部分,tomcat 里正好 

可以使用。  



使用 el 有以下几个好处:  



   1。  代码量小,并且不需要使用尖括号。  

   2。  支持从 pageContext; request; session; application 中取值,它会自 

      动检查四个作用域,不需要特别指定。  

   3。  如果变量不存在,会输出空字符串〃〃,而不是 null,省去了手工判断的 

      工作。  



4。2。 例子:在线列表  



我们做一个新手级的在线用户列表,原理是这样:  



   1。  用户登录,并把登录使用的用户名保存到 session 中,通过 session 中是 

      否存在用户名判断用户是否已登录。  



      session 可以在整个会话过程中保存用户信息,不必每次刷新页面都重新 

      登录。  



   2。  用户登录后,将用户名添加到 application 中的在线用户列表。  



      用户注销时,讲用户名从 application 中的在线列表删除。  



                                38 / 148  


…………………………………………………………Page 39……………………………………………………………

                                                         



          只要服务器还在运行着,application 就会保存所有登录用户的信息,所 

         有用户都可以看到这个在线用户列表。  



可以尝试一下 lingo…sample/04…02/中的例子:  



     1。  进入登录页面,登陆一个用户。  



                                                                                      



     2。  登录成功既看到已登录的用户名,和当前的在线用户列表。  



                                                                                      



     3。  再登录一个用户。  



                                                                                      



     4。  然后就可以看到在线用户列表增加了,可以看到里面包含上次登录的用户 

         和当前登录的用户。  



                                                                                      



         这时,如果第一个用户刷新页面,也会看到在线用户列表中变成两个人。  



                                                   39 / 148  


…………………………………………………………Page 40……………………………………………………………

                                              



                                                                      



    5。  现在任何一个用户点击注销,将返回登录页面。另一个用户刷新页面会发 

        现在线用户列表减少了。  



                                                                      



让我们从登录页面 index。jsp 开始,复习一下目前学到的知识。  



index。jsp 中显示的是用户登录表单,为了显示 index。jsp 中包含的中文,需要 

加上,这里使用的文件 

编码是默认的 gb2312。  



  

    用户名:  

      

      

   



在这个 form 里我们可以输入一个 username 的值,提交的url 是 login。jsp,使 

用 post 方法是为了更简单的解决中文问题。在填写了用户名之后,点击登录按 

钮,将数据提交到 login。jsp。  



login。jsp 中进行的是对用户名的操作,包括获得请求中的用户名,将用户名添 

加到 session 和在线用户列表中。  



  

   



中文编码设置和获得请求参数都已经熟识了。在获得在线用户列表时,先获得 

application 中的 onlineUserList,强制转换成 List 类型。如果 onlineUserList 

并不存在,我们还需要先对它做初始化,并添加到 application 里。这时有一个 

小技巧,因为 onlineUserList 已经放在application 中了,将username 添加进 

去后,不必再使用 setAttribute()也可以达到修

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

你可能喜欢的