在1.jsp中使用include
<%@include file="/include/head.jsp"%>
head.jsp中存放如下语句:
<%@page contentType="text/html;charset=gb2312"%>
此时jsp中写定的中文全部乱码。
但如果不使用include,将<%@page contentType="text/html;charset=gb2312"%>直接写在1.jsp,则中文正常显示。
有点糊涂,为什么会这样。
在1.jsp中使用include
<%@include file="/include/head.jsp"%>
head.jsp中存放如下语句:
<%@page contentType="text/html;charset=gb2312"%>
此时jsp中写定的中文全部乱码。
但如果不使用include,将<%@page contentType="text/html;charset=gb2312"%>直接写在1.jsp,则中文正常显示。
有点糊涂,为什么会这样。
linux下include的机制是什么样的,好像和windows平台差别很大?
还有谁遇到过此种问题?
重发一楼
|
windows下会判断原始jsp和所包含的jsp,linux好像只判断原始jsp。
这是Tomcat的错,jsp页面在进行translate的时候,如果没有指定jsp的charset,那么Tomcat会默认以ISO8859-1解析你的jsp页面,将其翻译成xxx.java文件,换句话说,在jsp成为servlet后,你的中文就乱码了,如果想要改变这个问题,可以修改Tomcat的源代码,将translate jsp到Servlet的部分修改一下,很简单,所以有一种说法认为Tomcat故意做的这样,使得非英语用户受到一定限制,或者说,作为一个免费的东西,不能做的太完美。
不刷新问题:
jsp页面的刷新,是由web服务器定期检查jsp页面的更新时间决定的。
你修改了include.jsp但是,包含它的jsp没有被更新,服务器不会对他们进行重新编译,自然不会刷新。
Tomcat也好,WebSphere也好,都需要删除临时文件。服务器端的临时文件。在客户端,做什么都没用。
我的建议:尽量不要用静态的include ,尽可能使用动态的include.
pageContext.include();
静态的include,包含和被包含文件是一个编译单位,尤其是有共享变量的时候,更加麻烦。
动态的include,只要保证被include能运行,并且出页面,就可以保证包含文件不会出编译期错误了。
中文问题:
mellon可否说一下具体怎么做?tomcat我及其不熟。
我的基本的思路是使用静态的include,将一些全局设置如类导入,设置contenttype,以及一些全局变量和一些通用逻辑,在include的文件中实现,从而提供对整个站点的一定的全局控制能力。
其中涉及到在inlcude文件中的变量给其它部分共享使用,使用动态include不太合适。
mellon的解释是否可这样理解:
不论是静态或动态include(不论是否做为一个编译单位编译),都需要再每个jsp文件中(母(^_^)jsp、各个子include jsp)中指定jsp的编码方式,否则tomcat会对没有指定编码的那个jsp使用iso8859解析编译?
如果是这样,还叫做整体做为一个编译单元编译么?
你确信不一致吗?
我在windows平台和AIX平台以及HPUnix平台下使用的效果都是一样的呀,都不会自动更新。
至于原因,也很简单,比如weblogic,默认设置是1秒钟检测一次jsp的更新,你知道,检测一下文件的更新时间,是很容易的,但是如果要连使用include的文件都检测,就意味着所有的jsp文件都需要translate,找出其中有没有include这个文件,这个过程别说一秒钟,100秒都完不成。
所以,更新include文件,使用这个include的文件是不会自动更新的。
除非Web服务器将文件做标记记录下来。
tomcat和Websphere和weblogic反正不灵。
以前windows下用websphere的时候也没遇到过这种问题。
mellon,中文的那个问题,如何解决,详细说说吧。
如果,不能解决,就惨兮,几百个程序从头到尾都要修改。
我在4.0.3版本改过,就是下面的这个包,无论是Jbuilder用的这个tomcat4.0.3还是在jakarta down的tomcat4.0.3都灵。
G:\JBuilder7\jakarta-tomcat-4.0.3\lib\jasper-compiler.jar
改的那个文件叫做org.apache.jasper.compiler.ParserControl.java
.....
public ParserController(JspCompilationContext ctxt)
{
baseDirStack = new Stack();
jspHandler = null;
isTopFile = true;
//topFileEncoding = "ISO-8859-1";
topFileEncoding = "GBK";
this.ctxt = ctxt;
jspHandler = new JspParseEventListener(ctxt, this);
}
.....
注掉的那一行topFileEncoding = "ISO-8859-1";是原来的topFileEncoding = "GBK";是我加的。就可以了。