按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
int b = fc + random。nextInt(bc fc);
return new Color(r; g; b);
}
%》
captcha。jsp 中的代码与 servlet 基本相同,不过需要注意两点。
1。 在定义 Color getRandColor(int fc;int bc)的时候用到了的写法,
比普通多了一个叹号,这是在 jsp 中定义方法时必要的步骤,方法必
须写到中才能正常执行,感兴趣的话可以去 tomcat 的work 下找对
应生成的 java 代码来研究,看看和的代码分别生成到哪里。
2。 在 jsp 中使用response。getOutputStream()很可能引起一个问题。
getOutputStream() has already been called for this response
114 / 148
…………………………………………………………Page 115……………………………………………………………
在 tomcat5 下 jsp 中出现此错误,一般都是在 jsp 中使用了输出流(如输
出图片验证码,文件下载等)后没有妥善处理好。
具体的原因就是在 tomcat 中,jsp 转换成 servlet 之后在函数
_jspService(HttpServletRequest request; HttpServletResponse
response)的最后有一段这样的代码
finally {
if (_jspxFactory != null)
_jspxFactory。releasePageContext(_jspx_page_context);
}
这里是在释放在 jsp 中使用的对象,会调用response。getWriter(),因
为这个方法是和 response。getOutputStream()相冲突的,所以会出现以
上这个异常。
然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那
样……将 jsp 内的所有空格和回车符号所有都删除掉),在使用完输出流以
后调用以下两行代码即可:
out。clear();
out = pageContext。pushBody();
我们还需要修改 index。jsp,让其中的 img 标签请求 captcha。jsp。
这里又一次证明了 html 写的仅仅是请求而已,src=〃include/captcha。jsp〃怎么
看都不像一个图片的名称,但是它确实可以正确显示图片,因为服务器将请求交
给 captcha。jsp,处理后得到是一个图片的数据,可以在浏览器里正常显示。
captcha。jsp 放在 12…02/include 目录下,小项目中可以直接用它了。
115 / 148
…………………………………………………………Page 116……………………………………………………………
第 13 章 剖析 el 表达式
注意
这里详细讲解如何在 jsp 中使用 el 表达式。
如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:
第 14 章 生命周期。
1。 了解如何在 jsp 中使用及禁用 el 表达式。
2。 了解 el 表达式的取值方式。
13。1。 再谈 el (Expression Language)
我们已经知道 el 是 jsp…2。0 规范的一部分,tomcat…5。x 版本以上都已经能够支
持 jsp…2。0 规范,但在更低版本的 tomcat 和 webphere;weblogic 中还是无法使
用这一便捷方式。
其实我们也可以选择在 jsp 中禁止使用 el 表达式,使用 jsp 指令(directive)
可以对禁用某一个 jsp 中的 el 表达式。
禁用之后的 el 表达式会以原样显示出来,如下图所示。
为了对照,我们还在 13…01 下放了一个可以正常使用 el 表达式的例子,运行效
果如下图显示。
在 13…01/index。jsp 中禁用 el 表达式,是使用了 isELIgnore=〃true〃这样一条
jsp 指令(directive),请注意大小写。
116 / 148
…………………………………………………………Page 117……………………………………………………………
{hello}
还有一种批量禁用 el 的方法,我们可以在WEB…INF/web。xml 中使用
jsp…property…group 标签批量禁用 el,我们在 13…02/WEB…INF/web。xml 中进行
如下配置。
*。jsp
true
这样就会禁用所有以。jsp 后缀的请求中的 el 表达式,使用这种方式需要注意两
点。
1。 jsp…property…group 标签是 jsp…2。0 中新增功能,如果你使用低版本的
web。xml (2。3 或以下)就不能使用这个标签了。
2。 设置 jsp…config 会影响 jsp 生成 servlet 的过程,如果程序修改时已经
有 jsp 转换成 servlet 并缓存在 work 目录下,那么修改后需要先清除缓
存,才能看到效果。
实际上还有第三种方法可以禁用掉所有 jsp 中的 el 表达式,那就是把 web。xml
定义为 2。3 版。
117 / 148
…………………………………………………………Page 118……………………………………………………………
这个就是 13…03/WEB…INF/web。xml 的定义,定义了web…app 的版本号是 2。3,这
样一来所有的 jsp 都无法使用 el 表达式了,因为 el 表达式是 2。4 版才开始支持
的功能。
注意
说了以上三种禁用 el 表达式的方法,不是希望大家抛弃 el 表达式,相反是希望
大家在自己编写 el 时出现问题时,先去考虑是否有人在这三个地方做了设置造
成 el 表达式的失效。建议大家多多使用 el 表达式,少用一些 jsp 中的 scriptlet
代码。
13。2。 作用域
使用 el 的时候,默认会以一定顺序搜索四个作用域,将最先找到的变量值显示
出来。
如果我们有{username}这样一个正则表达式,它回去依次调用
pageContext。getAttribute(〃username〃) …》
request。getAttribute(〃username〃) …》 session。getAttribute(〃username〃)
…》 application。getAttribute(〃username〃),只要找到某一个不为空的值就立
刻返回。
这样的确方便我们的操作,但是随之也出现了另外一个问题,如果 pageContext
和 request 中有同名变量,但是我想取得request