struts2+ 将表单值设置为 POJO 并将 POJO 值设置为表单

Posted

技术标签:

【中文标题】struts2+ 将表单值设置为 POJO 并将 POJO 值设置为表单【英文标题】:struts2+ Set Form value to POJO and Set POJO Value To form 【发布时间】:2014-06-20 06:06:15 【问题描述】:

在this post 中,您让我清楚了如何在 Struts 中处理 JAVA 对象;

JSP

<th>First Name :</th>
<td><input type="text" id ="em.firstName" name="em.firstName" value=""></td>
<th>Middle Name :</th>
<td><input type="text" id ="em.middleName" name="em.middleName" value=""></td>
<th>Last Name :</th>
<td><input type="text" id ="em.lastName" name="em.lastName" value=""></td>

动作类

public class contTest extends ActionSupport
  public Employee  em;
  public String execute()
    System.out.println("firstName-->>>"+em.getFirstName());
    System.out.println("lastName-->>>"+em.getLastName());
    return SUCCESS;
  

  //Setter and Getter of em object

现在我想使用相同的 JSP 从数据库中获取数据(并使用员工对象将值重新放入表单)进行更新。

如何将 em.firstName 与 Object firstName 变量进行映射?

编辑 1:

已编辑...

**更新3:**

希望现在可以清除它。

首先我选择员工并点击“开始”按钮。

$('#Go').click(function()
    if($("#txtEmpId").val() == "" || $("#txtEmpId_name").val()=="")
        alert("Please Select Employee.");
        return false;
    
    $.ajax(
        type: 'POST',
        url: 'EmpView.action',
        data: $("#FrmEmp").serialize(),
    ).done(function(data) 
        $("#FrmEmp").submit();
    );
    $('#EmployeeDet,#divEmpId').show();
);

Struts.xml

<action name="EmpView" class="com.Test.Controller.EmpCntr" method= "EmpView">
    /*I tried with Both*/
    <result name = "success" type="json"/>

    or

    <result name="success">/AddEmp.jsp</result>
</action>

动作类:

public String EmpView() throws SQLException, IOException
    System.out.println("em.firstName--->>>"+em.getFirstName());
    System.out.println("em.lastName--->>>"+em.getLastName());
    try 
        CachedRowset tmList = TmMo.GetEmpViewData(ProcName,ParaName);

        int numcols = tmList.getMetaData().getColumnCount();
        List <String> row = new ArrayList<>(numcols);
        while (tmList.next()) 
            for (int i=1; i<= numcols; i++) 
                row.add(tmList.getString(i));
                em.setEmployeeId(tmList.getString("employeeId"));
                em.setFirstName(tmList.getString("firstName"));
            
        
        System.out.println("em.firstName--->>>"+em.getFirstName());
        System.out.println("em.lastName--->>>"+em.getLastName());
        /*Here i am getting the Name */
     catch (Exception e) 
        e.printStackTrace();
    
    return Action.SUCCESS;

AddEmp.jsp

前往按钮:

<td>
<button type = "button" name = "Go" id= "Go">Go</button>
<button type = "button" name = "Add" id= "Add">Add Employee</button>
</td>

表单字段:

<th>First Name :</th>
<td><input type = "text" id ="em.firstName" name = "em.firstName" value = "<s:property value='em.firstName'/>" ></td>           
    or 
<s:textfield id ="em.firstName" name = "em.firstName"/>

我尝试了这两种方法并为我想做的事情扫清了道路。删除了所有不需要的东西并仅放置示例代码并仅尝试使用示例之一。它不工作!我可以清除你吗?你能帮我在哪里错过吗??

【问题讨论】:

请停止使用 [tag:] 来称呼您的问题描述中的人...1)它不起作用,2)它是错误的,3)它很难看,4)它没用 你确定..下次不会那样做。而你不知道答案仪式? 这里没有任何 jQuery。您的对象是 emp 而不是 em 你的意思是当网页加载它时从数据库中获取数据,或者当你点击提交按钮时它会从数据库中获取数据并再次加载相同的页面? 我正在使用提交按钮将表单添加到数据库中。对于更新,我想选择员工 ID 并将数据从数据库获取到员工对象以及从对象到 html 表单(如果可能通过 ajax 不重新加载)。我可以从数据库中设置员工对象。但是我怎样才能设置回 HTML 呢?? 【参考方案1】:

如果您询问如何在两个对象之间映射属性,一个来自页面,另一个来自数据库,比如EmployeeEmployeeDto,您可以使用Apache Commons BeanUtils.CopyProperties(target,source)

它将源对象的所有属性复制到按名称匹配它们的目标对象。

编辑:

由于您只有一个对象,因此它已经被映射。只需从所有标签中删除 value=""

还请注意,您的对象必须在 Action 类和 JSP 中都称为 ememp,而现在它们是 empem,因此不匹配...并记住放置 getter,设置器和 Employee 对象的默认无参数构造函数。

最后,不要使用 2008 年的 Struts 2.0,使用 Struts 2.3.16.x 或更高版本。

编辑 2:

哦,亲爱的。没注意到您使用的是标准输入...改用&lt;s:textfield /&gt; 标签:

<s:textfield name="em.firstName"  />
<s:textfield name="em.middleName" />
<s:textfield name="em.lastName"   />

或者不使用struts标签,值中有标签:

<input type="text" name="em.firstName"  value="<s:property value='em.firstName'/>"  />
<input type="text" name="em.middleName" value="<s:property value='em.middleName'/>" />
<input type="text" name="em.lastName"   value="<s:property value='em.lastName'/>"   />

【讨论】:

但是我没有 2 个对象,我有一个 HTML 表单的 JSP 页面,添加我使用了上述逻辑。我只想显示现有数据,这意味着我从数据库中检索数据并将其放入 Employee 对象中,然后我想在 JSP 中显示值。这里我的名字和 ID 属性都是以“em.”开头的。我怎样才能映射它。? 一点都不清楚。我已经编辑了最后一次,向您展示如何在没有 s:textfield 的情况下进行操作。您需要使用 s:property 顺便说一句。如果你不能使用任何 struts 标签,那你为什么要使用 Struts 2 呢?此外,您使用的一堆技术和技巧只会增加复杂性,而不是清晰......我强烈建议您逐步进行,首先使用小型运行示例,包含在更大的页面/操作/以后的项目。像这样在黑暗中连续跳跃。 KISS 范式 FTW。 对不起,我不能。它将导致另一个更新,然后另一个,然后......请从头开始,也许遵循一个不是 2008 年而不是 roseindia 的网站的教程 :) 你问的是非常基本的,事实上它不起作用主要是由于您的代码/模式/工作方法过于复杂。 “ 东西”清楚地表明了这一点(我在黑暗中尝试过苹果和香蕉......)。一步一步是这里唯一的解决方案 @AndreaLigios:最后的评论应该是结束的原因之一。 ;) 罗密欧:很高兴你解决了,谢谢你的接受。 @AleksandrM:我想我失去了你:)?【参考方案2】:

已解决:

我创建了一个 Employee DAO 对象并将 DAO 分配给 Action Class Getter , Setter Employee Object Variable。

这是我最新的代码。

public String EmpView() throws SQLException, IOException
    System.out.println("em.firstName--->>>"+em.getFirstName());
    System.out.println("em.lastName--->>>"+em.getLastName());
    try 
        CachedRowset tmList = TmMo.GetEmpViewData(ProcName,ParaName);

        while (tmList.next()) 
            for (int i=1; i<= numcols; i++) 
                Employee emp = new Employee();
                emp.setEmployeeId(tmList.getString("employeeId"));
                emp.setFirstName(tmList.getString("firstName"));
                em = emp;
            
        
        System.out.println("em.firstName--->>>"+em.getFirstName());
        System.out.println("em.lastName--->>>"+em.getLastName());
        /*Here i am getting the Name */
     catch (Exception e) 
        e.printStackTrace();
    
    return Action.SUCCESS;

我正在 HTML 表单中获取值。我使用相同的页面来添加和编辑员工详细信息。

正如 Andrea 所建议的,我已删除 HTML 标准并使用 Struts 标签并接受 Andrea 回复作为答案。

非常感谢。

【讨论】:

以上是关于struts2+ 将表单值设置为 POJO 并将 POJO 值设置为表单的主要内容,如果未能解决你的问题,请参考以下文章

Struts2 radio:如果未设置模型,则预设值

Struts2入门——Struts2的文件上传和下载

Struts 2 框架特性

struts2笔记

我如何遍历表单数组并将其值设置为打字稿中的另一个数组?

Spring Boot Redis 将 POJO 列表存储为值