登录系统-基于struts2+spring+hibernateJPA分层架构-程序员宅基地

技术标签: spring  struts  java学习园地-实验指导  hibernateJPA  javaee  

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

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liubaoshan/article/details/84096795

智能推荐

组合数学中的项链计数_组合数学项链问题-程序员宅基地

文章浏览阅读789次。给c种不同颜色宝石能穿成多少种长度为s的宝石项链(本质不同)Burnside定理的应用:当n为奇数时,有n种翻转,每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/2+1)*n种。当n为偶数时,有n种翻转,其中一半是以两个对应顶点,另一半是以两条对边对称。有k^(n/2+1)*n/2+k^(n/2)*n/2种。..._组合数学项链问题

蓝桥杯第八届 省赛 c语言A组_第八届蓝桥杯c语言a组-程序员宅基地

文章浏览阅读575次,点赞2次,收藏7次。第一题标题:迷宫X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把10..._第八届蓝桥杯c语言a组

常用的抓包工具_tcap包-程序员宅基地

文章浏览阅读1.3k次。建议先了解不同协议和网络层的数据包结构。不然,你将无法了解如何做包分组工作,以及这些工具如何使用。出于学习目的,在使用这些工具列表之前,你必须了解不同协议的数据包,包中的不同字段,这些包字段的含义或目的,以及这些包在网络通信中的使用方式。一旦你知道这些事情,你将能够改变这些值,以便你在网络中看到你所需的效果。1. HpingHping是最受欢迎和免费的抓包工具之一。它允许你修改和发送自定义..._tcap包

解决linux指令“没有那个文件或目录”-程序员宅基地

文章浏览阅读1.5w次。本文介绍了一种面对linux指令“没有那个文件或目录”时的自查和解决方法_没有那个文件或目录

eslint配置大全_eslint 参数-程序员宅基地

文章浏览阅读462次。{"rules" : { // 定义对象的set存取器属性时,强制定义get "accessor-pairs": 2, // 指定数组的元素之间要以空格隔开(,后面), never参数:[ 之前和 ] 之后不能带空格,always参数:[ 之前和 ] 之后必须带空格 "array-bracket-spacing": [2, "never"], // 在块级作用域外访问块内定义的变量是否报错提示 "block-scoped-var": 0, // if while functi._eslint 参数

Mac安装anaconda后两个python版本共存,在终端pip无法为各自python版本倒入模块的解决办法_mac anaconda 配置两个 python-程序员宅基地

文章浏览阅读3.7k次。问题描述:使用anaconda来管理包,十分方便,也可以到达使得python2和python3共存的目的,但当导入anaconda以外的包时,可能会产生一些问题,在近期学习中,由于会用到scikit-learn模块,此模块为python2.7版本的模块,在使用终端通过pip安装时,ppip默认为为python3安装包。对此,可以尝试用pycharm导入此模块:打开pycharm,选择file菜_mac anaconda 配置两个 python

随便推点

可变模板参数_template<typename t, typename ...args>-程序员宅基地

文章浏览阅读1.1k次。背景在 C++11 之前,无论是类模板还是函数模板,都只能按其指定的样子,接受一组固定数量的模板参数;而C++11 加入了新的表示方法,允许任意个数、任意类别的模板参数,同时也不需要在定义时将参数的个数固定。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“...”template<typename....._template

css实现超出长度文字自动隐藏或用省略号表示_css a标签超出宽度自动隐藏-程序员宅基地

文章浏览阅读269次。HTML<a href="" target="_blank"> 业务需求分析书-系统营业日扎帐报表、收费汇总表及收费明细表 </a>cssa{overflow: hidden;text-overflow: ellipsis;white-space: nowrap;width: 100%;display: inline-block;}overflow:..._css a标签超出宽度自动隐藏

前向纠错(FEC)之纠删码原理(EC)_向前纠错的编码过程-程序员宅基地

文章浏览阅读2k次。References:纠删码解析_向前纠错的编码过程

(六)使用Transformers进行情感分析_基于transformer的情感分析-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏53次。文章目录准备数据搭建模型训练模型推断完整代码在本笔记本中我们将使用在本论文中介绍的Transformer模型。具体来说,我们将使用来自这篇论文中的BERT(Bidirectional Encoder Representations from Transformers)模型。Transformer模型比之前笔记中介绍的任何模型都要大得多。因此,我们将使用transformers library获得预先训练的transformers,并使用它们作为我们的嵌入层。我们将冻结(而不是训练)transformer_基于transformer的情感分析

Computational Optimal Transport笔记——Introduction_最优运输理论 偏微分方程-程序员宅基地

文章浏览阅读1.2k次。Computational Optimal Transport笔记——Introduction最优运输可以看做是更一般的最短路问题最短路原则:当在给定的点处有一个商品、人或者一些信息,这些东西需要被送到目标点。我们希望使用最少的工作量完成任务。(我们可以沿着直线或者测地线移动)最忧运输理论将这个问题一般化,一个人不是一次移动一个物品而是同时移动多个物品。经证明,有计划地运输一堆个体到指定的位..._最优运输理论 偏微分方程

springboot2.0之配置spring security记住我(rememberMe功能)不起作用的原因_spring security记住我功能有令牌不实现-程序员宅基地

文章浏览阅读3.4k次。刚入门spring security,感觉东西有点多,不好好研究出了问题都不知道为什么。rememberMe功能配置核心代码(有问题的): protected void configure(HttpSecurity http) throws Exception { List<SysPermission> allPermission = permissionFe..._spring security记住我功能有令牌不实现

推荐文章

热门文章

相关标签