Search code examples
javahibernatejspsessionstruts2

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.

This form have two buttons:

  1. add (stored to session);
  2. Submit (stored to database).

First, enter the form details Name, City and Country and click add button data will store to session.

Second, enter the details for same and now click add.

Third, enter same form details but now click submit button all details (first second & third) will stored to database using Hibernate.

Got an error, our code is:

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>

Solution

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

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

    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. More about it here.

    ActionContext is a container placeholder for the action invocation, more detailed explanation is here.