struts2 的 modeldriven Action中public Object getModel() 返回的是一个object
如果把Model的class name在代码中硬编码,对于每个model 就要写一个 action。我以前是给每个model的操作写相应的action和view,一般4组 create 、list、 update、 delete, 文件10多个,感觉太傻了
采用以下方式 ,让action 根据表单提交的信息来创建一个Model,这样可以修改配置文件,使得此class用于多个model的操作,更改配置文件即可
[code="java segment"]
public class ProcessModelForm extends ActionSupport implements ModelDriven {
private Class cl=null;
private String poClassName;
public String getPoClassName(){
return this.poClassName;
}
public void setPoClassName(String arg){
this.poClassName= arg;
}
public Object getModel() {
Object tmpo=null;
cl=null;
try {
cl = Class.forName(poClassName);
tmpo = cl.newInstance();
}
catch ( ClassNotFoundException ex ){
log.trace( ex + " Interpreter class must be in class path.");
}
catch( InstantiationException ex ){
log.trace( ex + " Interpreter class must be concrete.");
}
catch( IllegalAccessException ex ){
log.trace( ex + " Interpreter class must have a no-arg constructor.");
}
return tmpo;
}
[/code]
还需要更改interceptor stack,要在modelDriven interceptor之前为action class的poClassName属性赋值。我没有写新的interceptor, 在interceptor stack中使用"com.opensymphony.xwork2.interceptor.ParametersInterceptor"2次 ,interceptor 的名字要有区别:paramsfirst 和 params。
[code="struts.xml片段"]
<interceptors>
<interceptor name="paramsfirst" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor-stack name="theStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="paramsfirst">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="scopedModelDriven"/>
<!--interceptor-ref name="modelDriven"/-->
<interceptor-ref name="modelDriven">
<param name="refreshModelBeforeResult">true</param>
</interceptor-ref>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
[/code]
我对struts2还不是很熟悉,还有没有更优雅的方案?
可以在一个jsp result中怎么显示不同model的属性么???比如 在jsp中遍历model的属性并输出属性名字和值。。有谁这么做过么?
附件中是个demo,代码在里面,有ivy文件,需要下载所需要的jar(struts-2.1.8.1) 。