背景:由于公司国际化项目需要,而系统在最初开发时,完全没考虑过将来要做国际化。采用的是硬编码的模式,单需要修改的jsp页面就达170多个,可谓任重道远啊。后来经过编写批量提取工具提取,大约有4000多处直接写中文的地方需要修改。懒人自有妙懒人计。编个工具批量提取替换呗。
难题:struts 的 select 标签的 headerValue 属性值不支持使用jsp表达式
解决方案:暴力修改jboss的jsp编译检验过程,使struts<s:select headerValue>支持jsp表达式<%=%>
实战过程:
到http://nchc.dl.sourceforge.net/project/jboss/JBoss/JBoss-4.2.3.GA/jboss-4.2.3.GA-src.tar.gz下载源码
主要的源文件是Japser的/Japser/src/org/apache/jasper/compiler/Validator.java
修改为:
把Japser项目,编译后替换\server\default\deploy\jboss-web.deployer目录下jbossweb.jar文件即可
难题:struts 的 select 标签的 headerValue 属性值不支持使用jsp表达式
org.apache.jasper.JasperException: /service/service_manager.jsp(42,7) According to TLD or attribute directive in tag file, attribute headerValue does not accept any expressions
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1172)
at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:819)
at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1507)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2338)
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2388)
at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2394)
at org.apache.jasper.compiler.Node$Root.accept(Node.java:489)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2338)
at org.apache.jasper.compiler.Validator.validate(Validator.java:1737)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:178)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:316)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
解决方案:暴力修改jboss的jsp编译检验过程,使struts<s:select headerValue>支持jsp表达式<%=%>
实战过程:
到http://nchc.dl.sourceforge.net/project/jboss/JBoss/JBoss-4.2.3.GA/jboss-4.2.3.GA-src.tar.gz下载源码
主要的源文件是Japser的/Japser/src/org/apache/jasper/compiler/Validator.java
} else {
// Attribute does not accept any expressions.
// Make sure its value does not contain any.
if (expression) {
err.jspError(n, "jsp.error.attribute.custom.non_rt_with_expr",
tldAttrs[j].getName());
}
jspAttrs[i] = new Node.JspAttribute(tldAttrs[j],
attrs.getQName(i), attrs.getURI(i), attrs
.getLocalName(i),
attrs.getValue(i), false, null, false);
}
修改为:
} else {
// Attribute does not accept any expressions.
// Make sure its value does not contain any.
if (expression) {
String value = attrs.getValue(i);
if("headerValue".equals(attrs.getQName(i))&&value.startsWith("<%=")&&value.endsWith("%>")){
jspAttrs[i] = getJspAttribute(tldAttrs[j],
attrs.getQName(i), attrs.getURI(i),
attrs.getLocalName(i), attrs
.getValue(i), String.class, n,
false);
found = true;
break;
}
err.jspError(n, "jsp.error.attribute.custom.non_rt_with_expr",
tldAttrs[j].getName());
}
jspAttrs[i] = new Node.JspAttribute(tldAttrs[j],
attrs.getQName(i), attrs.getURI(i), attrs
.getLocalName(i),
attrs.getValue(i), false, null, false);
}
把Japser项目,编译后替换\server\default\deploy\jboss-web.deployer目录下jbossweb.jar文件即可