hibernate 使用struts2和hib维护会话?

muk1a3rh  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(171)

我需要知道如何使用Struts2维护一个表单和多个输入[姓名,城市,国家]的会话,最后使用Hibernate将数据存储到数据库。
此窗体有两个按钮:

  • 添加(存储到会话);
  • 提交(存储到数据库)。
  • 首先,输入表单详细信息[城市和国家名称]并单击添加按钮,数据将存储到会话中。
  • 其次,输入same的详细信息,然后单击“添加”。
  • 第三,输入相同的表单详细信息,但现在点击提交按钮,所有详细信息(第一、第二和第三)将使用休眠存储到数据库中。

请帮我解决这个问题。
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>
tnkciper

tnkciper1#

首先读取Best Practices When Using SessionAware
我会给你一些提示,Struts2遵循MVC pattern(或者这种模式的一个变体)。所以你有你的表示层,在那里你向你的控制器(PersonAction)发送一个事件,在这里你必须与你的模型(业务层数据库,Person)通信,模型向控制器返回或不返回一些东西,控制器决定显示什么。
你的问题是你要发送PersonAction到你的DataBase,你必须发送用hibMap的Person:)。并且尽量不要使用静态方法,因为如果你在并发应用程序中,很多用户会访问saveData方法
这可不好

for (Person p : personList)
            Database.saveData(this);

你必须做这样的事

Database.saveData(personList);

并在Database类中定义一个方法

public static int saveData(List<Person> person)

Person类中,还必须Mapname属性

注意我不建议对这类事情使用静态方法

5cnsuln7

5cnsuln72#

在操作类中使用以下方法

/**
     * Convenience method to get the request.
     * @return current request
     */
    protected HttpServletRequest getRequest() {
    return ServletActionContext.getRequest();
    }

    /**
     * Convenience method to get the response.
     * @return current response.
     */
    protected HttpServletResponse getResponse() {
    return ServletActionContext.getResponse();
    }

    /**
     * Convenience method to get the session. This will create a session if one
     * doesn't exist.
     * @return the session from the request (request.getSession()).
     */
    protected HttpSession getSession() {
    return getRequest().getSession();
    }

你可以在execute方法中使用这段代码

getRequest().getSession().setAttribute("projectData", scheduleData);
scyqe7ek

scyqe7ek3#

按如下所示构建SessionFactory。

sessionFactory = new Configuration().configure().buildSessionFactory();

相关问题