慕课网 使用Struts2+Hibernate开发学生信息管理功能
来源:互联网 发布:秋瓷炫长相知乎 编辑:程序博客网 时间:2024/05/17 23:44
使用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>
<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包
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 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 生成实体类的关系映射文件
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>
<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手工赋值
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>
<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 测试类
首先在数据库中添加一个用户对象(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 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>
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
<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类
1)StudentsAction.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="yyyy年MM月dd日"/></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.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(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">
6)Students_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和页面调用测试
1)StudentsDAOImpl.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>
- 使用Struts2+Hibernate开发学生信息管理功能
- 慕课网 使用Struts2+Hibernate开发学生信息管理功能
- 使用Struts2+Hibernate开发学生信息管理系统
- 慕课网_使用Struts2+Hibernate开发学生信息管理系统
- 慕课网 项目实战 使用struts2和hibernate开发学生信息管理系统
- 【Struts2+Hibernate4】开发学生信息管理功能(一)
- 【Struts2+Hibernate4】开发学生信息管理功能(二)
- 【Struts2+Hibernate4】开发学生信息管理功能(三)
- 学生信息管理系统(struts2+Hibernate)(1)
- hibernate+struts2学生信息管理系统简单整合
- 基于struts2开发的学生信息管理系统
- 基于Struts2+Hibernate的学生信息管理系统实例
- 使用struts2 hibernate spring整合实现新闻信息管理系统案例-实现新闻信息分页显示功能
- 实践hibernate的应用——struts2+hibernate的简单学生信息管理
- web开发学生信息管理系统
- spring+springMVC+hibernate之学生信息管理
- 学生信息管理系统beans,spring+hibernate配置
- 学生信息管理系统:功能和数据库设计图
- caffe之 Blob、Layer、Net
- uva 11178 Morley's Theorem
- Linux学习笔记一基础知识的整理
- 在VS2013上配置parser generator
- Linux_命令_文件内容查阅
- 慕课网 使用Struts2+Hibernate开发学生信息管理功能
- WNDCLASS结构体
- 预处理
- linux下的几种进程间通信方式的特点
- PS工具第二组。绘画与修饰工具(局部修饰!)
- LeetCode 19. Remove Nth Node From End of List
- Codeforces Round #381 (Div. 2) B. Alyona and flowers
- 自然数幂级数之和
- MFC Opengl 使用glm数学库进行空间坐标系矩阵变换