2

我正在尝试使用ModelDrivenStruts 2 的界面创建一个动态 Web 应用程序。我使用过 Struts1,但这是我第一次尝试使用 Struts 2。

我能够从存储在数据库中的值填充表单,但是当我修改值并尝试更新数据库时,表单值没有被加载到模型中。

我已经在这里上传了整个项目(此时它确实需要一个 MySQL 数据库来运行)。

加载项目后:

  1. http://localhost/Vikos/secure/user
  2. 您将被引导至登录页面。输入:logon email = consumer@test.compassword = password
  3. 您将被带到一个User页面,其中包含从数据库填充的表单。如果您更新姓氏字段并点击<Update>按钮,它应该更新数据库中的值,但它不会将值传回。

如何从 HTML 表单中获取值到模型中?

更新:

我重新命名了这篇文章并稍微修改了内容以更准确地描述正在发生的事情。我还在UserAction.prepare()方法中添加了一些调试代码。看起来 Struts2 正在尝试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] 错误 coxiParametersInterceptor

  • 开发人员通知(将 struts.devMode 设置为 false 以禁用此消息):在 'class com.codedeart.vikos.action.UserAction 上设置'email'时捕获意外异常:错误设置表达式'email',值为'[Ljava.lang.String ;@7e227c19'

13:21:42.775 [http-bio-80-exec-7] 错误 coxiParametersInterceptor

  • 开发人员通知(将 struts.devMode 设置为 false 以禁用此消息):在 'class com.codedeart.vikos.action.UserAction 上设置'firstName'时捕获意外异常:错误设置表达式'firstName'的值为'[Ljava.lang.String ;@378da3ff'

13:21:42.776 [http-bio-80-exec-7] 错误 coxiParametersInterceptor

  • 开发人员通知(将 struts.devMode 设置为 false 以禁用此消息):在 'class com.codedeart.vikos.action.UserAction 上设置'lastName'时捕获意外异常:错误设置表达式'lastName'的值'[Ljava.lang.String ;@3409d6d7'

13:21:42.778 [http-bio-80-exec-7] 错误 coxiParametersInterceptor

  • 开发人员通知(将 struts.devMode 设置为 false 以禁用此消息):在“com.codedeart.vikos.action.UserAction 类”上设置“middleName”时捕获意外异常:设置表达式“middleName”时出错,值为“[Ljava.lang.String” ;@13b29db7'

更新2:

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

PS:

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

4

2 回答 2

0

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

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

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

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

于 2014-01-19T12:03:50.253 回答
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
于 2014-01-21T06:47:13.863 回答