背景:由于公司国际化项目需要,而系统在最初开发时,完全没考虑过将来要做国际化。采用的是硬编码的模式,单需要修改的jsp页面就达170多个,可谓任重道远啊。后来经过编写批量提取工具提取,大约有4000多处直接写中文的地方需要修改。懒人自有妙懒人计。编个工具批量提取替换呗。
难题: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文件即可
分享到:
相关推荐
类似于Struts 1.x中的`<bean>`标签,用于在JSP页面中访问和操作JavaBean对象的属性。 #### `<s:checkbox>` 和 `<s:checkboxlist>` 标签 分别用于生成单个复选框和复选框列表,支持数据绑定和值列表选择。 #### `...
- `<s:property>`:用于显示对象的属性值,如`<s:property value="user.name" />`。 - `<s:set>`:用于设置变量,如`<s:set var="myVar" value="user.name" />`。 - `<s:if>`和`<s:else>`:基于OGNL表达式的条件...
在Struts2中,不再像Struts1.x那样将标签库分为html、bean、logic和tiles等类别,而是统一使用一个`<s>`前缀的标签库,只需在JSP页面头部引入`<%@ taglib prefix="s" uri="/struts-tags" %>`即可使用所有标签。...
这些只是Struts2标签库的一部分,实际上还有更多如`<s:form>`, `<s:select>`, `<s:textarea>`等标签,它们分别用于表单处理、选择列表和文本区域等。Struts2的标签库大大简化了JSP页面的编写,提高了代码的可维护性...
14. **s:include标签**:包含其他JSP页面,类似于JSP的<jsp:include>,但支持动态参数传递。 15. **s:url标签**和**s:a标签**:创建链接,s:url用于构建URL,s:a则用于创建超链接,支持动态参数和Action调用。 16....
例如,在提供的代码片段中,可以看到`<%@ taglib prefix="s" uri="/struts-tags"%>`引入了Struts2的标签库,这使得在JSP中可以方便地使用OGNL表达式来操作页面上的Java对象。 ```jsp <%request.setAttribute("sex",...
- 在JSP页面中引入Struts标签库,通过`<%@ taglib %>指令完成。 - 标签属性的设置,例如`value`、`name`、`action`等,根据具体标签的语义来配置。 - 标签之间的嵌套,可以组合实现复杂功能。 - 配合OGNL...
- **用Struts2标签输出错误信息**:使用Struts2提供的标签(如`<s:fielderror>`)来显示校验失败的信息。 - **基于XML配置方式**:在`struts.xml`文件中定义校验规则。 - **对指定方法校验**:可以为特定的方法...
5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @...
5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 ...
- **nested标签库**:用于处理嵌套的数据结构,如`nested:iterate`。 **令牌** - **目的**:防止表单重复提交。 - **实现**:通过在表单中添加一个隐藏字段,并在提交表单前验证该字段的值是否有效。 **文件上传*...
5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 ...
- 通过`<%@ page attribute="value" %>`设置JSP页面的属性。 **5. 可重用的组件(JavaBean)** - JavaBean是一种遵循特定规范的Java类,通常用于封装数据或业务逻辑。 #### JSTL (JavaServer Pages Standard Tag ...
5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @...
5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 ...