`

登录系统-基于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  
不知为什么,图片没有显示出来。

相关推荐

    struts1+spring+hibernate整合所用全部jar包

    Struts1、Spring和Hibernate是Java Web开发中的三大框架,它们各自解决了一部分问题,而将它们整合在一起,可以构建出高效、灵活的企业级应用程序。这里我们主要探讨这三者整合时所需的核心jar包以及它们的功能。 ...

    权限管理系统struts2+spring+hibernate+mysql

    Struts2、Spring、Hibernate和MySQL是Java Web开发中常用的技术栈,它们组合起来可以构建一个功能完善的权限管理系统。下面将分别介绍这四个组件及其在权限管理中的应用。 1. **Struts2**:Struts2是一个基于MVC...

    struts-2.3.24.1+spring4.2.1+hibernate5.0

    Struts 2.3.24.1、Spring 4.2.1 和 Hibernate 5.0 是三个在 Java 开发领域中广泛使用的开源框架,它们分别负责 Web 应用的 MVC(Model-View-Controller)架构、依赖注入与服务管理以及对象关系映射(ORM)。...

    struts2.3.37+spring-framework-5.1.0+hibernate-release-5.3.1.Final

    SSH是三个流行开源框架的缩写,分别是Struts2、Spring和Hibernate,它们常被用于构建企业级Java Web应用程序。这个压缩包包含了这三个框架的特定版本:Struts2.3.37、Spring Framework 5.1.0以及Hibernate Release ...

    struts2 + spring2.5 + hibernate3.0 + oracle 整合实例

    Struts2、Spring和Hibernate是Java企业级开发中三大核心框架,它们的集成通常被称为SSH(Struts2、Spring、Hibernate)整合。本实例将详细讲解如何将这三个框架与Oracle数据库进行整合,以构建一个完整的Java Web...

    struts-2.3.1+spring3.1.1+hibernate3.6.9整合&配置文件

    Struts 2、Spring 和 Hibernate 是 Java Web 开发中三个重要的框架,它们分别负责MVC模式中的动作控制、依赖注入及持久化管理。这个压缩包文件"struts-2.3.1+spring3.1.1+hibernate3.6.9整合&配置文件"提供了将这三...

    Struts2.3.4 + Spring3.1.1 + Hibernate4.1.0集成

    Struts2.3.4、Spring3.1.1和Hibernate4.1.0是三个在Java开发领域中广泛使用的开源框架,它们分别是MVC框架、依赖注入框架和对象关系映射工具。这个集成项目(prj_mgr_04_ssh2)的目标是将这三个框架协同工作,以构建...

    Struts2+Spring+JPA的Jar包

    整合Struts2、Spring和JPA,可以实现MVC架构的完整流程:Struts2负责接收用户请求,通过Action处理业务逻辑,Spring管理这些Action对象以及数据访问层,JPA则处理与数据库的交互。这样的组合提供了良好的分层结构,...

    struts2+spring3.x+JPA1.0框架整合步骤

    ### Struts2 + Spring3.x + JPA1.0框架整合步骤详解 #### 一、引言 随着软件工程的发展,MVC(Model-View-Controller)架构模式因其清晰的分层逻辑而在Web开发领域中得到了广泛的应用。本文将详细介绍如何整合...

    简单的spring2+struts2+hibernate3.2+jbpm3应用框架

    【标题】"简单的spring2+struts2+hibernate3.2+jbpm3应用框架"揭示了一个经典的Java企业级开发架构,该框架整合了四个核心组件:Spring 2.x、Struts 2.x、Hibernate 3.2以及jBPM 3。这些技术在2000年代末到2010年代...

    ssh(struts2.2.1+_hibernate3.6+spring3.0.5)整合配置

    SSH(Struts2、Hibernate和Spring)是一种流行的Java企业级应用程序开发框架的组合,用于构建高效、可维护的Web应用。下面将详细介绍如何整合Struts2.2.1、Hibernate3.6和Spring3.0.5。 首先,确保准备好所有必要的...

    SSH整合jar包(spring3+struts2+hibernate3)

    SSH整合是指将Spring、Struts2和Hibernate三个开源框架集成在一起,用于构建高效、模块化的企业级Web应用程序。这三个框架分别负责不同的职责:Spring作为应用的基石,提供依赖注入(DI)和面向切面编程(AOP)等...

    Struts2、Spring4和Hibernate4

    这三者结合使用,通常称为SSH(Struts2-Spring-Hibernate)架构,能够构建出完整的、基于MVC模式的Java Web应用程序。开发者可以利用Struts2处理用户请求,Spring4管理业务逻辑和服务层,而Hibernate4则负责数据持久...

    hibernate3.3.2+spring2.5.6+struts2.1.6整合包+anntations

    标题和描述中提到的"hibernate3.3.2+spring2.5.6+struts2.1.6整合包+anntations"是指一个经典的Java Web开发框架集成,通常被称为SSH(Struts2、Spring、Hibernate)框架。这个整合包包含这三个组件的特定版本,用于...

    Spring+Struts+Hibernate整合方法

    在IT行业中,SSH(Spring、Struts和Hibernate)是一个经典的Java Web开发框架组合,被誉为“老三架马车”。这三种技术的整合可以构建出高效、灵活且易于维护的Web应用。下面将详细介绍SSH整合的方法及其相关知识点。...

    struts2 hibernate spring j集成

    Struts2、Hibernate和Spring是Java开发中三大主流框架,它们的集成是企业级Web应用开发的常见模式,能够帮助开发者高效地构建可维护、可扩展的系统。下面将详细介绍这三个框架以及它们集成的关键点。 Struts2是MVC...

    Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一

    1. **分层架构**:Spring负责业务逻辑层,Hibernate处理数据持久化,Struts管理用户交互,形成了清晰的职责划分。 2. **松耦合**:Spring的DI使各个组件之间解耦,增强了系统灵活性。 3. **事务管理**:Spring提供了...

    Spring+Hibernate+Struts集成实例

    Spring、Hibernate和Struts是Java Web开发中的三大框架,它们分别负责不同的职责,共同构建了一个高效、灵活的应用架构。在本实例中,我们将探讨如何将这三个框架整合到一起,实现一个完整的Web应用。 Spring框架是...

    精通struts.基于MVC的.java.web设计与开发

    尽管本书主要关注Struts2与Spring的整合,但作者也提到了如何将这两者与其他框架(如Hibernate或JPA)结合起来。这种整合通常涉及以下几个步骤: 1. **Spring整合Web层**:使用Spring管理Struts2的Action实例。 2. ...

    struts2-3-1常用包

    - **核心概念**:Struts2是基于拦截器的MVC框架,提供了一种分层的架构,允许开发者通过配置或注解来控制应用程序的行为。 - **Action类**:处理用户请求的中心组件,通常对应于一个HTTP请求,负责业务逻辑的执行...

Global site tag (gtag.js) - Google Analytics