OGNL 允许执行方法,但默认情况下禁用静态访问,因此您不能在表达式中使用静态方法。但是,您可以教 OGNL 哪些类需要访问静态方法。
方法调用是 OGNL 需要根据动态信息查找方法的另一个领域。该MethodAccessor
接口提供了一个挂钩来了解 OGNL 如何调用方法。当请求静态或实例方法时,调用此接口的实现者以实际执行该方法。
public interface MethodAccessor
{
Object callStaticMethod( Map context, Class targetClass, String methodName, List args )
throws MethodFailedException;
Object callMethod( Map context, Object target, String methodName, List args )
throws MethodFailedException;
}
您可以使用OgnlRuntime.setMethodAccessor()
. 这是 Object 的默认方法访问器(它只是根据方法名称和参数类型找到合适的方法,并使用反射来调用该方法)。
你可以编码一些东西
public class StringUtil extends StringUtils implements MethodAccessor {
//implement above methods
}
动作类
public static final String MESSAGE = "hello.message";
/**
* Field for Message property.
*/
private String message;
/**
* Return Message property.
*
* @return Message property
*/
public String getMessage() {
return message;
}
private StringUtil stringUtil = new StringUtil();
public StringUtil getStringUtil() {
return stringUtil;
}
public String execute() throws Exception {
setMessage(getText(MESSAGE));
OgnlRuntime.setMethodAccessor(StringUtil.class, stringUtil);
return SUCCESS;
}
在 JSP 中
<s:if test="!stringUtil.isEmpty(message)">
<h2><s:property value="message"/></h2>
</s:if>