Example of struts 2 + spring 2 + JPA + Ajax

Source: Internet
Author: User

 

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

 

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.