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

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

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


要调用 getParameter(〃username〃)就可以获得了,你交给 request 一个参数名, 

它会返回对应的参数值,因为 http 协议的限制,获得的参数值都是字符串,不 



                                     20 / 148  


…………………………………………………………Page 21……………………………………………………………

                                 



过在参数不存在的时候,也会返回 null,所以一定要记住在使用之前判断是否 

为 null,免得频繁出现NullPointerException。  



好了,现在我们把得到的参数值输出即可,你可以对语句前面的等号感到疑惑, 

它的意思就是把参数值输出到页面上,你也可以使用另一种方法:  



Hello   



上一种方法可以看作是它的简化形式,请注意如果使用第一种方法,是不需要在 

java 代码最后加上分号的,而第二种方法必须加上分号。因为第一种方法是特 

殊的简化写法,第二种方法是标准的 java 代码,稍微留意一下就可以区分了。  



例子在 lingo…sample/02…01/,将目录复制到 tomcat 的webapp 目录下,启动 

tomcat 后可以访问 http://localhost:8080/02…01/进行测试。  



2。2。  中文乱码  



你有没有发现,我们的例子中没有中文?  



并不是我们不想使用中文,那是因为在 jsp 中使用中文是一个历史悠久的大问 

题,虽然等你解决了之后会觉得它是那么简单,但对于没经验的新手来说,中文 

乱码问题足以搞得他们焦头烂额了。  



现在我们就要带领你闯过这道关,消灭掉请求和响应中可能出现的乱码,还中文 

英雄本色。  



2。2。1。 先解决响应中的乱码  



何为响应中的乱码?把页面中的“username”改成“用户名”你就知道了。  



                                              



所谓响应中的乱码,就是显示页面上的乱码,因为页面数据是从服务器一端放入 

响应(response)中,然后发送给浏览器,如果响应中的数据无法被正常解析, 

就会出现乱码问题。  



为什么英文就没有问题呢?因为在 iso…8859…1,gb2312; utf…8 以及任意一种编 

码格式下,英文编码格式都是一样的,每个字符占 8 位,而中文就麻烦了,在 

gb2312 下一个中文占 16 位,两字节,而在 utf…8 下一个中文要占 24 位,三字 

节。浏览器在不知道确定编码方式的情况下,就会把这些字符从中间截断,再显 



                              21 / 148  


…………………………………………………………Page 22……………………………………………………………

                                       



示的时候就乱掉了。所以,想要解决乱码问题,就是要告诉浏览器我们到底使用 

了什么样的编码方式。  



为了获得正常显示的中文,需要注意以下几步:  



   1。  因为服务器要先从本地读取 jsp 文件,然后经过处理后写入响应,所以我 

      们首先要知道的就是 jsp 文件的编码格式。从问题的源头着手解决。  



      在咱们用的 windowxp 下,文件默认的编码格式是 gb2312。  



   2。  我们要在 http 的响应(response)中添加编码信息,使用如下方式:  



          



      这段要放在 jsp 页面的第一行,用来指定响应的类型和编码格式, 

      contentType 为 text/html 就是 html 内容,charset 表示编码为 gb2312。 

      这样浏览器就可以从响应中获得编码格式了。  



      这种的形式叫做 jsp 指令(directive),现在接触到的是page 

      指令,还有 include 和 taglib 指令,我们会在后面陆续讲到。  



   3。  还需要在 html 中指定编码格式。  



        

          

          title  

        



      meta 部分用来指定当前 html 的编码格式,注意这一段要放在head 标签 

       中,并且放到head 标签的最前面,如果不是最前面 ie 下可能会出现问题, 

      尤其是在 title 中有中文的情况下。  



完成了以上三段检验,我们才能保证输出的 jsp 页面会正常显示中文。  



                                                      



例子在 lingo…sample/02…02/下,正常显示的页面 index。jsp,还留了一个乱码 

页面 index_wrong。jsp。  



                                   22 / 148  


…………………………………………………………Page 23……………………………………………………………

                                               



2。2。2。  POST 乱码  



先把 form 里加上 method=〃POST〃,让 form 提交的时候使用 POST 方式。  



发送请求的时候,使用的编码是 iso…8859…1,意味着只有英文是有效字符,这 

个限制是因为当初指定 http 标准的成员都来自英语国家,所以如果使用默认的 

方式从请求获取数据,中文一定会全部变成乱码。  



如果不信,你可以在刚才的例子里输入中文,然后提交:  



                                                                  



提交结果就会变成这样:  



                                                                  



怎么解决呢?我们要 jsp 最前面加上一条 java 语句,设置请求的字符编码。  



   



于是,那些乱码都正常了:  



                                                                  



例子在 lingo…sample/02…03/下。  



2。2。3。 GET 乱码  



直接点击超链接,form 的默认提交方式都是GET。  



POST 方式下的解决方式还算简单,因为 POST 方式下提交的数据都是以二进制的 

方式附加在http请求的body部分发送,只需要在后台指定编码格式就足矣解决。  



                                          23 / 148  


…………………………………………………………Page 24……………………………………………………………

                                         



GET 方式下会将参数直接附加到 url 后面,这部分参数无法使用 

request。setCharacterEncoding()处理,结果就是 get 形式的所有中文都变成了 

乱码。  



                                                         



这时再也没有简便方法了,只能对这些中文一个一个进行转换,使用 new  

String(bytes; 〃gb2312〃)进行转码。  



   



如我们所见,先从 request 中获得参数,接着把字符串按照 iso…8859…1 编码打 

散成 byte 数组,然后用 gb2312 编码组合成新字符串,最后打印出来就是正常的 

中文了。  



写在一起就变成了:  



   



这样做的缺点,是从请求中取得的所有中文都需要转码,非常烦琐。  



所以大家千万不要像这样测试,把中 

文参数写到超链接中,form 尽量使用 method=〃POST〃,这样只需要设置 

request。setCharacterEncoding()就可以应付中文乱码问题。  



例子在 lingo…sample/02…04/下。  



经历了这些只有非英语体系国家才能遇到的波折之后,我们的 jsp 终于可以接受 

请求中的参数,并正常响应了。下面将要进行更复杂的请求响应流程。  



                                     24 / 148  


…………………………………………………………Page 25……………………………………………………………

                                             



                    第 3 章 请求的跳转与转发  



注意  



应用广泛,而又没几个人明白的东西上场了,这章就只讨论这一个问题。  



如果你确认自己明白下面这个问题,请直接进入下一章:第 4 章 四个作用域。  



    1。  forward; redirect 的区别。  



3。1。 范例  



这次用户可以在首页选择自己喜欢的颜色,进入对应的页面。  



                                                       



选择绿色,会进入绿色界面:  



                                                       



选择红色,会进入红色界面:  



                                                       



好的,这里我们会看到四个页面:  



    1。  index。jsp 中选择颜色,点击按钮后提交到 test。jsp。  

    2。  test。jsp 取得用户选择的颜色,根据颜色值显示对应的页面。  

    3。  如果选择了红色,就显示 red。jsp。  

    4。  如果选择了绿色,就显示 green。jsp。  



在这里例子里,index。jsp,red。jsp,green。jsp 中的内容都是一样的,所有的 

玄机都在 test。jsp 中。  



                                         25 / 148  


…………………………………………………………Page 26……………………………………………………………

                                             



现在面临的问题是如何在 test。jsp 决定实现 red。jsp 或者 green。jsp,我们可 

以在forward 和 redirect 中任选其一。  



3。2。 如果用 forward  



test。jsp 中需要这样写:  



  

  

          



略过取得参数与比较参数值不提,只关注 forward 的部分:  



request。getRequestDispatcher(〃red。jsp〃)。forward(request; response);  



首先调用 request 的 getRequestDispatcher()方法,获得对应 red。jsp 的转发 

器,然后调用 forward()方法执行请求转发。结果用户看到的就是 red。jsp 中的 

结果了,一个红色的页面。  



这里请大家注意一下浏览器的 url 地址:  



选择红色页面时:  



                                                                 



选择绿色页面时:  



                                                                 



                                         26 / 148  


…………………………………………………………Page 27……………………………………………………………

                                                              



于是,无论转发至 red。jsp 还是 green。jsp,地址栏上显示的都是 test。jsp。  



这是为什么呢?通过下面的流程图会让我们容易理解:  



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



                                                                                                         



     2。  test。jsp 计算客户选择的颜色,将请求转发至 red。jsp。  



                                                                                                                               



     3。  red。jsp 返回响应给浏览器。  



                                                        27 / 148  


…………………………………………………………Page 28……………………………………………………………

                                           



                                                                                  



这下知道为什么浏览器的地址没有变化了吧?因为浏览器只是执行了对 

test。jsp 的请求,test。jsp 到 red。jsp 的部分是在服务器内执行的,浏览器并 

不知道服务器里到底发生了什么,它只知道自己获得的响应是 test。jsp 发回来 

的,甚至不知道服务器还有个red。jsp。  



这就是请求转发 forward 了。例子见 lingo…sample/03…01/。  



3。3。 如果用 redirect  



test。jsp 中需要这样写:  



  

  



略过取得参数与比较参数值不提,只关注 redirect 的部分:  



response。sendRedirect(〃red。jsp〃);  



response 翻译过来就是响应,代表着 http 响应。调用 response 的 

sendRedirect(〃red。jsp〃)方法,将页面重定向到 red。jsp。  



再请大家注意一下浏览器的 url 地址:  



选择红色页面时:  



                                       28 / 148  


…………………………………………………………Page 29……………………………………………………………

                                                            



                                                                                       



选择绿色页面时:  



                                                                                       



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