bbscbb 2010-07-29 19:30
浏览 269
已采纳

在struts2 的 modeldriven Action中根据表单提交的字段指定model的class,这样做可以么?

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) 。

  • 写回答

2条回答 默认 最新

  • weixin_42525443 2010-07-30 13:22
    关注

    有个叫做springside的项目已经实现了类似功能,你可以参考一下,
    www.springside.org.cn

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。