【问题标题】:How to maintain the session using Struts 2 and Hibernate?如何使用 Struts 2 和 Hibernate 维护会话?
【发布时间】:2013-06-05 05:45:09
【问题描述】:

我需要知道如何使用 Struts2 维护一个表单和多个 input [Name, City, Country] 的会话,最后数据将使用 Hibernate 存储到数据库中。

这个表单有两个按钮:

  1. add(存储到会话中);
  2. Submit(存储到数据库)。

首先,输入表单详细信息Name, City and Country并点击添加按钮数据将存储到session

其次,输入相同的详细信息,然后单击add

第三,输入相同的表单详细信息,但现在单击提交按钮,所有详细信息(第一个第二个和第三个)将使用 Hibernate 存储到数据库中。

出错了,我们的代码是:

Person.java

 @Entity
    public class Person {
        @Id
        @GeneratedValue
        private int id;
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }  

PersonAction.java:

public class PersonAction extends ActionSupport implements SessionAware {

      private Person person = new Person();
     // Database base=new Database();

      public Person getPerson() {
        return person;
      }

      public void setPerson(Person person){
        this.person = person;
      }

      private Map<String, Object> session;

      public void setSession(Map<String, Object> session){
        this.session = session;
      }

      public String execute() { //Create persons
        List<Person> personList = (List<Person>) session.get("personList");
        for (Person p : personList)
        Database.saveData(this);
        personList.clear();
        return SUCCESS;
      }

      public String add() { //Add person
        List<Person> personList = (List<Person>) session.get("personList");
        if (personList == null) {
          personList = new ArrayList<Person>();
          session.put("personList", personList);
          System.out.println("Successfully added");
        }
        personList.add(person);
        return SUCCESS;

      }

    } 

Database.java:

public class Database {
public static int saveData(PersonAction personAction){
        SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();
        Session session=sf.openSession();
        Transaction tran=session.beginTransaction();
    int i=(Integer)session.save(personAction);
    tran.commit();
    session.close();
    return i;

    }
}   

struts.xml:

<struts>
    <package name="default" extends="struts-default">
        <action name="person" class="org.PersonAction">
            <result>/person.jsp</result>
        </action>
        <action name="person" class="org.PersonAction" method="add">
            <result>/person.jsp</result>
        </action>
    </package>
</struts> 

index.jsp:

<s:form action="person">
    <s:textfield label="Enter your name" name="name"/>
    <s:submit value="Add person" method="add"/>
    <s:submit value="Create persons"/>
</s:form> 

  

person.jsp:

<body>
<s:property value="#session.name"/>
</body>

【问题讨论】:

  • 为什么要存储在会话中
  • 这是我的任务,一种形式,但数据不同……如果我们输入数据 3 次,最后所有数据都会保存到数据库中……请帮我解决 dis :)
  • 是的...我正在使用 sessionAware 和 HttpSession 但我不知道该怎么做 :(--ty PSR
  • 你是同时存储所有名字还是...?
  • 不...第一次我单击将注册表单数据添加到会话中。它工作良好..第二次单击将相同的注册表单数据添加到会话中,现在我只有 dis 数据。 ..我不知道如何检索第一个添加的数据

标签: java hibernate jsp session struts2


【解决方案1】:

您应该将按钮映射到正在运行的方法。默认的action mapper 允许使用按钮名称或method 属性来指定表单映射以外的方法。例如

<s:form action="person">
    <s:textfield label="Enter your name" name="person.name"/>
    <s:submit value="Add person" method="add"/>
    <s:submit value="Create persons"/>
</s:form>

现在,在你实现SessionAware的动作中

public class PersonAction extends ActionSupport implements SessionAware {

  private Person person = new Person();

  public Person getPerson() {
    return person;
  }

  public setPerson(Person person){
    this.person = person;
  }

  private Map<String, Object> session;

  public setSession(Map<String, Object> session){
    this.session = session;
  }

  public String execute() { //Create persons
    List<Person> personList = (List<Person>) session.get("personList");
    for (Person p : personList)
     getPersonService().save(p); // save to db
    //clear the list
    personList.clear();
    return SUCCESS;
  }

  public String add() { //Add person
    List<Person> personList = (List<Person>) session.get("personList");
    if (personList == null) {
      personList = new ArrayList<Person>();
      session.put("personList", personList);
    }
    personList.add(person);
    return SUCCESS;
     
  }
   
} 

现在,您已经通过映射到相应按钮的方法分离了逻辑。为了确保工作正常,请确保您已打开 DMI (Dynamic Method Invocation)(默认为打开),并且 interceptors 堆栈 defaultStack 应用于操作配置(默认情况下已使用)。

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
  <constant name="struts.devMode" value="false"/>

  <package name="default" extends="struts-default">
    <action name="person" class="PersonAction">
      <result>/person.jsp</result>
    </action>
  </package>
</struts>

SessionAware 是一个接口,如果您想使用 servlet 会话将其放入对象中,您的操作或基本操作应实现。更多信息here

ActionContext是action调用的容器占位符,更详细的解释是here

【讨论】:

  • 谢谢你 Roman,它对我的​​帮助很大:) :)...嘿,b/w sessionAware 接口和 ActionContext 有什么区别?
  • 嗨 Roman:我理解逻辑,但对 struts.xml 有点困惑,你能告诉我 dis 代码的 struts.xml 文件吗----谢谢你 Roman
  • Roman : 出现错误,请参阅更新并感谢您重播我 :)
  • 对于错误,您需要将堆栈跟踪代码连同代码一起发布并包含错误的根本原因。
  • 我在这段代码中犯了一些错误..我找不到解决方案,我发布了所有代码:(
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2011-12-05
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多