在前面的两次博客中已经实现了使用Maven来搭建SSH框架,但是还没有测试所搭建的框架是否可行,现在将要简易测试所搭建的框架是否可用。这里将写一个简单的登录事件来测试struts2,spring和hibernate框架整合是否成功。
编写一个LoginAction类:
public class LoginAction extends BaseAction{
private SysUserService sysUserService;
private LoginService loginService;
/**
* 登录action
* @return
*/
public String login(){
String id=this.getStrParam("id");
String password=this.getStrParam("password");
String information=loginService.checkUser(id, password);
SysUser sysUser=sysUserService.getUserById(id);
if(information.equals("")){
return "success";
}else{
this.getRequest().setAttribute("info", information);
this.getRequest().setAttribute("url", "/mssh/login.jsp");
return "information";
}
}
//生成sysUserService的set方法
public void setSysUserService(SysUserService sysUserService) {
this.sysUserService=sysUserService;
}
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
}
LoginService类:
public class LoginService {
private SysUserService sysUserService;
/**
* 检测登录用户是否合法
* @param id
* @param password
* @return 检测结果,""表示用户可以合理登录
*/
public String checkUser(String id,String password){
SysUser sysUser=sysUserService.getUserById(id);
if(sysUser==null){
return "用户不存在,请检测账号.";
}
if(!sysUser.getPassword().equals(password)){
return "用户密码错误,请检查密码.";
}
return "";
}
public void setSysUserService(SysUserService sysUserService) {
this.sysUserService = sysUserService;
}
}
SysUserService类:
public class SysUserService {
private SysUserDao sysUserDao;
/**
*通过ID获得用户对象 ,如果不存在返回null
*/
public SysUser getUserById(String id){
return sysUserDao.get(id);
}
/**
* 保存用户
*/
public void saveUser(SysUser sysUser) {
sysUserDao.save(sysUser);
}
/**
* 通过用户ID删除用户,如果不存在改用户,则在控制台输出错误提示
*/
public void deleteUserById(String id){
SysUser sysUser=getUserById(id);
if(sysUser!=null){
sysUserDao.delete(sysUser);
}else{
System.out.println("##########该用户不存在,无法删除!##########");
}
}
public void setSysUserDao(SysUserDao sysUserDao) {
this.sysUserDao = sysUserDao;
}
}
SysUserDao类:
public class SysUserDao extends BaseGenericHibernateDao<SysUser, String>{
/**
* 保存用户
* @param sysUser:用户对象
*/
public void saveUser(SysUser sysUser){
this.save(sysUser);
}
/**
* 通过id删除用户对象,如果不存在改用户,则将打印错误信息在控制台
*/
public void deleteUser(SysUser sysUser){
this.delete(sysUser);
}
/**
* 通过id获得用户对象
*/
public SysUser getUser(String id){
return this.get(id);
}
}
这里需要注意,为了提高代码的可重用性,所以编写了一个BaseGenericHibernateDao类来与数据库进行交互,其他的所有Dao类只需要继承BaseGenericHibernateDao就可以了。可以想象,如果没有这么一个通用的类,那么我们每写一个实体,如果这个实体需要与数据库打交道,那么就要专门为它写一个Dao类。这样下来,如果这样的实体很多,那么重复的工作量就成倍增加了。
BaseGenericHibernateDao类:
public class BaseGenericHibernateDao<T, PK extends Serializable> extends HibernateDaoSupport{
/**
* 实体类类型(由构造方法自动赋值)
*/
private Class<T> entityClass;
/**
* 构造方法,根据实例类自动获取实体类类型
*/
public BaseGenericHibernateDao() {
this.entityClass = null;
Class c = getClass(); //获得类路径
Type t = c.getGenericSuperclass(); //获得该实体的直接父类
if (t instanceof ParameterizedType) {
Type[] p = ((ParameterizedType) t).getActualTypeArguments(); //获得超类的泛型参数的实际类型
this.entityClass = (Class<T>) p[0];
}
}
/**
* 根据主键获取实体。如果没有相应的实体,返回 null。
*/
public T get(PK id) {
try {
T t = (T) getHibernateTemplate().get(entityClass, id);
return t;
} catch (Exception e) {
return null;
}
}
/**
* 根据主键获取实体。如果没有相应的实体,抛出异常。
*/
public T load(PK id) {
return (T) getHibernateTemplate().load(entityClass, id);
}
/**
* 获取全部实体
*/
public List<T> loadAll() {
return (List<T>) getHibernateTemplate().loadAll(entityClass);
}
/**
* 保存用户
*/
public void save(T entity){
getHibernateTemplate().save(entity);
}
/**
* 删除对象对象实体
*/
public void delete(T entity){
getHibernateTemplate().delete(entity);
}
}
注意,这里采用的是通过继承HibernateDaoSupport类来使用Hibernate。
SysUser类:
public class SysUser {
/**
* 用户id
*/
private String id;
/**
* 用户姓名
*/
private String name;
/**
* 用户密码
*/
private String password;
public SysUser(String id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
public SysUser() {
super();
}
public String toString() {
return "SysUser [id=" + id + ", name=" + name + ", password=" + password + "]";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
再创建SysUser这个实体类之后,还需要在SysUser类的同一个目录下创建一个SysUser.hbm.xm来和数据库进行映射。
SysUser.hbm.xml配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zys.system.model">
<class name="SysUser" table="USER">
<id name="id" type="java.lang.String" column="ID" >
<generator class="assigned"/>
</id>
<!-- 实体类的属性 -->
<property name="name" column="NAME"/>
<property name="password" column="PASSWORD"/>
</class>
</hibernate-mapping>
接下来,还需要在Spring的application.xml配置文件中配置给sysUserdao,sysUserService,loginService注入对象,可以看到,在前面的几个类中调用了这几个对象的set方法,这个set方法就是用来获取Spring给我们创建的相关对象的,这样就减小了类之间的耦合度。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-autowire="byName">
<bean id="sysUserService" class="com.zys.system.service.SysUserService"></bean>
<bean id="sysUserDao" class="com.zys.system.dao.SysUserDao"></bean>
<bean id="loginService" class="com.zys.system.service.LoginService"></bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/csuft_news"></property>
<property name="username" value="root"></property>
<property name="password" value="zengyongsheng"></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="annotatedClasses">
<list>
<value>com.zys.system.model.SysUser</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="mappingLocations">
<list>
<value>classpath:/com/zys/system/**/model/*.hbm.xml</value>
</list>
</property>
</bean>
</beans>
最后,还需要在struts.xml中进行相应的配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="login" class="com.zys.system.action.LoginAction" method="login">
<result name="success">/system/frame.jsp</result>
<result name="information">/information.jsp</result>
</action>
</package>
</struts>
接下来将测试运行的结果,在数据库中已经准备了一条数据。
首先是登录界面:
用户不存在的情形:
密码错误情形:
登录成功情形:
SSH框架搭建到这里,已经基本可以使用了,但是相关配置文件还是显得十分臃肿,下次将把一些配置文件细节稍微介绍,同时优化下配置文件的书写。