【问题标题】:Editing a row using Struts 2 and Hibernate is not working使用 Struts 2 和 Hibernate 编辑行不起作用
【发布时间】:2015-06-19 05:41:32
【问题描述】:

我无法使用 struts2 hibernate 编辑表。在 Apache 控制台中,我可以看到更新查询已执行,但是从表中它只是删除了数据,并且在尝试将其插入到新行中时,它被插入到不在同一行中的新行中。谁能帮忙看看这段代码有什么问题

用于编辑的 DAO:

public static boolean update(trainee p)
{
    Boolean a=false;
    Session session=new Configuration().configure("hibernate.cfg.xml").buildSessionFactory().openSession(); 
     Transaction tp=session.beginTransaction();  
     trainee u=(trainee) session.get(trainee.class, p.getId());
     if(u!=null)
     {
     u.setAddress(p.getAddress());
     u.setPhone(p.getPhone());
     u.setAge(p.getAge());
     u.setTname(p.getTname());
     u.setGender(p.getGender());
     u.setTechnology(p.getTechnology());
     u.setEmail(p.getEmail());
     session.update(u);
     }
     tp.commit();
     System.out.println("Command successfully executed....");
     session.close();
     if(tp != null){
        a=true;
    }
           return a;
}    

动作类:

public String update()
{
    String x="input";
    trainee u=new trainee();
    u.setId(id);
    u.setAddress(address);
    u.setPhone(phone);
    u.setAge(age);
    u.setTname(tname);
    u.setGender(gender);
    u.setTechnology(technology);
    u.setEmail(email);
    if(RegisterDao.update(u))
        {
        x="success";
        }
    return x;
}

Struts.xml

<action name="update" class="com.ilp.action.taineeAction" method="update">
            <result name="success" type="redirect">TraineeRegistration.jsp</result>
            <result name="input">ViewTrainees.jsp</result> 
</action>

TraineeRegistration.jsp

<s:form action="traineeReg">
<s:textfield label="TraineeName" name="tname"></s:textfield>
<s:textfield label="Email Id" name="email"></s:textfield>
<s:radio name="gender" list="{'Male','Female'}"></s:radio>
<s:textfield label="Age" name="age"></s:textfield>
<s:textfield label="Phone Number" name="phone"></s:textfield>
<s:textarea label="Address" name="address"></s:textarea>
<s:select name="technology" list="{'Java','J2ee','Dot Net','Oracle'}" headerKey="" headerValue="Select" label="SelectTechnology" />
<s:submit/>
</s:form>

Hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC  
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
      "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>  

<session-factory>  
    <property name="hbm2ddl.auto">update</property>  
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost/javadb</property>
    <property name="connection.username">root</property>  
    <property name="connection.password">cis@123</property>  
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
    <property name="show_sql">true</property>
<mapping class="com.ilp.bean.trainee"/>  
</session-factory>  

viewtrainee.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="/struts-tags" prefix="s" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>List Of Trainees Registered</title>
</head>
<body>
<table border=1px>
<tr>
<th>Trainee Name</th>
<th>Email</th>
<th>Gender</th>
<th>Age</th>
<th>Ph No</th>
<th>Address</th>
<th>Technology</th>
<th>Edit</th>
<th>Delete</th>
<s:iterator value="contactList">
    <tr>
        <td><s:property value="tname" /></td>
        <td><s:property value="email" /></td>
        <td><s:property value="gender" /></td>
        <td><s:property value="age" /></td>
        <td><s:property value="phone" /></td>
        <td><s:property value="address" /></td>
        <td><s:property value="technology" /></td>
        <td><a href="update?id=<s:property value="id"/>">edit</a></td>
        <td><a href="delete?id=<s:property value="id"/>">delete</a></td>
    </tr>
</s:iterator>
</table>

<a href="TraineeRegistration.jsp">Add Trainee</a> &nbsp;&nbsp;
</body>
</html>

【问题讨论】:

  • 你能显示ViewTrainees.jsp吗?
  • @NaMaN 我添加了 view trainee.jsp

标签: java hibernate jsp struts2 ognl


【解决方案1】:

您没有在操作中设置id 属性。一旦使用您在休眠会话中获得的对象的值设置属性,您就可以使用 OGNL 将隐藏字段绑定到该属性。

<s:form action="traineeReg">
<s:hidden name="id" value="%{id}"/>
<s:textfield label="TraineeName" name="tname"></s:textfield>
<s:textfield label="Email Id" name="email"></s:textfield>
<s:radio name="gender" list="{'Male','Female'}"></s:radio>
<s:textfield label="Age" name="age"></s:textfield>
<s:textfield label="Phone Number" name="phone"></s:textfield>
<s:textarea label="Address" name="address"></s:textarea>
<s:select name="technology" list="{'Java','J2ee','Dot Net','Oracle'}" headerKey="" headerValue="Select" label="SelectTechnology" />
<s:submit/>
</s:form>

当您调用u.setId(id); 时,该值应该已经存在。

您还应该修改代码以插入新记录。

 if (p.getId() != null) {
  trainee u=(trainee) session.get(trainee.class, p.getId());
  u.setAddress(p.getAddress());
  u.setPhone(p.getPhone());
  u.setAge(p.getAge());
  u.setTname(p.getTname());
  u.setGender(p.getGender());
  u.setTechnology(p.getTechnology());
  u.setEmail(p.getEmail());    
  session.update(u);
 } else session.save(p);

【讨论】:

  • 这里我同意你的 ID 属性,但如果 id 为空,那么它应该创建一个新记录,因为她添加了如下所示的非空条件。受训者 u=(受训者) session.get(受训者.class, p.getId()); if(u!=null)
  • @Ranjitsinh 已更新以插入新记录。
  • 非常感谢您的回复。我已尝试根据上面更新的代码修改 TraineeRegistration.jsp 和 DAO 类,但我仍然遇到相同的错误。当我在表格中单击编辑时,它将删除所有留下空白行的数据,并将我插入的新数据添加为新行。我找不到问题所在。
  • @Neelam Baruah 能否提供 hibernate cfg 配置的示例代码?
  • @Ranjitsinh 我添加了 hibernate.cfg.xml
【解决方案2】:

好的,你的问题是当你点击更新链接成功时你打开TraineeRegistration.jsp并且在这个jsp中你已经定义了&lt;s:form action="traineeReg"&gt;所以当你点击提交按钮填写表单后它会触发新的插入动作与action="traineeReg" 它将插入数据作为新行。

您可以做的是,您可以再创建一个操作EDIT,并在该操作中编写代码以获取选定 id 的数据,然后将该数据传递给 jsp 并用现有值填充表单,而不是提交编写代码以更新数据: 下面的代码将帮助您获取ID的特定数据:

EditAction.java

public String edit()
    {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();

        Query q = s.getNamedQuery("findbyid").setInteger("id", getId());
        al = (ArrayList<User>)q.list();

        return"success";
    }

要使用namedquery,您需要在类标记&lt;/class&gt; 结束后将以下代码添加到name.hbm.xml。

<query name="findbyid">
    <![CDATA[from User u where u.id = :id]]>
</query>

而不是将这个列表传递给jsp并对其进行迭代

edit.jsp

<s:form action="update">
    <s:iterator id="lis" value="al">
        <s:hidden name="id" value="%{id}"></s:hidden>
        <s:textfield name="name" label="Name" value="%{name}"></s:textfield>
        <s:textfield name="city" label="City" value="%{city}"></s:textfield>
        <s:textfield name="pin" label="Pincode" value="%{pin}"></s:textfield>
        <s:submit value="Save"/>
    </s:iterator>
</s:form>

然后在此更新操作上触发您已经编写的更新代码。您还需要在struts.xml 文件中添加编辑操作条目:

<action name="edit" class="com.EditAction" method="edit">
    <result name="success">/edit.jsp</result>
</action>

您也可以使用TraineeRegistration.jsp 而不是创建新的jsp edit.jsp,但为了简单起见创建新的jsp。

希望对你有帮助!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    相关资源
    最近更新 更多