The official struts tutorial provides the following example: struts 2 + spring 2 + JPA + Ajax. The source address is:
Http://struts.apache.org/2.3.1.1/docs/struts-2-spring-2-jpa-ajax.html
After downloading the example, manually import the package to build it. I used the 2.3.1 package and encountered many problems during the build. This is mainly about the package relationship and some changes after struts is updated.
Made the following changes:
1struts2. 0 Ajax supports mainly DWR and dojo and provides Ajax topics, such as <s: Head theme = "ajax"/>, but not in struts2.1, and put the original Ajax theme into the dojo plug-in, we need to add a struts2-dojo-plugin.jar in the project, introduce the dojo tag to the JSP page
<%@ taglib uri="/struts-dojo-tags" prefix="sx" %>
2. Change <s: Head theme = "ajax"/>
<s:head theme="xhtml" /><sx:head parseContent="true" />
3. replace some of the original <s: With <SX:. You can follow the prompts in eclipse to change them. If an error is reported, you can delete theme = "ajax"
4. verification fails, so verification is removed.
5. If everything is ready, an error is returned:
FreeMarker template error!Expression parameters.pushId is undefined on line 24, column 6 in template/ajax/a-close.ftl.The problematic instruction:----------==> if parameters.pushId [on line 24, column 1 in template/ajax/a-close.ftl]
Therefore, the following operations are performed according to the method of a page:
The template problems you are having can be fixed by copying the template files into your local project (keeping the template/ajax directory structure) and changing the FTL so that they check for the existence of the parameter first I. e. change to: <# If
Parameters. pushid? Exists & parameters. pushid>.
The error message is found. Two files are copied and the statement <# If parameters. pushid? Exists & parameters. pushid>.
Code and structure:
1. Use the MySQL database
CREATE Database quickstart
CREATE TABLE 'quickstart'.'Person' ( 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 'firstName' VARCHAR(45) NOT NULL, 'lastName' VARCHAR(45) NOT NULL, PRIMARY KEY('id'))ENGINE = InnoDB;
2 use the following packages
3. directory structure
3 Java code:
Person. Java
@ Entity indicates using JPA entities. The @ ID mentioned above indicates that this is ID and @ generatedvalue automatically generates the id value.
package quickstart.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entitypublic class Person { @Id @GeneratedValue private Integer id; private String lastName; private String firstName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; }}
Personservice. Java
package quickstart.service;import java.util.List;import quickstart.model.Person;public interface PersonService { public List<Person> findAll(); public void save(Person person); public void remove(int id); public Person find(int id);}
Personserviceimpl. Java
@ Persistencecontext: Specifies the JPA context and sets the object manager. @ Transactionalif
The class is annotated as @ transactional, spring will make sure that its methods run inside a transaction.
package quickstart.service;import java.util.List;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.persistence.Query;import org.springframework.transaction.annotation.Transactional;import quickstart.model.Person;@Transactionalpublic class PersonServiceImpl implements PersonService { private EntityManager em; @PersistenceContext public void setEntityManager(EntityManager em) { this.em = em; } @SuppressWarnings("unchecked") public List<Person> findAll() { Query query = getEntityManager().createQuery("select p FROM Person p"); return query.getResultList(); } public void save(Person person) { if (person.getId() == null) { // new em.persist(person); } else { // update em.merge(person); } } public void remove(int id) { Person person = find(id); if (person != null) { em.remove(person); } } private EntityManager getEntityManager() { return em; } public Person find(int id) { return em.find(Person.class, id); }}
/Personaction. Java
package quickstart.action;import java.util.List;import quickstart.model.Person;import quickstart.service.PersonService;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.Preparable;public class PersonAction implements Preparable { private PersonService service; private List<Person> persons; private Person person; private Integer id; public PersonAction(PersonService service) { this.service = service; } public String execute() { this.persons = service.findAll(); return Action.SUCCESS; } public String save() { this.service.save(person); this.person = new Person(); return execute(); } public String remove() { service.remove(id); return execute(); } public List<Person> getPersons() { return persons; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public void prepare() throws Exception { if (id != null) person = service.find(id); } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; }}
4. configuration document
Persistence. xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="punit"> </persistence-unit></persistence>
Struts. xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <constant name="struts.objectFactory" value="spring" /> <constant name="struts.devMode" value="true" /> <package name="person" extends="struts-default"> <action name="list" method="execute" class="personAction"> <result>pages/list.jsp</result> <result name="input">pages/list.jsp</result> </action> <action name="remove" class="personAction" method="remove"> <result>pages/list.jsp</result> <result name="input">pages/list.jsp</result> </action> <action name="save" class="personAction" method="save"> <result>pages/list.jsp</result> <result name="input">pages/list.jsp</result> </action> </package></struts>
Applicationcontext. xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <bean id="personService" class="quickstart.service.PersonServiceImpl" /> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="MYSQL" /> <property name="showSql" value="true" /> </bean> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/quickstart" /> <property name="username" value="root" /> <property name="password" value="qwe123" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="personAction" scope="prototype" class="quickstart.action.PersonAction"> <constructor-arg ref="personService" /> </bean></beans>
Web. xml
<?xml version="1.0" encoding="UTF-8"?><web-app id="person" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>person</display-name> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener></web-app>
5. Page code
The struts Ajax used here is not very easy to use. It is better to use easyui and jquery in combination with the JSON plug-in of struts.
Index. jsp
<%@ taglib prefix="s" uri="/struts-tags"%><%@ taglib uri="/struts-dojo-tags" prefix="sx" %>
List. jsp
<%@ taglib prefix="s" uri="/struts-tags"%><%@ taglib uri="/struts-dojo-tags" prefix="sx" %><p>Persons</p><s:if test="persons.size > 0"><table><s:iterator value="persons"><tr id="row_<s:property value="id"/>"><td><s:property value="firstName" /></td><td><s:property value="lastName" /></td><td><s:url id="removeUrl" action="remove"><s:param name="id" value="id" /></s:url><sx:a href="%{removeUrl}" targets="persons">Remove</sx:a><sx:a id="a_%{id}" notifyTopics="/edit">Edit</sx:a></td></tr></s:iterator></table></s:if>
The final result is as follows:
Code package:
Http://download.csdn.net/detail/magic_wz/3999729 has been ready for a variety of packages, you can directly run eclipse