Linux下tomcat中include的问题

redhat9+tomcat4.0.6

在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,则中文正常显示。

有点糊涂,为什么会这样。

今天听一个同事说unix系操作系统下,在jsp中使用include,在webshpere中有页面不刷新的问题(如a include b,b中使用out输入一个串,然后访问a,再将b中out注释,再访问a,则a中会一直有out出来的串。重起WEB服务器无效,清空IE缓存、重起客户端也无效。),在tomcat上试了一下也有这个问题。

linux下include的机制是什么样的,好像和windows平台差别很大?

还有谁遇到过此种问题?

晕倒,忘了jdon没过滤标签。

重发一楼



redhat9+tomcat4.0.6

在1.jsp中使用include

head.jsp中存放如下语句:
<%@page contentType="text/html;charset=gb2312"%>

此时jsp中写定的中文全部乱码。

但如果不使用include,将<%@page contentType="text/html;charset=gb2312"%>
直接写在1.jsp,则中文正常显示。

有点糊涂,为什么会这样。

第二个问题,是jsp容器判断jsp文件是否发生改变的机制linux下和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能运行,并且出页面,就可以保证包含文件不会出编译期错误了。

不刷新问题:
这个问题,原理容易理解。奇怪的是,linux下和windows平台下的不一致性。
从常理来说,使用的静态include,那么做为整体,不论那个部分发生变化都要重新解析和编译jsp文件。linux平台(win32还未发现此问题)处理是否已经更新的机制有些费解。

中文问题:

mellon可否说一下具体怎么做?tomcat我及其不熟。

我的基本的思路是使用静态的include,将一些全局设置如类导入,设置contenttype,以及一些全局变量和一些通用逻辑,在include的文件中实现,从而提供对整个站点的一定的全局控制能力。

其中涉及到在inlcude文件中的变量给其它部分共享使用,使用动态include不太合适。

mellon的解释是否可这样理解:

不论是静态或动态include(不论是否做为一个编译单位编译),都需要再每个jsp文件中(母(^_^)jsp、各个子include jsp)中指定jsp的编码方式,否则tomcat会对没有指定编码的那个jsp使用iso8859解析编译?

如果是这样,还叫做整体做为一个编译单元编译么?

"这个问题,原理容易理解。奇怪的是,linux下和windows平台下的不一致性。
从常理来说,使用的静态include,那么做为整体,不论那个部分发生变化都要重新解析和编译jsp文件。linux平台(win32还未发现此问题)处理是否已经更新的机制有些费解。"

你确信不一致吗?
我在windows平台和AIX平台以及HPUnix平台下使用的效果都是一样的呀,都不会自动更新。

至于原因,也很简单,比如weblogic,默认设置是1秒钟检测一次jsp的更新,你知道,检测一下文件的更新时间,是很容易的,但是如果要连使用include的文件都检测,就意味着所有的jsp文件都需要translate,找出其中有没有include这个文件,这个过程别说一秒钟,100秒都完不成。
所以,更新include文件,使用这个include的文件是不会自动更新的。
除非Web服务器将文件做标记记录下来。
tomcat和Websphere和weblogic反正不灵。

我用的测试平台是Win XP+Jrun3.02。可以刷新。

以前windows下用websphere的时候也没遇到过这种问题。

mellon,中文的那个问题,如何解决,详细说说吧。

如果,不能解决,就惨兮,几百个程序从头到尾都要修改。

我不知道你的tomcat版本是什么,我在4.0.3下面修改了jasper-compiler.jar包,但是放在4.1下面就不行了,因为4.1的包结构好像变了,有些类名也变了,。如果你的版本不同,你自己下载对应本本的源文件,修改相应的类就可以了。

我在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";是我加的。就可以了。

我的是4.0.6,我试试。