简体   繁体   English

如何使用 Struts 2 和 Hibernate 维护会话?

[英]How to maintain the session using Struts 2 and Hibernate?

I need to know how to maintain session for one form and multiple input [Name, City, Country] using Struts2 and finally data will stored to database using Hibernate.我需要知道如何使用 Struts2 为一个表单和多个input [Name, City, Country]维护会话,最后数据将使用 Hibernate 存储到数据库中。

This form have two buttons:这个表单有两个按钮:

  1. add (stored to session); add (存储到会话);
  2. Submit (stored to database). Submit (存储到数据库)。

First, enter the form details Name, City and Country and click add button data will store to session .首先,输入表单详细信息Name, City and Country并单击 add 按钮 data will store to session

Second, enter the details for same and now click add .其次,输入相同的详细信息,然后单击add

Third, enter same form details but now click submit button all details (first second & third) will stored to database using Hibernate.第三,输入相同的表单详细信息,但现在单击提交按钮,所有详细信息(第一、第二和第三)将使用 Hibernate 存储到数据库中。

Got an error, our code is:有错误,我们的代码是:

Person.java : 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 : 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 : 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.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 : 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 : person.jsp :

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

You should map the buttons to the method in action.您应该将按钮映射到操作中的方法。 The default action mapper allows to use button names or method attribute to specify the method other than used by the form mapping.默认的动作映射器允许使用按钮名称或method属性来指定表单映射以外的方法。 For example例如

<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>

Now, in the action you implement SessionAware现在,在您实施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;
     
  }
   
} 

Now, you have separated logic via methods mapped to a corresponding button.现在,您已经通过映射到相应按钮的方法分离了逻辑。 To make working be sure you have DMI (Dynamic Method Invocation) turned on (by default is on) and interceptors stack defaultStack is applied to the action config (by default it's used).为了确保工作,请确保您已打开DMI(动态方法调用) (默认情况下已打开)并且拦截器堆栈defaultStack应用于操作配置(默认情况下使用它)。

struts.xml: 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 is a interface that your action or base action should implement if you want to use servlet session to put into your objects. SessionAware是一个接口,如果您想使用 servlet 会话放入您的对象,您的操作或基本操作应该实现该接口。 More about it here .更多关于它在这里

ActionContext is a container placeholder for the action invocation, more detailed explanation is here . ActionContext是动作调用的容器占位符,更详细的解释在这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM