Struts2中使用OGNL表达式语言访问静态方法和静态属性以及我遇到

1.上一篇文章,我介绍了OGNL表达式语言,本来想在那篇文章上加上一个使用OGNL访问静态方法和静态属性的例子,但是昨天晚上我写代码时,报了一个警告,获取得到静态属性的值,却获取不到静态方法的返回值,所以今天特别的写篇文章来介绍一下。

2.这里我先附上这个例子,来了解如何使用OGNL表达式访问静态方法和属性。

(1).其中访问静态方法或者静态属性的语法分别为:@类的路径@方法名,@类的路径@属性名,语法中类的路径,即包名+类名。

(2).对于OGNL来说,java.lang.Math是其默认的类,如果调用java.lang.Math的静态方法时,无需指定类的名字,比如:@@min(4,10),就比较两者谁比较小,输出较小的那个数。

注:其中第一点也可以理解为调用一个类的静态方法和静态属性,其中第二点也可以理解为调用JDK类中的静态方法。

(3).项目结构图如下:

(4).首先新建一个Struts2项目,项目名为StaticTest,新建一个类,放在com.gk包下,类名为StaticTest,完整代码如下:

package com.gk;public class StaticTest{public static String str="static property";public static String s(){return "static method";}}

打开index.jsp页面,编码格式改为utf-8,加入<%@ taglib uri="/struts-tags" prefix="s" %>,就可以使用struts的标签,具体代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib uri="/struts-tags" prefix="s" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!–<link rel="stylesheet" type="text/css" href="styles.css">–> </head><body> <ol><li>访问静态方法:<s:property value="@com.gk.StaticTest@s()"/></li><li>访问静态属性:<s:property value="@com.gk.StaticTest@str"/></li><li>访问java.lang.Math类的静态方法:<s:property value="@@max(2,5)"/></li><s:debug></s:debug></ol> </body></html>

一定要在struts.xml配置文件中配置允许使用OGNL访问静态方法,否则不能使用OGNL访问静态方法,必须在struts.xml文件中加入这行代码:

<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

其中完整struts.xml文件如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"""><struts><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><constant name="struts.devMode" value="true"></constant><constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant></struts>

(5).接着部署该项目到Tomcat服务器上,开启Tomcat服务器,运行后如下:

为何取不到静态方法的返回值呢?很奇怪!

3.发现访问静态方法,获取不出它的返回值,然后看一下控制台,有警告信息,但是不是错误,警告信息如下图所示:

这个警告信息使我搞了我半天都没解决,控制台输出的信息是com.opensymphony.xwork2.ognl.SecurityMemberAccesswarn个类警告,警告内容是Target class [class com.gk.StaticTest] or declaring class of member type [public static java.lang.String com.gk.StaticTest.s()] are excluded! ,意思是目标类StaicTest类或者声明类的成员类型[public static java.lang.String com.gk.StaticTest.s()]是被排除,被赶出了,表明意思是这样,我就百度了一下,发现有小部分的同学都会报这错误,但是都没解决,所以我就去查看一下底层代码,看能看出个所以然么?

陪我们走过一段别人无法替代的记忆。在那里,

Struts2中使用OGNL表达式语言访问静态方法和静态属性以及我遇到

相关文章:

你感兴趣的文章:

标签云: