一尘不染

如何使用Struts2和Hibernate维护会话?

jsp

我需要知道如何input[Name,City,Country]使用Struts2 维护一种形式和多种形式的会话,最后使用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>

阅读 224

收藏
2020-06-08

共1个答案

一尘不染

您应该将按钮映射到实际使用的方法。缺省操作映射器允许使用按钮名称或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(动态方法调用)(默认情况下处于打开状态),并且将拦截器堆栈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会话将其放入对象时,应由您的操作或基本操作实现。在这里了解更多。

ActionContext是动作调用的容器占位符,在这里有更详细的说明。

2020-06-08