【问题标题】:JSP Input data (Welcome.Jsp) cannot get by Java code (OrderProcessingAction.saveOrUpdate() )JSP 输入数据(Welcome.Jsp)无法通过 Java 代码获取(OrderProcessingAction.saveOrUpdate())
【发布时间】:2013-04-29 22:44:36
【问题描述】:

JSP 页面输入用户的详细信息并发送到struts 动作,struts.xml 将动作映射到动作类OrderProcessingAction 方法saveOrUpdate() 并且此方法调用DAO 类的saveOrUpdateUser(),其中实际数据访问DB 表字段。

以下是可交付成果:

  1. JSP 页面 Welcome.jsp
  2. ActionClass : OrderProcessingAction.java
  3. 数据访问 UserDaoFactory.java 对象
  4. struts.xml 文件
/**
 * Welcome.Jsp : Here my JSP page code.
 */
<s:form method="post" name="myform" action="saveOrUpdate.action">

    <s:textfield label="Customer Name" name="username" size="30"/>

    <s:password label="Customer Password" name="password" size="30"/>

    <s:textfield label="Contact No" name="contact" size="30"/>

    <s:textfield label="Email" name="email" size="30"/>

    <s:textfield label="City" name="city" size="30"/>


    <s:submit label="Submit" />
    <s:reset label="Clear"/>

</s:form>

这里是struts.xml 文件。

<action name="saveOrUpdate" 
        class="com.view.OrderProcessingAction" 
        method="saveOrUpdate">
 <result name="success">/Welcome.jsp</result>
</action> 

下面是我的 OrderProcessingAction (ActionClass),我正在调用 DAO 类方法。

private String username;
private String password;
private int contact;
private String email;
private String city;

//Pojo class OrderPorcessing reference initiated
OrderProcessing user = new OrderProcessing();   

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}   
public int getContact() {
    return contact;
}
public void setContact(int contact) {
    this.contact = contact;
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public String getCity() {
    return city;
}
public void setCity(String city) {
    this.city = city;
}

  /**
  * To save or update user. 
   * @return String
  */
   public String saveOrUpdate(){

    userDaoFactory.saveOrUpdateUser(user);
    System.out.println("User Name: " +user.getUsername());
    return SUCCESS;
  }

DAO 类的 saveOrUpdate 方法下方。

     /**
     * Used to save or update a user by saveOrUpdate().
     * @return void
     */
      public void saveOrUpdateUser(User user) {
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        tx = session.getTransaction();

        session.saveOrUpdate(user);

        tx.commit();
        session.close();

    } catch (Exception e) {

        e.printStackTrace();
    }
}

【问题讨论】:

  • 似乎您已经跳过了 strut、hibernate 和所有天堂般的框架,而没有清除您的基本知识,例如 JSP 和应用程序服务器交互。虽然你并不孤单。大多数人甚至在没有先了解其本质的情况下就被推入 SPRING STRUT 事物。以至于有些新手认为没有这些框架就无法设计应用程序。我会建议你对 Request 对象、Session 对象等基础做更多的研究,然后学习为它们设计的包装器。
  • 是的!感谢指正:)但我所说的一切,我仍然坚持。
  • @mawia :我知道您给了我正确的指导。是的,我是新手。我没有在用户参考中获得价值。我知道我在获取这些值的某个地方是错误的。让我知道我的不足之处。

标签: java hibernate jsp jakarta-ee struts2


【解决方案1】:

而不是这样做

System.out.println("User Name: " +user.getUsername());

这样做

System.out.println("User Name: " +getUsername());

【讨论】:

  • 但用户对象/引用不保存表单输入值。所以 DAO 类不能保存用户对象数据。
  • 当我看到你的代码时,每次请求都会创建你的动作类的一个新对象,这会导致实例变量 user 再次重新初始化,现在当调用到达 saveorupdate 方法时,用户引用什么都不是但是在您的操作类的第一行中创建了一个新对象,因此该对象没有可用的表单数据。如果您想要表单数据,请不要初始化用户并且在 jsp 中而不是在 name 属性中提供用户名提供 user.username。这肯定会将表单数据放入用户引用中。
  • 所以不是 OrderProcessing user = new OrderProcessing();我应该只写吗,OrderProcessing 用户;
  • 是的,并为用户提供 getter 和 setter...还使用 user.username 和 user.password 映射表单字段,而不仅仅是用户名、密码等
  • 不,它会给出一个错误:尝试使用空实体创建 saveOrUpdate 事件。因为如果用户不初始化锄头,它将存储这些值。
【解决方案2】:

在您的代码中,您应该将 DAO 替换为 typical transaction

典型的交易应该使用以下成语:

 Session sess = factory.openSession();
 Transaction tx;
 try {
     tx = sess.beginTransaction();
     //do some work
     ...
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
 }
 finally {
     sess.close();
 }

【讨论】:

  • 据我所知 struts.xml 文件我声明 /欢迎。 jsp 所以 saveOrUpdate 方法会调用 execute() 的 insted,因为如果我没有在方法动作标签中定义而不是默认采用 execute() 方法。在我的情况下,我定义将其重定向到动作类的 saveOrUpdate() 。
  • 其他按钮也saveOrUpdate执行了吗?
  • 不,但是删除和其他操作在相同的映射样式下效果很好。
  • 好的,您的操作映射得很好,但是事务管理呢?但是.action 不是必需的。
  • 先生,我的应用程序运行平稳,我认为我没有任何映射问题。 .action 或没有两者都可以很好地工作。实际问题可能是每个请求都会创建一个新的 action 类对象,这会导致实例变量 op 再次重新初始化。而我使用 saveOrUpdate() 的时间是在动作类中启动的新引用。所以打印了空值。
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多