我需要知道如何input[Name,City,Country]使用Struts2 维护一种形式和多种形式的会话,最后使用hibernate将数据存储到数据库中。
input[Name,City,Country]
此表单有两个按钮:
add
Submit
首先,输入表单详细信息[name city and country],然后单击添加按钮,数据将存储到session。
[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>
您应该将按钮映射到实际使用的方法。缺省操作映射器允许使用按钮名称或method属性来指定表单映射所使用的方法以外的方法。例如
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
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应用于操作配置(默认情况下已使用)。
defaultStack
<?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是动作调用的容器占位符,在这里有更详细的说明。
ActionContext