资源描述
。
基于ssh架构的学生成绩管理系统
(1) 整合Struts2、Spring和Hibernate框架
(2) 实现“登录”功能
(3) 实现“学生信息管理”功能
(4) 实现“学生成绩管理”功能
(5) 实现分页功能
掌握Struts2的开发步骤
掌握Hibernate的开发步骤
掌握Spring的开发步骤,理解依赖注入、AOP、事务管理等
掌握Struts2、Spring和Hibernate框架的整合
掌握分页技术
1、 建库建表
2、 利用分层思想,建package
3、 添加Spring开发能力
4、 添加Hibernate开发能力
5、 生成Hibernate所需的POJO类和映射文件
6、 开发DAO层
(1) 新建DAO层接口。
(2) 新建DAO层实现类(该类要实现DAO层接口,继承HibernateDaoSupport类)。
(3) 在Spring配置文件中增加该DAO层实现类的定义,并需要依赖注入一个SessionFactory bean的引用。
7、 开发Service层
(1) 新建Service层接口。
(2) 新建Service层实现类,该类中需要声明所调用DAO层接口,并生其setter方法。
(3) 在Spring配置文件中增加该Service层实现类的定义,并需要依赖注入DAO层的bean。
8、 实现WEB层
(1) 在web.xml中增加struts2的过滤器和Spring的监听器。
(2) 增加Spring和Struts2的整合文件struts.properties。
(3) 新建所需的jsp文件。
(4) 新建Action类,该类要继承ActionSupport,同时该类要依赖注入Service的bean(声明+setter方法)。
(5) 在Spring配置文件中增加该Action类的定义,并注入Service层的bean。
(6) 在struts.xml中增加该Action的定义,其中class的属性是在Spring中定义的该Action bean的id。
9、部署运行
实验步骤:
1、 建库、建表
建立数据库xscj,建立xsb、dlb、zyb、kcb、cjb等。
学生信息表:xsb
列名
描述
数据类型
可空
默认值
说明
XH
学号
Char(6)
×
无
主键
XM
姓名
Char(8)
×
无
XB
性别
bit
×
无
1:男,0:女
CSSJ
出生时间
datetime
√
无
ZY_ID
专业ID
int
×
无
ZXF
总学分
int
√
无
BZ
备注
Varchar(200)
√
无
ZP
照片
mediumblob
√
无
登录表:dlb
列名
描述
数据类型
可空
默认值
说明
id
标识
int
×
自增1
主键,自增
xh
登录号
char(6)
×
无
外键,xsb中xh
kl
口令
char(20)
×
无
专业表:zyb
列名
描述
数据类型
可空
默认值
说明
id
ID
int
×
自增1
主键
zym
专业名
char(12)
×
无
rs
人数
int
√
0
fdy
辅导员
char(8)
√
无
课程表:kcb
列名
描述
数据类型
可空
默认值
说明
kch
课程号
Char(3)
否
无
主键
kcm
课程名
Char(12)
是
无
kxxq
开课学期
smallint
是
无
1-8
xs
学时
int
是
0
xf
学分
int
是
0
连接表:xs_kcb
列名
描述
数据类型
可空
默认值
说明
xh
学号
char(6)
主键
kch
课程号
char(3)
主键
成绩表:cjb
列名
描述
数据类型
可空
默认值
说明
Xh
学号
Char(6)
否
无
主键
Kch
课程号
Char(3)
否
无
主键
Cj
成绩
int
是
0
xf
学分
int
是
0
2、 设计系统架构
利用分层架构模式,设计系统架构,系统可分为表示层、业务逻辑层和数据持久层。如下图所示:
建立相应package。
3、 添加Spring开发能力
(1) 定义User Library
(2) 增加Spring开发能力(添加jar包——使用User Library,新建applicationContext.xml)
注:可以不增加User Library,直接把需要的jar包拷贝到classpath下。
4、 实现Hibernate持久层
(1) 添加Hibernate开发能力
添加jar包:如果第一步中已增加,此步可以省略。
注意:需要把Hibernate交由Spring来管理,其中包括在Spring中配置“dataSource”和“sessionFactory”
(2) 通过MyEclipse中Hibernate 反向工程,分别生成表对应的POJO类及相应的映射文件。
注意:所有的POJO类和映射文件(*.hbm.xml)放在org.model这个package下。
难点1:xsb(学生表)的映射文件中需要设置和专业的多对一关系,参考代码如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"
<hibernate-mapping>
<class name="org.model.Xsb" table="XSB" schema="dbo" catalog="XSCJ">
<id name="xh" type="java.lang.String">
<column name="XH" length="6" />
<generator class="assigned" />
</id>
<property name="xm" type="java.lang.String">
<column name="XM" length="50" />
</property>
<property name="xb" type="java.lang.Byte">
<column name="XB" />
</property>
<property name="cssj" type="java.util.Date">
<column name="CSSJ" length="23" />
</property>
<property name="zxf" type="java.lang.Integer">
<column name="ZXF" />
</property>
<property name="bz" type="java.lang.String">
<column name="BZ" length="500" />
</property>
<property name="zp">
<column name="ZP" />
</property>
<many-to-one name="zyb" class="org.model.Zyb" fetch="select" lazy="false">
<column name="ZY_ID" />
</many-to-one>
</class>
</hibernate-mapping>
难点2:成绩表(cjb)中需要配置复合主键,因为成绩表中的主键是由xh和kch组成,参考代码如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.model.Cjb" table="CJB" schema="dbo" catalog="XSCJ">
<!-- 复合主键配置 其中两个key-property,分别对应两个主键-->
<composite-id name="id" class="org.model.CjbId">
<key-property name="xh" type="java.lang.String">
<column name="XH" length="6" />
</key-property>
<key-property name="kch" type="java.lang.String">
<column name="KCH" length="4" />
</key-property>
</composite-id>
<property name="cj" type="java.lang.Integer">
<column name="CJ" />
</property>
<property name="xf" type="java.lang.Integer">
<column name="XF" />
</property>
</class>
</hibernate-mapping>
对应的POJO类由复合主键的POJO类和成绩表的POJO类组成,参考代码如下:
CjbId.java
package org.model;
public class CjbId implements java.io.Serializable {
private String xh;
private String kch;
public CjbId() {
}
public CjbId(String xh, String kch) {
this.xh = xh;
this.kch = kch;
}
public String getXh() {
return this.xh;
}
public void setXh(String xh) {
this.xh = xh;
}
public String getKch() {
return this.kch;
}
public void setKch(String kch) {
this.kch = kch;
}
}
Cjb.java
package org.model;
public class Cjb implements java.io.Serializable {
private CjbId id;
private Integer cj;
private Integer xf;
public Cjb() {
}
public Cjb(CjbId id) {
this.id = id;
}
public Cjb(CjbId id, Integer cj, Integer xf) {
this.id = id;
this.cj = cj;
this.xf = xf;
}
public CjbId getId() {
return this.id;
}
public void setId(CjbId id) {
this.id = id;
}
public Integer getCj() {
return this.cj;
}
public void setCj(Integer cj) {
this.cj = cj;
}
public Integer getXf() {
return this.xf;
}
public void setXf(Integer xf) {
this.xf = xf;
}
}
重点:所有的映射文件需要在Spring配置文件中注册,参考applicationContext.xml如下:
……
<bean id="datasource" class="mons.dbcp.BasicDataSource">
<!-- 定义数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver">
</property>
<!-- 定义数据库URL -->
<property name="url" value="jdbc:mysql://localhost:3306/xscj">
</property>
<!-- 定义数据库的用户名 -->
<property name="username" value="root"></property>
<!-- 定义数据库密码 -->
<property name="password" value="root"></property>
</bean>
<!-- 定义Hibernate的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!--定义SessionFactory必须注入DataSource-->
<property name="dataSource">
<ref bean="datasource" />
</property>
<!--定义Hibernate的SessionFactory属性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<!-- 定义POJO的映射文件 -->
<property name="mappingResources">
<list>
<value>org/model/Dlb.hbm.xml</value>
<value>org/model/Xsb.hbm.xml</value>
<value>org/model/Kcb.hbm.xml</value>
<value>org/model/Zyb.hbm.xml</value>
<value>org/model/Cjb.hbm.xml</value>
</list>
</property>
</bean>
……
5、 实现DAO
所有DAO层的实现类需要继承HibernateDaoSupport类,参考代码如下:
package org.dao.imp;
import java.util.List;
import org.dao.DlDao;
import org.model.Dlb;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class DlDaoImp extends HibernateDaoSupport implements DlDao{
public boolean existXh(String xh) {
List list=getHibernateTemplate().find("from Dlb where xh=?",xh);
if(list.size()>0)
return true;
else
return false;
}
public Dlb find(String xh, String kl) {
String str[]={xh,kl};
List list=getHibernateTemplate().find("from Dlb where xh=? and kl=?",str);
if(list.size()>0)
return (Dlb) list.get(0);
else
return null;
}
public void save(Dlb user) {
getHibernateTemplate().save(user);
}
}
注意:所有DAO层的实现类都需要在Spring配置,并且必须获得一个SessionFactory的引用,然后才能完成持久化访问。换句话说,DAO的实现类都交由Spring容器的Bean来管理。参考Spring中的配置DAO的部分代码如下“
<bean id="dlDao" class="org.dao.imp.DlDaoImp">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="xsDao" class="org.dao.imp.XsDaoImp">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="kcDao" class="org.dao.imp.KcDaoImp">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="zyDao" class="org.dao.imp.ZyDaoImp">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="cjDao" class="org.dao.imp.CjDaoImp">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
6、 实现业务逻辑层(Service层)
主要实现对DAO层的调用。
难点1:依赖注入
依赖注入首先要在需要注入的类中声明一个变量(对象),同时生成该变量(对象)的setter方法。其次需要在Spring配置文件中设置需要注入的对象。
例如,需要在登录的DlServiceManage类中注入DlDaoImp实例化后的对象,步骤有二:
首先,在DlServiceManage中声明dlDao,同时生成dlDao的setter方法,参考代码如下:
package org.service.imp;
import org.dao.DlDao;
import org.model.Dlb;
import org.service.DlService;
public class DlServiceManage implements DlService{
//对DlDao进行依赖注入
private DlDao dlDao;
public void setDlDao(DlDao dlDao) {
this.dlDao = dlDao;
}
public boolean existXh(String xh) {
return dlDao.existXh(xh);
}
public Dlb find(String xh, String kl) {
return dlDao.find(xh, kl);
}
public void save(Dlb user) {
dlDao.save(user);
}
}
其次,在Spring的配置文件中进行配置:
<bean id="dlService" class="org.service.imp.DlServiceManage">
<property name="dlDao">
<ref bean="dlDao"/>
</property>
</bean>
7、 对业务逻辑增加事务管理
采用BeanNameAutoProxyCreator,根据Bean Name自动生成事务代理的方式。参考代码:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- HibernateTransactionManager bean需要依赖注入一个SessionFactory bean的引用-->
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- 配置事务拦截器-->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<!-- 下面定义事务传播属性-->
<props>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator,该bean无需被引用,因此没有id属性,这个bean根据事务拦截器为目标bean自动创建事务代理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<!-- 下面是所有需要自动创建事务代理的bean-->
<list>
<value>xsService</value>
<value>kcService</value>
<value>cjService</value>
<value>zyService</value>
</list>
<!-- 此处可增加其他需要自动创建事务代理的bean-->
</property>
<!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<!-- 此处可增加其他新的Interceptor -->
</list>
</property>
</bean>
8、 实现表示层(Action类和JSP文件)
(1) 配置web.xml,增加Struts2的过滤器和Spring的监听器,参考代码如下:
<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>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
(2) 增加struts.properties文件,配置Struts2的Action交由Spring来管理,参考代码如下:
struts.objectFactory=spring
(3) 新建JSP页面和Action类,并在struts.xml和applicationContext.xml中配置。
以登录为例:
Action类参考代码:
package org.action;
import java.util.Map;
import org.model.Dlb;
import org.service.DlService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DlAction extends ActionSupport{
private DlService dlService;
private Dlb dl;
public Dlb getDl() {
return dl;
}
public void setDl(Dlb dl) {
this.dl = dl;
}
public DlService getDlService() {
return dlService;
}
public void setDlService(DlService dlService) {
this.dlService = dlService;
}
public String execute()throws Exception{
Dlb user=dlService.find(dl.getXh(), dl.getKl());
if(user!=null){
Map session=(Map)ActionContext.getContext().getSession();
session.put("user", user);
return SUCCESS;
}else
return ERROR;
}
}
struts.xml参考配置:
<action name="login" class="dlAction">
<result name="success">/login_success.jsp</result>
<result name="error">/login.jsp</result>
<result name="input">/login.jsp</result>
</action>
applicationContext.xml参考配置:
<bean id="dlAction" class="org.action.DlAction">
<property name="dlService">
<ref bean="dlService" />
</property>
</bean>
9、 部署运行
【Gjava人才】www.G java人才学习天堂
THANKS !!!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考
-可编辑修改-
展开阅读全文