整合SSH的简单例子

来源:互联网 发布:软件行业协会会员费 编辑:程序博客网 时间:2024/05/16 19:09

1。新建一个实体类

Person.java
package quickstart.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity // 表示该类能被持久化public class Person {    @Id  //表示该字段是主键    @GeneratedValue //表示insert时该字段会被Hibernate自动生成    private Integer id;    private String lastName;// 字段名默认和数据库中一致,可参考JPA文档    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;    }}
2。新建service接口和实现类
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
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;@Transactional // @Transactional表示该类的方法将在一个事务中进行public class PersonServiceImpl implements PersonService {    private EntityManager em;    @PersistenceContext // @PersistenceContext表示Spring创建service实例时将注入一个EntityManager实例到该service实例。
    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);    }}
3。配置web.xml文件
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>    <!-- Include this if you are using Hibernate -->    <filter>        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>        <filter-class>            org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter        </filter-class>    </filter>    <filter-mapping>        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>
如果出现中文乱码,可以在struts配置的前面加上处理乱码的过滤器,spring提供了该过滤器类,具体参见我的资源中的quickstart.war    <filter>        <filter-name>struts2</filter-name>        <filter-class>            org.apache.struts2.dispatcher.FilterDispatcher//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>
4。在webInf下面建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="root" />    </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" />// 通过personAction构造函数的参数注入实例personServicepersonAction    </bean></beans>
5。建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;
// 该Action是一个POJO,与Struts1不同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;    }}
6。在src下面建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" />//将使用Spring注入在applicationContext.xml中定义的所有的Bean    <constant name="struts.devMode" value="true" />    <package name="person" extends="struts-default">        <action name="list" method="execute" class="personAction">//是在applicationContext.xml中定义的Bean的Id            <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>
7。建两个页面
list.jsp
<%@ taglib prefix="s" uri="/struts-tags"%><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><s:a href="%{removeUrl}" theme="ajax" targets="persons">Remove</s:a><s:a id="a_%{id}" theme="ajax" notifyTopics="/edit">Edit</s:a></td></tr></s:iterator></table></s:if>
index.jsp
<%@ taglib prefix="s" uri="/struts-tags"%><html><head><s:head theme="ajax" debug="true"/><script type="text/javascript">dojo.event.topic.subscribe("/save", function(data, type, request) {    if(type == "load") {dojo.byId("id").value = "";dojo.byId("firstName").value = "";dojo.byId("lastName").value = "";}});dojo.event.topic.subscribe("/edit", function(data, type, request) {    if(type == "before") {var id = data.split("_")[1];var tr = dojo.byId("row_"+id);var tds = tr.getElementsByTagName("td");dojo.byId("id").value = id;dojo.byId("firstName").value = dojo.string.trim(dojo.dom.textContent(tds[0]));dojo.byId("lastName").value = dojo.string.trim(dojo.dom.textContent(tds[1]));}});</script></head><body>    <s:url action="list" id="descrsUrl"/>        <div style="width: 300px;border-style: solid">        <div style="text-align: right;">    <s:a theme="ajax" notifyTopics="/refresh">Refresh</s:a>    </div>    <s:div id="persons" theme="ajax" href="%{descrsUrl}" loadingText="Loading..." listenTopics="/refresh"/>        </div>        <br/><div style="width: 300px;border-style: solid"><p>Person Data</p><s:form action="save" validate="true">    <s:textfield id="id" name="person.id" cssStyle="display:none"/><s:textfield id="firstName" label="First Name" name="person.firstName"/><s:textfield id="lastName" label="Last Name" name="person.lastName"/><s:submit theme="ajax" targets="persons" notifyTopics="/save"/></s:form></div></body></html>
这样就可以运行了
如果要加入校验,可以使用Struts2提供的方法,在放Action的文件下面建ActionName-validation.xml的文件
<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.0//EN""http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"><validators>    <field name="person.firstName">        <field-validator type="requiredstring">            <message>First name is required!</message>        </field-validator>    </field>    <field name="person.lastName">        <field-validator type="requiredstring">            <message>Last name is required!</message>        </field-validator>    </field></validators>
原创粉丝点击