`

登录系统-基于struts2+spring+hibernateJPA分层架构

阅读更多

1、新建一个mysql数据库,并新建连接,数据库结构如下图所示:

 



  

 

2、新建一个项目,包结构如下图:

 

 

 

3、导入框架所需的jar文件,从下面网址下载:

http://ishare.iask.sina.com.cn/f/14550905.html?from=like&retcode=0

或:

http://download.csdn.net/detail/caozhongde1991/3496608

 

4、在book.model包中,由数据库生成实体类:

       如果没有建好数据源,则需要新建数据源。

 

 

 

package book.model;

 

import java.io.Serializable;

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Size;

import javax.xml.bind.annotation.XmlRootElement;

 

@Entity

@Table(name = "admin")

@XmlRootElement

@NamedQueries({

    @NamedQuery(name = "Admin.findAll", query = "SELECT a FROM Admin a"),

    @NamedQuery(name = "Admin.findByUName", query = "SELECT a FROM Admin a WHERE a.uName = :uName"),

    @NamedQuery(name = "Admin.findByUPass", query = "SELECT a FROM Admin a WHERE a.uPass = :uPass"),

    @NamedQuery(name = "Admin.findByUId", query = "SELECT a FROM Admin a WHERE a.uId = :uId")})

public class Admin implements Serializable {

    private static final long serialVersionUID = 1L;

    @Size(max = 20)

    @Column(name = "u_Name")

    private String uName;

    @Size(max = 20)

    @Column(name = "u_Pass")

    private String uPass;

    @Id

    @Basic(optional = false)

    @NotNull

    @Column(name = "u_id")

    private Integer uId;

 

    public Admin() {

    }

 

    public Admin(Integer uId) {

        this.uId = uId;

    }

 

    public String getUName() {

        return uName;

    }

 

    public void setUName(String uName) {

        this.uName = uName;

    }

 

    public String getUPass() {

        return uPass;

    }

 

    public void setUPass(String uPass) {

        this.uPass = uPass;

    }

 

    public Integer getUId() {

        return uId;

    }

 

    public void setUId(Integer uId) {

        this.uId = uId;

    }

 

    @Override

    public int hashCode() {

        int hash = 0;

        hash += (uId != null ? uId.hashCode() : 0);

        return hash;

    }

 

    @Override

    public boolean equals(Object object) {

        // TODO: Warning - this method won't work in the case the id fields are not set

        if (!(object instanceof Admin)) {

            return false;

        }

        Admin other = (Admin) object;

        if ((this.uId == null && other.uId != null) || (this.uId != null && !this.uId.equals(other.uId))) {

            return false;

        }

        return true;

    }

 

    @Override

    public String toString() {

        return "book.model.Admin[ uId=" + uId + " ]";

    }

   

}

5、新建持久性单元,persisternce.xml

 

 

 

文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0" 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_2_0.xsd">

  <persistence-unit name="sshjPU" >

    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <class>book.model.Admin</class>

    <properties/>

  </persistence-unit>

</persistence>

 

6、在book.idao包中,新建dao接口IBaseDaoIAdminDao

 

为了应用程序的扩展,创建IBaseDao接口:

package book.idao;

import java.io.Serializable;

import java.util.List;

public interface IBaseDao<T,ID extends Serializable>{

    void insert(T obj);

    void update(T obj);

    void delete(ID id);

    T findById(ID id);

    List<T> findAll();

    List<T> findPage(int pageSize,int pageNo);

    int findCount();

}

 

IAdminDao接口继承了IBaseDao接口:

package book.idao;

 

import book.model.Admin;

import java.util.List;

public interface IAdminDao extends IBaseDao<Admin,Integer>{

    Admin findOne(String Name,String Password);

    List<Admin> findPage(String Name,Integer pageSize,Integer pageNo);    

    Integer findCount(String Name);

}

 

7、在book.dao包中,实现dao接口IBaseDaoIAdminDao,创建类BaseDaoAdminDao

为了应用程序的扩展,BaseDao类实现了大量有用的方法,注意添加事务标注@Transactional,实现事务注入。在private EntityManager em语句前添加标注@PersistenceContext,实现实体管理器的自动注入。

   

package book.dao;

import java.io.Serializable;

import java.util.List;

import javax.persistence.EntityManager;

import javax.persistence.Query;

 

import book.idao.IBaseDao;

import javax.persistence.PersistenceContext;

import org.springframework.transaction.annotation.Transactional;

 

@Transactional

public class BaseDao <T,ID extends Serializable> implements IBaseDao<T,ID>{

   

    @PersistenceContext

    private EntityManager em;

   

    private Class<T> cls;

   

    public BaseDao(Class<T> cls){

        this.cls=cls;

    }

   

    @Override

    public void insert(T obj){

        em.persist(obj);

    }

   

    @Override

    public void update(T obj){

        em.merge(obj);

    }

   

    @Override

    public void delete(ID id){

        em.remove(findById(id));

    }

   

    @Override

    public T findById(Serializable id){

        if((T)em.find(cls,id)==null)

            return null;

        else

            return (T)em.find(cls,id);

    }

   

    @Override

    public List<T> findAll(){

        return em.createQuery("select o from"+

                cls.getSimpleName()+"as o").getResultList();

    }

   

    @Override

    public List<T> findPage(int pageSize,int pageNo){

        Query q=em.createQuery("select o from"+

                cls.getSimpleName()+"as o");

        q.setMaxResults(pageSize);

        q.setFirstResult((pageNo-1)*pageSize);

        return q.getResultList();

    }

   

    @Override

    public int findCount(){

        return ((Long)em.createQuery("select o from"+

                cls.getSimpleName()+"as o").getSingleResult()).intValue();

    }

    //根据jpql查询一条记录

    protected T findOne(String jpql,Object... values){

        Query q=em.createQuery(jpql);

        for(int i=0;i<values.length;i++){

            q.setParameter(i+1, values[i]);

        }

        if((T)q.getSingleResult()==null)

            return null;

        else           

            return (T)q.getSingleResult();

    }

    //根据jpql分页查询多条记录

    protected List<T> findPage(String jpql,int pageSize,int pageNo,Object...values){

        Query q=em.createQuery(jpql);

        for(int i=0;i<values.length;i++){

            q.setParameter(i+1, values[i]);

        }

        q.setMaxResults(pageSize);

        q.setFirstResult((pageNo-1)*pageSize);

        return q.getResultList();

    }

    //根据jpql不分页查询多条记录

    protected List<T> find(String jpql,Object...values){

        Query q=em.createQuery(jpql);

        for(int i=0;i<values.length;i++){

            q.setParameter(i+1, values[i]);

        }

        return q.getResultList();

    }

    //根据jpql查询前num条记录

    protected List<T> findTopByNum(String jpql,int num,Object... values){

        Query q=em.createQuery(jpql);

        for(int i=0;i<values.length;i++){

            q.setParameter(i+1, values[i]);

        }

        q.setMaxResults(num);

        return q.getResultList();

    }

    //根据jpql查询记录总数

    protected int findCount(String jpql,Object... values){

        Query q=em.createQuery(jpql);

        for(int i=0;i<values.length;i++){

            q.setParameter(i+1, values[i]);

        }

        return ((Long)q.getSingleResult()).intValue();

    }

    //根据jpql执行更新或删除,返回被影响的记录总数

    protected int excute(String jpql,Object...values){

        Query q=em.createQuery(jpql);

        for(int i=0;i<values.length;i++){

            q.setParameter(i+1, values[i]);

        }

        return q.executeUpdate();

    }

}

 

8、在book.iservice包中,新建业务逻辑接口IAdminService

本接口也是为了扩展,添加了许多方法的定义。

package book.iservice;

import book.model.Admin;

import java.util.List;

 

public interface IAdminService {

    void addAdmin(Admin admin);   

    void deleteAdmin(Integer Id);

    Admin findAdminById(Integer Id);

    Admin findAdmin(String Name,String Password);

    List<Admin> findAdminByPage(Integer pageSize,Integer pazeNo);

    Integer findCount(String Name);

}

 

9、在book.service包中,实现业务逻辑接口IAdminService,创建类AdminService

 

AdminService中采用标注@Autowired,对private IAdminDao iAdminDao;进行自动注入。

 

package book.service;

 

import book.idao.IAdminDao;

import book.iservice.IAdminService;

import book.model.Admin;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

public class AdminService implements IAdminService{

    @Autowired

    private IAdminDao iAdminDao;

 

    @Override

    public void addAdmin(Admin admin) {

        iAdminDao.insert(admin);

    }

 

    @Override

    public void deleteAdmin(Integer custId) {

        iAdminDao.delete(custId);

    }

 

    @Override

    public Admin findAdminById(Integer custId) {

        return iAdminDao.findById(custId);

    }

 

    @Override

    public Admin findAdmin(String Name, String Password) {

        return iAdminDao.findOne(Name, Password);

    }

 

    @Override

    public List<Admin> findAdminByPage(Integer pageSize, Integer pazeNo) {

        return iAdminDao.findPage(pageSize, pazeNo);

    }

 

    @Override

    public Integer findCount(String Name) {

        return iAdminDao.findCount(Name);

    }   

}

 

10、修改web.xml文件:

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/applicationContext.xml</param-value>

    </context-param>

    <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>*.action</url-pattern>

    </filter-mapping>

    <filter-mapping>

        <filter-name>struts2</filter-name>

        <url-pattern>*.jsp</url-pattern>

    </filter-mapping>

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <session-config>

        <session-timeout>

            30

        </session-timeout>

    </session-config>

    <welcome-file-list>

        <welcome-file>redirect.jsp</welcome-file>

    </welcome-file-list>

</web-app>

 

11、添加applicationContext.xml文件,整合spring框架和hibernateJPA框架:

<?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:p="http://www.springframework.org/schema/p"

       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-3.0.xsd

       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

   

    <!--以下Service采用自动注入-->

    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

    <!--Dao层使用@PersistenceContext注入实体管理器-->

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

    <bean id="propertyConfigurer"

          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"

          p:location="/WEB-INF/jdbc.properties" />

   

    <bean id="dataSource"

          class="org.springframework.jdbc.datasource.DriverManagerDataSource"

          p:driverClassName="${jdbc.driverClassName}"

          p:url="${jdbc.url}"

          p:username="${jdbc.username}"

          p:password="${jdbc.password}" />

   

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

       <property name="persistenceUnitName" value="sshjPU"/>

       <property name="dataSource" ref="dataSource"/>

       <property name="jpaVendorAdapter">

            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >

                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>

                <property name="generateDdl" value="true"/>

                <property name="showSql" value="false"/>

            </bean>

       </property>

    </bean>

    <bean id="iAdminDao" class="book.dao.AdminDao"/>

    <bean id="iAdminService" class="book.service.AdminService"/>

   

    <bean id="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">

          <property name="entityManagerFactory">

                <ref bean="entityManagerFactory"/>

          </property>

    </bean>

    <aop:config>

        <aop:pointcut id="serviceMethods" expression="execution(* book.service.*.*())"/>  

        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>      

    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="myTxManager">

        <tx:attributes >

            <tx:method name="add*" propagation="REQUIRES_NEW"/>

            <tx:method name="edit*" propagation="REQUIRES_NEW"/>

            <tx:method name="delect*" propagation="REQUIRES_NEW"/>

            <tx:method name="find*" propagation="REQUIRED" read-only="true"/>

            <tx:method name="*" propagation="SUPPORTS" read-only="true"/>

        </tx:attributes>

    </tx:advice> 

   

</beans>

12、在WEB-INF文件夹下创建属性文件:jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/book?useUnicode=true&amp;chracterEncoding=gbk

jdbc.username=root

jdbc.password=123456

13、创建UserAction.java,实现struts2架构的MVC,注意添加标注@Autowired,实现自动注入:

package book.action;

import com.opensymphony.xwork2.ActionContext;

import book.iservice.IUserService;

import book.model.Admin;

public class UserAction {

   

    private String userName;

    private String userPassword;

    private String msg;

   

    @Autowired

    private IAdminService iAdminService;

   

    public String execute()throws Exception{

        Admin user=iuserService.findByUsernameAndPassword(userName, userPassword);

        if(user!=null){

            msg="登录成功!"+user.getUName();

            ActionContext.getContext().getSession().put("user",user);

        }else{

            msg="登录失败!<a href=\"JavaScript:window.history.back()\">返回</a>";

        }

        return "msg";

    }

    public void setUserName(String userName){

        this.userName=userName;

    }

    public void setUserPassword(String userPassword){

        this.userPassword=userPassword;

    }

    public String getMsg(){

        return msg;

    }

}

14、配置struts.xml文件:

<struts>   

    <package name="book" extends="struts-default">

        <action name="UserAction" class="book.action.UserAction">

            <result name="msg">/index.jsp</result>

        </action>

    </package>

</struts>

15、创建如下两个页面

Login.jsp:

<%@ page pageEncoding="gb2312" %>

<%@ page contentType="text/html; charset=gb2312" %>

<% request.setCharacterEncoding("gb2312"); %>

<%@ page language="java" %>

<html>  

         <head><title>登录网页</title></head>

       <body>

       <form method="POST" action="UserAction.action">

 

       <table  >

           <tr>

             <td width="890" align="left" colspan="2">

              <b><font size="5">系统登录</font></b>

               <hr>

             </td>

           </tr>

            <% if (request.getAttribute("error") != null){ %>

       <tr>

              <td width=100% align=center colspan=4 height=36>

                   <font color=red><b><%=request.getAttribute("error")%></b></font>

              </td>

       </tr>

       <%

     }

       %>

           <tr>

             <td width="75" align="center">

               <p align="right">账号:</p>

             </td>

             <td width="809" align="center">

               <p align="left">

                <input type="text" name="userName" size="20"></td>

           </tr>

           <tr>

             <td width="75" align="center">

               <p align="right">密码:</p>

             </td>

             <td width="809" align="center">

               <p align="left">

               <input type="password" name="userPassword" size="20">

               <input type="submit" value="登录" name="loginButton"></td>

           </tr>

         </table>

       </form>

       </body>

       </html>

在这个页面中,下面的form标记语句:

<form method="POST" action="UserAction.action">

表示该页面提交一个名为:"UserAction"action,注意和struts.xml文件中的actionname相对应。

index.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>显示信息</title>

    </head>

    <body>

        <h1>Hello World!</h1>

        <div id="content">

            <center>

                <br/><%=request.getAttribute("msg")%>

            </center>

        </div>

    </body>

</html>

该页面的标记语句

<%=request.getAttribute("msg")%>

表示接收来自actionmsg字符串。

16. 生成项目并运行http://localhost:8080/sshj/login.jsp

 

分享到:
评论
1 楼 chengeng 2012-10-08  
不知为什么,图片没有显示出来。

相关推荐

Global site tag (gtag.js) - Google Analytics