使用struts2和hibernate开发学生信息管理系统
第一章:Struts2与Hibernate整合
1.1 创建struts2和hirbernate的用户类库
Windows-->preferences-->Java-->Build Path-->User Libraies-->new
(struts2-core、hirbernate-core、junit、mysql-jdbc)
-->AddExternal JARs-->OK
1.2 导入struts2和hibernate的jar包
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> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql:///test</property> <property name="connection.username">root</property> <property name="connection.password">1234</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="hibernate.current_session_context_class">thread</property> </session-factory> </hibernate-configuration> |
1.6 创建实体类
1)创建entity包
2)Students.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; } } |
3)Users.java
package entity;
public class Users { private int uid; private String username; private String password;
public Users() { }
public Users(int uid, String username, String password) { this.uid = uid; this.username = username; this.password = password; }
public int getUid() { return uid; }
public void setUid(int uid) { 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 生成实体类的关系映射文件
1)Students.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> <class name="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手工赋值 |
2)Users.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> <class name="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
<mapping resource="entity/Students.hbm.xml" /> <mapping resource="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) |
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 SessionFactory sessionFactory; //会话工厂属性
//为保证单例模式,构造方法私有化 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 UsersDAOImpl implements 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 测试类
首先在数据库中添加一个用户对象(zzh:123456)
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 SuperAction extends ActionSupport implementsServletContextAware, ServletRequestAware, ServletResponseAware{ privatestaticfinallongserialVersionUID = 1L;
protected HttpServletRequest request; protected HttpServletResponse response; protected HttpSession session; protected ServletContext application;
publicvoid setServletContext(ServletContext application) { this.application = application; } publicvoid setServletRequest(HttpServletRequest request) { this.request = request; this.session = this.request.getSession(); } publicvoid setServletResponse(HttpServletResponse response) { 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 UsersAction extends SuperAction implements ModelDriven<Users>{
privatestaticfinallongserialVersionUID = 4317500994450323565L;
private Users user=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 配置映射
<package name="users" namespace="/users" extends="default"> <action name="*_*" class="action.{1}Action" method="{2}"> <result name="login_success">/users/users_login_success.jsp</result> <result name="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> |
3)users_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实现ActionSupport的validate()方法
@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
<package name="users" namespace="/users" extends="default"> <action name="*_*" class="action.{1}Action" method="{2}"> <result name="login_success">/users/Users_login_success.jsp</result> <result name="login_failure">/users/Users_login.jsp</result> <result name="logout_success">/users/Users_login.jsp</result> <result name="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(String sid); //增 publicboolean addStudents(Students s); //改 publicboolean updateStudents(Students s); //删 publicboolean deleteStudents(String sid); } |
3.3 显示——学生业务逻辑接口实现类
publicclass StudentsDAOImpl implements 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(Exception ex){ ex.printStackTrace(); tx.commit(); }finally{ if(tx!=null){ tx=null; } } returnlist; } |
publicclass TestStudentsDAOImpl {
@Test publicvoid TestStudentsDAOImpl() {
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类
1)StudentsAction.java
package action;
import java.util.List;
import entity.Students; import service.StudentsDAO; import serviceimpl.StudentsDAOImpl;
publicclass StudentsAction extends UsersAction {
privatestaticfinallongserialVersionUID = 1L;
//查询所有学生动作 public String query(){ StudentsDAO sDao=new StudentsDAOImpl(); List<Students> list=sDao.queryAllStudents(); //放进session中 if(list!=null && list.size()>0){ session.setAttribute("students_list", list); } return"query_success"; } } |
3)struts.xml
<package name="students" namespace="/students" extends="default"> <action name="*_*" class="action.{1}Action" method="{2}"> <result name="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:property value="#stu.sid"/></td> <td><a href="<%=path%>/students/Students_modify.action?sid=<s:property value="#stu.sid"/>"><s:property value="#stu.sname"/></a></td> <td><s:property value="#stu.gender"/></td> <td><s:date name="#stu.birthday" format="yyyy年MM月dd日"/></td> <td><s:property value="#stu.address"/></td> <td><a href="<%=path%>/students/Students_delete.action?sid=<s:property value="#stu.sid"/>" onclick="javascript: return confirm('真的要删除吗?');">删除</a></td> </tr> </s:iterator> |
3.6 删除学生资料
0)添加删除页面链接
<td><a href="<%=path%>/students/Students_delete.action?sid=<s:property value="#stu.sid"/>" onclick="javascript: return confirm('真的要删除吗?');">删除</a></td> |
1)StudentsDaoImpl.java
@Override publicboolean deleteStudents(String sid) {
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(Exception ex){ 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.jsp和Students_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(Exception ex){ 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(Students s) { //设置学生学号 s.setSid(getNewSid()); Transaction tx=null; String hql=""; try{ Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession(); tx=session.beginTransaction(); session.save(s); tx.commit(); }catch(Exception ex){ 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">
|
6)Students_add_success.jsp
<a href="<%=path%>/students/Students_add.jsp">继续添加?</a> |
3.10 修改——实现步骤和界面原型演示
3.11 修改——实现页面显示要修改的生资料
1)StudentsDaoImpl.java
@Override public Students queryStudentsBySid(String sid) {
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 (Exception e) { 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><a href="<%=path%>/students/Students_modify.action?sid=<s:property value="#stu.sid"/>"><s:property value="#stu.sname"/></a></td> |
5)修改Students_modify.jsp
修改sid,sname,gender,birthday,address的显示
3.12 修改——实现修改学生资料action和页面调用测试
1)StudentsDAOImpl.java
@Override publicboolean updateStudents(Students s) { Transaction tx=null; try{ Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession(); tx=session.beginTransaction();
session.update(s);
tx.commit(); returntrue; }catch(Exception ex){ 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> |