简单的struts2登录
一个名为DataBean的bean中有两个属性data1 data2
action 方法中对DataBean使用泛型
public class Action4<T> {
private T dataBean;
public T getDataBean() {
return dataBean;
}
public void setDataBean(T dataBean) {
this.dataBean = dataBean;
}
public String execute(){
System.out.println("---Action4---"+((DataBean)dataBean).getData1());
System.out.println("---Action4---"+dataBean);
return "success";
}
}
前台登录页面为
<form action="a4.action" method="post">
<input type="text" name="dataBean.data1"><br/>
<input type="text" name="dataBean.data2"><br/>
<input type="submit" value="处理">
</form>
登录报错
警告: Error setting expression 'dataBean.data2' with value '[Ljava.lang.String;@b6d6ab'
ognl.NoSuchPropertyException: java.lang.Object.data2
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:166)
假如说action中不使用泛型则OK
试问 假如说我action中需要使用泛型 该如何修改
struts2??ognl??泛型
------解决方案--------------------
你错的不是泛型的问题
dataBean这个对象,没有data1和data2属性
------解决方案--------------------
1,调用struts的配置文件中的action名称,不知道你有写对了没,因为你没列出struts文件
2,前台的字段要与后台控制的action里面的属性相对应,你确定自己是否有正确对应
------解决方案--------------------
首先我没用过!其次,我觉得前台传过来的值都是明确类型的,我不会去用泛型去做,宁愿多写一些代码或者配置!
------解决方案--------------------
你很幸运,遇到了我,我刚刚解决了这个问题。
使用泛型,有些地方是可以,但是这里是不行的,因为涉及到对象实例化。
你可以把dataBean的get、set方法写成抽象方法,dataBean这个对象去子类里用实际的类定义,然后重写get、set方法就可以了。
------解决方案--------------------
补充一点,在子类中重写get方法后,可能返回null,所以不能像原来那样直接return dataBean,你需要加一个判断,如果为null,需要手工创建一个 if (dataBean == null) dataBean = new DataBean()