使用ModelDriven的Struts2不会将POST表单值加载到模型中

时间:2014-01-19 05:48:17

标签: java jsp parameters struts2 model-driven

我正在尝试使用Struts2的ModelDriven接口创建动态Web应用程序。我使用过Struts1,但这是我第一次尝试使用Struts2。

我可以从存储在数据库中的值填充表单,但是当我修改值并尝试更新数据库时,表单值不会加载到模型中。

我已将整个项目上传到https://bitbucket.org/tfeinstein/vikos.git(此时需要运行MySQL数据库)。

加载项目后:

  1. 转到http://localhost/Vikos/secure/user
  2. 您将被路由到登录页面。输入:logon email = consumer@test.com和password = password。
  3. 您将被带到User页面,其中包含从数据库填充的表单。如果更新“姓氏”字段并单击<Update>按钮,它应该更新数据库中的值,但不会传回值。
  4. 如何将HTML表单中的值导入模型?

    更新

    我重新发布了这篇文章,并对内容进行了一些修改,以便更准确地描述正在发生的事情。我还为UserAction.prepare()方法添加了一些调试代码。看起来Struts2尝试使用String数组(UserModel)加载parmValues属性,而不是参数数组的第一个元素(correctVal)。

    public void prepare() throws Exception {
    
        // BEGIN - ADDED FOR DEBUGGING PURPOSES         
        Map parameters = request.getParameterMap();
        Set keys = parameters.keySet();
        Iterator iter = keys.iterator();
        String key;
        String[] parmValues;
        while (iter.hasNext()) {
            key = iter.next().toString();
    
            parmValues = (String[])(String[])parameters.get(key);
            if (parmValues.length == 1) {
                String correctVal = parmValues[0];
                System.out.println(correctVal);  // This is printing out the correct updated form values.
            }
        }
        // END - ADDED FOR DEBUGGING PURPOSES
    
        determineCrudType();
    }
    
      

    13:21:42.773 [http-bio-80-exec-7] ERROR c.o.x.i.ParametersInterceptor    - 开发人员通知(将struts.devMode设置为false以禁用此消息):意外异常在'class上设置'email'   com.codedeart.vikos.action.UserAction:设置表达式时出错   'email'的值为'[Ljava.lang.String; @ 7e227c19'

         

    13:21:42.775 [http-bio-80-exec-7] ERROR c.o.x.i.ParametersInterceptor    - 开发人员通知(将struts.devMode设置为false以禁用此消息):意外的异常在'class上设置'firstName'   com.codedeart.vikos.action.UserAction:设置表达式时出错   'firstName',其值为'[Ljava.lang.String; @ 378da3ff'

         

    13:21:42.776 [http-bio-80-exec-7] ERROR c.o.x.i.ParametersInterceptor    - 开发人员通知(将struts.devMode设置为false以禁用此消息):意外异常在'class上设置'lastName'   com.codedeart.vikos.action.UserAction:设置表达式时出错   'lastName'的值为'[Ljava.lang.String; @ 3409d6d7'

         

    13:21:42.778 [http-bio-80-exec-7] ERROR c.o.x.i.ParametersInterceptor    - 开发人员通知(将struts.devMode设置为false以禁用此消息):意外的异常在'class上设置'middleName'   com.codedeart.vikos.action.UserAction:设置表达式时出错   'middleName'的值为'[Ljava.lang.String; @ 13b29db7'

    更新 - 第2轮

    看起来这个问题类似于使用自定义类型转换器修复它的其他人报告的问题。我试图基于此tutorial实现自定义类型转换器。我还没有达到实际进行任何类型转换的程度,因为我的UserTypeConverter上的方法没有触发。我已将最新代码上传到BitBucket。

    P.S:

    我的JSP和后端struts实现存在问题。答案是遵循Uchenna和Roman提供的建议。我将继续在BitBucket中更新我的项目,所以希望没有其他人需要犯这些错误。

2 个答案:

答案 0 :(得分:0)

您错误地将表单映射到user操作。 user操作映射到默认命名空间,但表单映射到/modelDriven命名空间。因此,当您提交表单时,您应该收到404错误。从表单标记中删除namespace属性,该标记应为struts标记。如果您未设置表单标记的名称空间属性,则操作可能使用默认名称空间。有关名称空间及其配置的更多信息,您可以找到here。要替换的代码

<s:form accept-charset="UTF-8" action="user" method="POST" theme="simple">

注意,为表单添加了simple主题,以免影响HTML设计。此外,如果您在开发人员模式下运行,如果正确映射了struts表单标记中的操作,则警告将消失。

另请注意,Java中的字符串与equals方法进行比较,而不是==。因此,crudType变量可能不会更改,并且会阻止更新操作。

答案 1 :(得分:0)

首先

我的jsp存在一些问题。为什么不为struts2使用(s:textfield)代码库input。看看你是否可以改变它。同时将namespace="/"添加到您的form元素。

其次

更改UserModel构造函数
public class UserModel extends BaseModel {    
    private UserVo userVo;      
    public UserModel() {
        super();
    }
}

public class UserModel extends BaseModel {    
    private UserVo userVo;      
    public UserModel() {
        super();
            userVo = new UserVo();
    }
}

第三

BaseModel实施java.io.Serializable,即

public abstract class BaseModel implements java.io.Serializable