首页 > 开发 > JAVA > 正文

struts2中的一个疑惑?

2017-09-07 09:24:18  来源:网友分享

在Action定义一个私有属性并设置set get方法:

    private String hello="hello silenceper!";    public void setHello(String hello){        this.hello=hello;    }    public String getHello(){        return hello;    }

可以在jsp页面中通过EL表达式和struts2标签来获取属性的值:<s:property value="hello"/> 或者${requestScope.hello}

但是如果设置属性为public 并且 不设置set get方法的话,还是可以通过上面两中方法来获取。

这是为什么?

还有就是属性怎么到requestScope中去了?

解决方案

通过反射 (java.reflect) 即可遍历和获取对象的属性和方法,Struts 可以在发现指定命名的属性而未发现getter方法时直接返回该属性的值,如果有对应的getter方法则调用方法获取。

可参考我的代码理解(这个代码比较简单):

https://github.com/ihongs/HongsCORE/blob/develop/src/java/app/hongs/action/Action.java#L108

第108行开始,通过给定的类和方法名实例化类并执行相应方法。此类为根据URL自动执行对应的类中的方法。

另外补充点,由于java修饰符的限制,无法获取一个外部类的private的属性,故你将属性声明为private的而又不提供getter方法(注意,getter方法也不能是private的),他当然也就没法获取了。


requestScope 是 request.getAttribute 的等价形式,在解析 ${requestScope.xxx} 时调用 request.getAttribute("xxx") 获取。