0

在有一个 custprofileview显示包含客户所有详细信息的 JSP 页面的操作中,并且在我的 JSP 中,所有字段都像我的

<s:textfield name="custprofileVO.email" value="%{custprofileVO.email}" />
<s:textfield name="custprofileVO.phone" value="%{custprofileVO.phone}" />

并这样做,并且有一个调用 Action 的提交按钮updatecustprofile

updatecustprofile行动中,我没有直接映射属性,而是有一个 private CustprofileVO custprofileVO; 带有 setter 和 getter 的成员变量。

CustprofileVOClass 中,我有类似的字段emailphone以及所有其他字段及其 setter 和 getter 方法。

问题是:在updatecustprofile行动中,我正在实现Prepareable接口,在prepare()方法的实现中,我拥有custprofileVO.setDefaultID("Select");并设置了另外 4 个字段,但是当我通过单击提交按钮运行程序时,我进入NPE了第一行,即custprofileVO.setDefaultID("Select");

看起来框架没有实例化 CustprofileVO custprofileVOcustprofileVO如果我在该字段的设置上方手动实例化 (通过这样做custprofileVO = new CustprofileVO()它可以工作。问题是 - 理想情况下 struts2 框架应该给我它没有做的实例,想了解原因。

此外,如果我在准备方法中手动设置 custprofileVO它可以工作,但我也使用 XML 应用验证,其中我的字段名称是 custprofileVO.email,它的验证然后 是custprofileVO.phone它的验证。

当我尝试通过单击提交按钮验证运行时进行验证,但在屏幕上我看到所有字段的消息,因为所有文本框中的数据都被清空了。

为什么数据被删除?

4

1 回答 1

0

您不应该自己实例化来自 JSP 的对象。

要在prepare()方法中获取它,在 之前运行,Prepare Interceptor 需要使用特殊的堆栈Param InterceptorparamsPrepareParamsStack

 <!-- An example of the paramsPrepareParams trick. This stack
             is exactly the same as the defaultStack, except that it
             includes one extra interceptor before the prepare interceptor:
             the params interceptor.

             This is useful for when you wish to apply parameters directly
             to an object that you wish to load externally (such as a DAO
             or database or service layer), but can't load that object
             until at least the ID parameter has been loaded. By loading
             the parameters twice, you can retrieve the object in the
             prepare() method, allowing the second params interceptor to
             apply the values on the object. -->
        <interceptor-stack name="paramsPrepareParamsStack">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="i18n"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="multiselect"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
            </interceptor-ref>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="actionMappingParams"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</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>
于 2014-04-07T08:34:29.200 回答