登录系统-基于servlet+hibernate分层架构



 本实验使用servlet+hibernate
分层结构,目的是可以更好地进行ssh整合的准备,可以参考《登录系统-基于servlet+hibernate》和《登录系统-基于struts2的分层架构》两篇文章。

1.新建一个java web项目,在步骤4中选择Hibernate3.2.5选项(如果没有建好数据库连接,可以在此建立连接):



 

 

 

这时netbeans自动生成hibernate.cfg.xml文件:

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

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

  <session-factory>

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/book</property>

    <property name="hibernate.connection.username">root</property>

    <property name="hibernate.connection.password">123456</property>

  </session-factory>

</hibernate-configuration>

这个文件在系统中添加了连接数据库的驱动程序以及所连接的数据库、用户名和密码。

2.创建如图所示的包结构:



 

 

3.使用Hibernate逆向工程向导生成hibernate.reveng.xml文件,如图所示添加选中的数据表。

 

 
 

  

 

自动生成的文件:hibernate.reveng.xml

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

<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd " >

<hibernate-reverse-engineering>

  <schema-selection match-catalog="book"/>

  <table-filter match-name="admin"/>

</hibernate-reverse-engineering>

这个文件在系统中注册了数据库“book”和数据表“admin”。

4. 使用Hibernate向导生成Hibernate映射文件和POJOPlain Ordinary Java Object)文件:

 

 

 

生成的POJO文件是:

 

Admin.java

package javahibernate;

// Generated 2011-11-19 10:57:36 by Hibernate Tools 3.2.1.GA

 

/**

 * Admin generated by hbm2java

 */

public class Admin  implements java.io.Serializable {

     private int UId;

     private String UName;

     private String UPass;

   

public Admin() {

    }

    public Admin(int UId) {

        this.UId = UId;

    }

    public Admin(int UId, String UName, String UPass) {

       this.UId = UId;

       this.UName = UName;

       this.UPass = UPass;

    }

  

    public int getUId() {

        return this.UId;

    }

   

    public void setUId(int UId) {

        this.UId = UId;

    }

    public String getUName() {

        return this.UName;

    }

   

    public void setUName(String UName) {

        this.UName = UName;

    }

    public String getUPass() {

        return this.UPass;

    }

   

    public void setUPass(String UPass) {

        this.UPass = UPass;

    }

}

生成的Hibernate映射文件是:

Admin.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Generated 2011-11-19 10:57:36 by Hibernate Tools 3.2.1.GA -->

<hibernate-mapping>

    <class name="javahibernate.Admin" table="admin" catalog="book">

        <id name="UId" type="int">

            <column name="u_id" />

            <generator class="assigned" />

        </id>

        <property name="UName" type="string">

            <column name="u_Name" length="20" />

        </property>

        <property name="UPass" type="string">

            <column name="u_Pass" length="20" />

        </property>

    </class>

</hibernate-mapping>

 

此时Hibernate配置文件hibernate.cfg.xml中,在<session-factory>标记内增加了映射信息:

<mapping resource="javahibernate/Admin.hbm.xml"/>

这两个文件构成了hibernate框架的核心基础:关系数据库到对象的映射,通过映射我们可以在项目中使用面向对象的编程技术。

到此为止,基于Hibernate的持久化工作已准备就绪。所有的工作基本上是自动完成的。

5.在“book.common”包放置工具类用于建立获取SessionFactory和管理Session,在此添加HibernateUtil.java文件:

 

package book.common;

import org.hibernate.Session;

 import org.hibernate.SessionFactory;

 import org.hibernate.cfg.Configuration;

 

public class HibernateUtil {   

    private static Configuration configuration = new Configuration();

    private static SessionFactory sessionFactory = null;

   

    static{

        try{

            configuration.configure();

            sessionFactory = configuration.buildSessionFactory(); 

        }catch(Exception e){          

        }

    }

    public Session getSession(){

        Session session = null;

        try{

            session = sessionFactory.openSession();

        }catch(Exception e){           

}

        return session;

    }

    public void closeSession(Session session){

        try{

            if(null != session)

                session.close();

        }catch(Exception e){           

        }

    }

}

6.包“book.idao”放置数据访问接口,添加IUserDao接口文件:

package book.idao;

import book.model.User;

public interface IUserDao {

    User fineOne(String userName,String userPassword);

}

7. 包“book.dao”放置数据访问类,添加UserDao.java文件,实现IUserDao接口,完成数据访问:

package book.dao;

 

import book.common.DB_Conn;

import book.model.User;

import book.idao.IUserDao;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class UserDao implements IUserDao{

      

    //创建公用数据库连接类对象

    DB_Conn db_conn=new DB_Conn();

    //通过用户名称获取用户信息

    @Override

    public User fineOne(String username, String password) {

       db_conn.ConnectDB();

       ResultSet rs = null;

       try {

            String sql = "select * from admin where u_Name ='"

                     + username + "' and u_Pass='" + password + "'";

            rs = db_conn.sm.executeQuery(sql);        // 执行sql语句

            User user = null;

            if (rs.next()) {

                user = new User();                     

              user.setUsername(username);

              user.setPassword(rs.getString("u_Pass"));                       

              return user;

            }

            return user;

        }catch (SQLException SqlE) {

            return null;

        }catch (Exception E) {

            return null;

       }finally {

            // 关闭连接,释放数据库资源:

            db_conn.CloseDB();

       }

    }    

}

8.在包“book.iservice”中放置数据的逻辑访问接口,在此添加IUserService.java接口文件:

package book.iservice;

import book.model.User;

public interface IUserService {

    User findUserByNameAndPassword(String userName,String userPassword);

}

9. 包“book.service”放置数据逻辑访问类,添加UserService.java文件,实现IUserService,调用UserDao类的功能,完成对数据逻辑访问:

package book.service;

import book.iservice.IUserService;

import book.model.User;

import book.idao.IUserDao;

import book.dao.UserDao;

public class UserService implements IUserService{

    private IUserDao userDao=new UserDao();

    @Override

    public User findUserByNameAndPassword(String userName,String userPassword){

        return userDao.fineOne(userName, userPassword);

    }   

}

10.添加一个servlet类:LoginServlet,在步骤3中选中“将信息添加到部署描述符”选项。如图:

 

 




 
 

 

LoginServlet.java文件加入如下代码:

package book.servlet;

 

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import book.iservice.IUserService;

import book.service.UserService;

import book.model.Admin;

public class LoginServlet extends HttpServlet {

    private IUserService userService=new UserService();

    Admin user=null;

   

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");

        String UserName = request.getParameter("logname");

       String Password = request.getParameter("logpwd");

        user=userService.findUserByNameAndPassword(UserName, Password);

        if (user.getUName() != null) {

            request.setAttribute("username", user.getUName());

            try {

                request.getRequestDispatcher("index.jsp").forward(request,response);

            }catch (Throwable t) {

                getServletContext().log(t.getMessage());

            }

        } else {

            request.setAttribute("error", "用户名与密码不匹配,登录失败,请重试!");

            try {

                request.getRequestDispatcher("Login.jsp").forward(request, response);

            }catch (Throwable t) {

                getServletContext().log(t.getMessage());

            }

        }

    }

11. 创建如下两个页面:

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字符串。

12. 生成项目,并运行http://localhost:8080/login/login.jsp

 

 

   

 

 

只供学习交流使用,版权所有,请勿侵权。有任何疑问可以通过下文的邮件或QQ联系我本人。 这是我做的第一个Web网站,前台页面主要利用JSP、jQuery(数据验证),部分页面用到Ajax。控制转发层采用Servlet,数据访问层采用Hibernate(bean和dao是由Hibernate逆向工程自动生成)。 系统采用分层架构,由上到下分为视图层、控制转发层、业务层、服务层、数据库访问层。运用了一些基本设计模式,系统可扩展性还是非常良好的。 具体安装运行方法见readme.txt文件。附带了建表sql文件。最好先看下文档目录下的架构文档、需求概要文档以及几个类图,有助于快速理解整个项目。下面是readme.txt中的内容: 本项目是一个健身俱乐部系统,面向三类:会员(家庭会员和个人会员)、俱乐部经理、俱乐部服务员。 一、项目尚存在的缺陷: 1.上次支付日期,记录的是上次缴纳月供的时间。扣除月供由一个SQL存储过程完成。 2.Cookie记住密码 3.活动海报提供点击看大图功能 4.添加活动的日期用jQuery日期插件(datepicker) 5.为表格添加更多的CSS样式,让表格更美观点 6.某些页面应该提供分页显示(时间紧没处理) 7.由于是第一次做网站,且时间比较紧(这段时间期末考试),所以对于一些细节问题,如防止表单重复提交、某些页面的访问权限控制(基本的访问权限控制已经实现,但是有些比如像俱乐部服务员可以不登陆直接通过URL访问会员管理页面,而实际上是应该不允许的。实现也非常简单,使用过滤器对指定页面处理即可,有点累了,不再折腾了) 8.页面风格统一的问题,比如登录页面、注册页面和主页面的风格可能不太统一 PS: 上面几点是我个人目前认为的不足之处,具体的就请各位自己斟酌了。另外除了注册页面也非常详细的数据验证,其他页面如添加活动页面基本没有数据验证(不想重复劳动,代码基本非常类似). 代码中用到了较多的jQuery和部分Ajax(借助jQuery实现),在阅读代码的时候如果不熟悉jQuery和Ajax的话,还是先去稍微学习几个入门实例较好。 二、运行方式: a. 创建数据库:我用的是MySQL 5.1版本,不同版本之间可能存在不兼容问题,可能得对sql文件做少许修改。先去MySQL下(cmd或可视化工具)下创建一个数据库health_club。然后利用mysql命令导入sql文件: mysql -u root -p health_club < health_club.sql b. 将源代码下的整个文件夹复制到Tomcat的app目录下,我用的是Hibernate ORM框架,且我的MySQL密码是123456。如果你的MySQL密码不是123456,则必须去src目录下打开hibernate.cfg.xml,找到下面这行: 123456 修改密码为你的数据库对应密码就好了 c. 在浏览器中访问:http://localhost:8080/HealthClubProject/index.jsp 即可访问健身俱乐部系统主页 d. 当然也可以直接在MyEclipse中导入项目,我用的是MyEclipse Version 8.5 版权所有,只供学习交流使用,欢迎指正,有任何疑问可以通过下面方式联系我。 email feichexia@yahoo.com.cn QQ 735973629@qq.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值