友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
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 地址一
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!