慕课网 使用Struts2+Hibernate开发学生信息管理功能

来源:互联网 发布:秋瓷炫长相知乎 编辑:程序博客网 时间:2024/05/17 23:44

使用struts2和hibernate开发学生信息管理系统

第一章:Struts2Hibernate整合

1.1 创建struts2hirbernate的用户类库

Windows-->preferences-->Java-->Build Path-->User Libraies-->new

(struts2-corehirbernate-corejunitmysql-jdbc)

-->AddExternal JARs-->OK

1.2 导入struts2hibernatejar

l  新建项目(切换成UTF-8

右击项目-->BuildPath-->configure Build Path-->Add Library-->User Library-->next

1.3 配置web.xml

struts-2.3.14\apps\struts2-blank\WEB-INF\web.xml

1.4 配置struts.xml

struts-2.3.14\apps\struts2-blank\WEB-INF\classes\struts.xml

1.5 配置hirbernate.cfg.xml

hibernate-release-4.2.4.Final\project\etc\hibernate.cfg.xml

<hibernate-configuration>

    <session-factory>

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

        <propertyname="connection.url">jdbc:mysql:///test</property>

        <propertyname="connection.username">root</property>

        <propertyname="connection.password">1234</property>

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

        <propertyname="show_sql">true</property>

        <propertyname="format_sql">true</property>

        <propertyname="hbm2ddl.auto">update</property>

        <propertyname="hibernate.current_session_context_class">thread</property>

    </session-factory>

</hibernate-configuration>

1.6 创建实体类

1)创建entity

2Students.java

package entity;

import java.util.Date;

 

public class Students {

    private String sid;//学号

    private String sname;//姓名

    private String gender;//性别

    private Date birthday;//生日

    private String address;//地址

   

    @Override

    public String toString() {

       return "Students [address=" + address + ", birthday=" + birthday

              + ", gender=" + gender + ", sid=" + sid + ", sname=" + sname

              + "]";

    }

    public Students() {

 

    }

    public Students(String sid, String sname, String gender, Date birthday,

           String address) {

       super();

       this.sid = sid;

       this.sname = sname;

       this.gender = gender;

       this.birthday =birthday;

       this.address = address;

    }

   

    public String getSid() {

       return sid;

    }

    public void setSid(String sid) {

       this.sid = sid;

    }

    public String getSname() {

       return sname;

    }

    public void setSname(String sname) {

       this.sname = sname;

    }

    public String getGender() {

       return gender;

    }

    public void setGender(String gender) {

       this.gender = gender;

    }

    public Date getBirthday() {

       return birthday;

    }

    public void setBirthday(Date birthday) {

       this.birthday =birthday;

    }

    public String getAddress() {

       return address;

    }

    public void setAddress(String address) {

       this.address = address;

    }  

}

3Users.java

package entity;

 

public class Users {

    private intuid;

    private String username;

    private String password;

   

    public Users() {

    }

 

    public Users(intuid, String username, String password) {

       this.uid = uid;

       this.username =username;

       this.password =password;

    }

 

    public int getUid() {

       return uid;

    }

 

    public void setUid(intuid) {

       this.uid = uid;

    }

 

    public String getUsername() {

       return username;

    }

 

    public void setUsername(String username) {

       this.username =username;

    }

 

    public String getPassword() {

       return password;

    }

 

    public void setPassword(String password) {

       this.password =password;

    }  

}

1.7 生成实体类的关系映射文件

1Students.hbm.xml

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

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

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

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <classname="entity.Students"table="students"catalog="test">

        <id name="sid"type="java.lang.String"column="SID"length="8">

            <generator class="assigned"/>

        </id>

        <property name="sname"type="java.lang.String"/> 

        <property name="gender"type="java.lang.String"/>

        <property name="birthday"type="date"/>

        <property name="address"type="java.lang.String"/>   

  

    </class>

</hibernate-mapping>

Assigned手工赋值

 

2Users.hbm.xml

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

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

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

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <classname="entity.Users"table="USERS">

        <id name="uid"type="java.lang.Integer">           

            <generator class="native"/>

        </id>

        <property name="username"type="java.lang.String"/>

        <property name="password"type="java.lang.String"/>

         

    </class>

</hibernate-mapping>

USERS是表名

id是主键名

native自动增长类型

3)配置hibernate.cfg.xml

<mappingresource="entity/Students.hbm.xml"/>

<mappingresource="entity/Users.hbm.xml"/>

1.8 生成表结构(使用SchemaExport

src同级创建test-->entity包-->TestStudents.java

package entity;

 

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

import org.junit.Test;

 

publicclass TestStudents {

   

    @Test

    publicvoid testSchemaExport(){

       //创建配置对象

       Configuration config = new Configuration().configure();

       //创建SchemaExport对象

       SchemaExport export = new SchemaExport(config);

       export.create(true,true);

    }

}

右击Run As-->Junit Test

出现的错误可能为junit-4.11.jar需要配合hamcrest-core-1.3.jar使用

2章用户登录模块

2.1项目分层

项目分层:

M模型层:实体层(entity)、数据库层(db)、接口层(service)、接口实现层(serviceImpl)
C控制层:动作层(action)
V
视图层:JSP页面

2.2创建用户自定义的SessionFactory(MyHirbernateSessionFactory)

可使用自带

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.service.ServiceRegistryBuilder;

 

publicclass MyHibernateSessionFactory {

 

    private static SessionFactorysessionFactory;   //会话工厂属性

   

    //为保证单例模式,构造方法私有化

    private MyHibernateSessionFactory() {

    }

   

    //公有的静态方法,获得会话工厂对象

    public static SessionFactory getSessionFactory() {

        if(sessionFactory==null){

            Configuration configuration = new Configuration().configure();

            ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();

            sessionFactory = configuration.buildSessionFactory(serviceRegistry);

            return sessionFactory;

        }else{

            return sessionFactory;

        }

    }

}

2.3用户业务逻辑接口和实现类

1)UsersDao.java接口 

package service;

 

import entity.Users;

 

//用户业务逻辑接口

publicinterface UsersDAO {

         //用户登录方法

         public boolean usersLogin(Users u);

}

2)UsersDaoImpl.java

package serviceimpl;

 

import java.util.List;

import javax.transaction.Transaction;

import org.hibernate.Query;

import org.hibernate.Session;

import db.MyHibernateSessionFactory;

import entity.Users;

import service.UsersDAO;

 

public class UsersDAOImplimplements UsersDAO {

    @Override

    public boolean usersLogin(Users u) {

        //事物对象

        Transaction tx = null;

        //hql语句

        String hql = "";

        try {

Session session = MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            hql = "from Users where username=? and password=?";

            Query query = session.createQuery(hql);

            query.setParameter(0, u.getUsername());

            query.setParameter(1, u.getPassword());

            List list = query.list();

            //返回之前提交事务

            tx.commit();

            if(list.size()>0){

                return true;

            }else {

                return false;

            }

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }finally {

            if(tx!=null){

                tx = null;

            }

        }

    }

}

3)TestUserDaoImpl.java 测试类

首先在数据库中添加一个用户对象(zzh123456

package serviceimpl;

 

import junit.framework.Assert;

import org.junit.Test;

 

import entity.Users;

import service.UsersDAO;

 

publicclass TestUsersDAOImpl {

 

    @Test

    publicvoid testUserLogin(){

       Users u=new Users(1,"zzh","123456");

       UsersDAO udao=new UsersDAOImpl();     

       Assert.assertEquals(true,udao.usersLogin(u));

    }

}

2.4设计所有Action的父类

1)继承ActionSupport
2
)为了获得常用的内置对象采用耦合IOC方式注入属性

SuperAction.java

package action;

 

publicclass SuperActionextends ActionSupport

       implementsServletContextAware, ServletRequestAware, ServletResponseAware{

    privatestaticfinallongserialVersionUID = 1L;

   

    protected HttpServletRequestrequest;

    protected HttpServletResponseresponse;

    protected HttpSessionsession;

    protected ServletContextapplication;

 

    publicvoid setServletContext(ServletContextapplication) {

       this.application =application;

    }

    publicvoid setServletRequest(HttpServletRequestrequest) {

       this.request = request;

       this.session = this.request.getSession();

    }

    publicvoid setServletResponse(HttpServletResponseresponse) {

       this.response = response;

    }

}

2.5设计用户Action 

strus2接受表单数据的方式
三种:普通属性、领域对象、模型驱动

1) UsersAction.java

package action;

import com.opensymphony.xwork2.ModelDriven; //模型驱动

import entity.Users;

import service.UsersDAO;

import serviceimpl.UsersDAOImpl;

 

publicclass UsersActionextends SuperAction implements ModelDriven<Users>{

   

    privatestaticfinallongserialVersionUID = 4317500994450323565L;

   

    private Usersuser=new Users();

   

    //用户登录动作

    public String login(){

       UsersDAO udao=new UsersDAOImpl();

       if(udao.usersLogin(user)){

           return"login_success";

       }else{

           return"login_failure";

       }     

    }

    public Users getModel() {

       returnthis.user;

    }

}

2)struts.xml  配置映射

    <packagename="users"namespace="/users"extends="default">

        <actionname="*_*"class="action.{1}Action"method="{2}">

            <resultname="login_success">/users/users_login_success.jsp</result>

            <resultname="login_failure">/users/users_login.jsp</result>

        </action>

    </package>

2.6页面调用 

<form name="loginForm" action="<%=path%>/users/Users_login.action" method="post">

2.7完成显示登录成功用户名和注销功能

1)在action实现attribute保存,以及注销动作

//用户登录动作

    public String login(){

       UsersDAO udao=new UsersDAOImpl();

       if(udao.usersLogin(user)){

           //session中保存登录成功的用户名        

           session.setAttribute("loginUserName",user.getUsername()); 

           return"login_success";

       }else{

           return"login_failure";

       }     

    }

//用户注销操作,本操作不进行表单输入验证

    public String logout(){    

       if(session.getAttribute("loginUserName")!=null){

           session.removeAttribute("loginUserName");

       }

       return"logout_success";

    }

2)struts.xml 添加映射

<result name="logout_success">/users/Users_login.jsp</result>

3users_login_success.jsp 登录成功页面

<div id="welcome">欢迎${sessionScope.loginUserName}使用本系统</div>  

<div id="logout"><a href="<%=path%>/users/Users_logout.action">安全退出</a></div> 

2.8完成表单验证功能

————在登录表单上显示表单验证出错信息

1) action实现ActionSupportvalidate()方法

    @Override

    publicvoid validate() {

       if("".equals(user.getUsername().trim()) ){

           this.addFieldError("usernameError","用户名不能为空!");

       }

       if(user.getPassword().trim().length()<6){

           this.addFieldError("userpasswordError","密码不能小于6!");

       }

    }

2) 对不进行验证的方法上加注解@SkipValidatio

    @SkipValidation

    //用户注销操作,本操作不进行表单输入验证

    public String logout(){}

3)Struts.xml

    <packagename="users"namespace="/users"extends="default">

        <actionname="*_*"class="action.{1}Action"method="{2}">

            <resultname="login_success">/users/Users_login_success.jsp</result>

            <resultname="login_failure">/users/Users_login.jsp</result>

            <resultname="logout_success">/users/Users_login.jsp</result>

            <resultname="input">/users/Users_login.jsp</result>       <!-- 添加 -->

        </action>

    </package>

4) users_login.jsp 显示错误信息

<%@ taglib prefix="s" uri="/struts-tags"%>

<div>  

     <s:fielderror/> <!-- 显示表单验证的出错信息 -->  

</div>  

3章学生信息管理模块

学生管理模块:

1.      显示学生资料

2.      删除学生资料

3.      学生主键生成策略

4.      添加学生资料

5.      修改学生资料

3.1显示学生资料——准备 

为数据库输入数据(在test.entity.TestStudents中添加testSaveStudents()测试方法)

@Test

     public void testSaveStudents(){

         //创建配置对象

         Configuration config = new Configuration().configure();

         //创建服务注册对象

         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();

         //创建sessionFactory对象

         SessionFactory sessionFactory =config.buildSessionFactory(serviceRegistry);

         //创建session对象

         Session session = sessionFactory.getCurrentSession();

         //创建事物对象

         Transaction tx=session.beginTransaction();

        

         Students s1=new Students("$0000001","张三丰","",new Date(),"武当山");

         Students s2=new Students("$0000002","郭靖","",new Date(),"桃花岛");          

         Students s3=new Students("$0000003","黄蓉","",new Date(),"桃花岛"); 

        

         session.save(s1);

         session.save(s2);

         session.save(s3);

         //提交事务

         tx.commit();

         sessionFactory.close();

     }

3.2显示——学生业务逻辑接口

增删改查(service.StudentsDAO

//学生业务逻辑接口

publicinterface StudentsDAO {

   

    //查询所有

    public List<Students> queryAllStudents();

    //查询单个

    public Students queryStudentsBySid(Stringsid);

    //

    publicboolean addStudents(Studentss);

    //

    publicboolean updateStudents(Studentss);

    //

    publicboolean deleteStudents(Stringsid);   

}

3.3显示——学生业务逻辑接口实现类 

publicclass StudentsDAOImplimplements StudentsDAO {

 

    @Override

    //查询所有

    public List<Students> queryAllStudents() {

 

       Transaction tx=null;

       List<Students> list=null;

       String hql="";

       try{

           Session session=MyHibernateSessionFactory

.getSessionFactory().getCurrentSession();

           tx=session.beginTransaction();

          

           hql="from Students ";

           Query query=session.createQuery(hql);

           list=query.list();

 

           tx.commit();

       }catch(Exceptionex){

           ex.printStackTrace();

           tx.commit();

       }finally{

           if(tx!=null){

              tx=null;

           }

       }

       returnlist;

    }

test中写测试方法

publicclass TestStudentsDAOImpl {

 

    @Test

    publicvoidTestStudentsDAOImpl() {

 

       StudentsDAO sdao = new StudentsDAOImpl();

       List<Students> list = sdao.queryAllStudents();

       for (int i = 0; i < list.size(); i++) {

           System.out.println(list.get(i));

       }

    }

Console中显示出现有的学生资料

3.4显示——实现显示学生资料Action 

1StudentsAction.java

package action;

 

import java.util.List;

 

import entity.Students;

import service.StudentsDAO;

import serviceimpl.StudentsDAOImpl;

 

publicclass StudentsActionextends UsersAction {

   

    privatestaticfinallongserialVersionUID = 1L;

 

    //查询所有学生动作

    public String query(){

       StudentsDAO sDao=new StudentsDAOImpl();

       List<Students> list=sDao.queryAllStudents();

       //放进session

       if(list!=null &&list.size()>0){

           session.setAttribute("stundesList",list);          

       }

       return"query_success";

    }

}

3)struts.xml

     <packagename="students"namespace="/students"extends="default">

         <actionname="*_*"class="action.{1}Action"method="{2}">

              <resultname="query_success">/students/Students_query_success.jsp</result>

         </action>

     </package>

3.5显示——页面调用与数据展现

tree.jsp

{ level:2, name:"学生列表", ico:"images/icon_default.gif",link:"students/Students_query.action"},

top.document.frames["MainFrame"].location.href=link;

/students/Students_query_success.jsp

<s:iterator value="#session.students_list"var="stu">

    <tr class="list">

        <td><s:propertyvalue="#stu.sid"/></td>

        <td><ahref="<%=path%>/students/Students_modify.action?sid=<s:propertyvalue="#stu.sid"/>"><s:propertyvalue="#stu.sname"/></a></td>

        <td><s:propertyvalue="#stu.gender"/></td>

        <td><s:datename="#stu.birthday"format="yyyyMMdd"/></td>

        <td><s:propertyvalue="#stu.address"/></td>

        <td><ahref="<%=path%>/students/Students_delete.action?sid=<s:propertyvalue="#stu.sid"/>"onclick="javascript: return confirm('真的要删除吗?');">删除</a></td>

    </tr>

    </s:iterator>

3.6删除学生资料

0)添加删除页面链接

<td><ahref="<%=path%>/students/Students_delete.action?sid=<s:propertyvalue="#stu.sid"/>"onclick="javascript: return confirm('真的要删除吗?');">删除</a></td>

1)StudentsDaoImpl.java

@Override

    publicboolean deleteStudents(Stringsid) {

 

        Transaction tx=null;

        try{

            Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            tx=session.beginTransaction();

           

            Students s=(Students) session.get(Students.class,sid);

            session.delete(s);         

               

            tx.commit();

            returntrue;

        }catch(Exceptionex){

            ex.printStackTrace();

            tx.commit();

            returnfalse;

        }finally{

            if(tx!=null){

                tx=null;

            }      

        }  

}

2) StudentsAction.java

    //删除学生动作

    public String delete(){

       StudentsDAO sDao=new StudentsDAOImpl();      

       String sid=request.getParameter("sid");

       sDao.deleteStudents( sid );    

       return"delete_success";   

    }

3) Struts.xml

<result name="delete_success"type="chain">Students_query </result>

chain-->转发(后面)————————无action

redirect-->重定向------------action

<result name="delete_success"type="redirect ">Students_query.action</result>

3.7添加——实现步骤和界面原型设计

1)界面原型Students_add.jspStudents_add_success.jsp

3.8添加——学号生成方法 

1)StudentsDaoImpl.java

//生成学生学号,测试之后换成私有的

    public String getNewSid(){

        Transaction tx=null;

        String sid=null;

        String hql="";

        try{

            Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            tx=session.beginTransaction();

           

            hql="select max(sid) from Students ";

            Query query=session.createQuery(hql);

            sid=(String)query.uniqueResult();

            if(sid==null ||  "".equals(sid.trim())){

                //给一个默认的最大编号

                sid="S0000001";

            }else{

                String temp=sid.substring(1); //取后7

                inti=Integer.parseInt(temp); //转成数字

                i++;

                temp=String.valueOf(i);//转成string

                intlen=temp.length(); //数字位数

                //凑够7位

                for(intj=0;j<7-len;j++){

                    temp="0"+temp;

                }

                sid="S"+temp;

            }

            tx.commit();           

        }catch(Exceptionex){

            ex.printStackTrace();

            tx.commit();       

        }finally{

            if(tx!=null){

                tx=null;

            }      

        }  

        returnsid;

    }

测试junit

    @Test

    publicvoid TestGetNewSid(){

       StudentsDAOImpl sDao = new StudentsDAOImpl();

       System.out.println(sDao.getNewSid());

    }

测试成功后,把方法换成私有的

3.9添加——添加学生业务逻辑接口类

1 StudentsDaoImpl.java

@Override

    publicboolean addStudents(Studentss) {

        //设置学生学号

        s.setSid(getNewSid());

        Transaction tx=null;   

        String hql="";

            try{

                Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

                tx=session.beginTransaction();         

                session.save(s);           

                tx.commit();

            }catch(Exceptionex){

                ex.printStackTrace();

                tx.commit();

                returnfalse;

            }finally{

                if(tx!=null){

                    tx=null;

                }      

            }  

        returntrue;

    }

测试junit

    @Test

    publicvoid TestAddStudents(){

       Students s = new Students();

       s.setSname("志宏");

       s.setGender("");

       s.setBirthday(new Date());

       s.setAddress("太原理工");

       StudentsDAO sDao = new StudentsDAOImpl();

       Assert.assertEquals(true,sDao.addStudents(s));

    }

2)StudentsAction.java

    //添加学生

    public String add()throws Exception{

 

       Students s=new Students();

       s.setSname(request.getParameter("sname"));

       s.setGender(request.getParameter("gender"));

      

       SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

       s.setBirthday(sdf.parse(request.getParameter("birthday")));

       s.setAddress(request.getParameter("address"));

      

       StudentsDAO sDao = new StudentsDAOImpl();

       sDao.addStudents(s);       

       return"add_success";

    }

3) Struts.xml

<result name="add_success">/students/Students_add_success.jsp</result>

4) Students_query_success.jsp

<a href="<%=path%>/students/Students_add.jsp">添加学生</a>  

5) Students_add.jsp

<form name="addForm" action="<%=path%>/students/Students_add.action" method="post">

 

6Students_add_success.jsp

<a href="<%=path%>/students/Students_add.jsp">继续添加?</a> 

3.10修改——实现步骤和界面原型演示

 

3.11修改——实现页面显示要修改的生资料

1)StudentsDaoImpl.java

    @Override

    public Students queryStudentsBySid(Stringsid) {

      

       Transaction tx = null;

       Students s = null;

       try {

           Session session = MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

           tx = session.beginTransaction();

           s = (Students) session.get(Students.class,sid);

           tx.commit();

       } catch (Exceptione) {

           e.printStackTrace();

           tx.commit();

       }finally{

           if(tx!=null){

              tx=null;

           }

       }

       returns;

    }

2)StudentsAction.java

//修改学生资料

    public String modify(){

       //获得传递过来的学生编号

       String sid =request.getParameter("sid");

       StudentsDAO sDao=new StudentsDAOImpl();

       Students s=sDao.queryStudentsBySid(sid);

       //保存在会话中

       session.setAttribute("modify_students",s);

       return"modify_success";   

    }

3)Struts.xml

<result name="modify_success">/students/Students_modify.jsp</result> 

4)Students_query_success.jsp

<td><ahref="<%=path%>/students/Students_modify.action?sid=<s:propertyvalue="#stu.sid"/>"><s:propertyvalue="#stu.sname"/></a></td>

5)修改Students_modify.jsp

修改sid,sname,gender,birthday,address的显示

3.12 修改——实现修改学生资料action和页面调用测试 

1StudentsDAOImpl.java

    @Override

    publicboolean updateStudents(Studentss) {

        Transaction tx=null;

        try{

            Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            tx=session.beginTransaction();

           

            session.update(s);         

               

            tx.commit();

            returntrue;

        }catch(Exceptionex){

            ex.printStackTrace();

            tx.commit();

            returnfalse;

        }finally{

            if(tx!=null){

                tx=null;

            }      

        }  

    }

2) StudentsAction.java

// 保存修改的学生对象

    public String save()throws Exception{

 

       Students s = new Students();

       s.setSid(request.getParameter("sid"));

       s.setSname(request.getParameter("sname"));

       s.setGender(request.getParameter("gender"));

 

       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

       s.setBirthday(sdf.parse(request.getParameter("birthday")));

       s.setAddress(request.getParameter("address"));

 

       StudentsDAO sDao = new StudentsDAOImpl();

       sDao.updateStudents(s);

       return"save_success";

    }

3) Struts.xml

<result name="save_success">/students/Students_modify_success.jsp</result>

4) Students_modify.jsp

<result name="modify_success">/students/Students_modify.jsp</result> 

 

0 0
原创粉丝点击