1

我需要知道如何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>
4

1 回答 1

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是动作调用的容器占位符,更详细的解释在这里

于 2013-06-09T19:26:08.590 回答