学习使用idea搭建SSH框架,并实现一个简单的登录功能

学习使用idea搭建SSH框架,并实现一个简单的登录功能

Struts2和Hibernate是两个独立的框架,由于Spring提供了对象管理,切面编程等非常实用的功能,如果进行整合,将Struts2和Hibernate的对象交给Spring容器进行解耦合管理,不仅能大大增强系统的灵活性,便于功能的扩展,还能通过Spring提供的服务简化编码,减少开发工作量,提高开发效率。(需要注意的是:因为版本问题而引发的小问题不少,所以我们所采取的版本和所使用的类版本需要一致,这里我使用的是Spring-3.2,Struts2-2.3,Hibernate3,使用的数据库是oracle)

首先,附上一张项目结构图
学习使用idea搭建SSH框架,并实现一个简单的登录功能_第1张图片

实现Spring和Hibernate的整合

首先,在Spring配置文件中实现SessionFactory Bean的定义:
方式一:导入hibernate配置文件
可以使用Spring提供的LocalSessionFactoryBean,通过configLocation属性为其指定Hibernate配置文件的位置。

实例代码如下:

<!-Spring头文件信息省略-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	<property name="configLocation">
		<value>classpath:hibernate.cfg.xml<value>
	property>
bean>

方式二:可以将Hibernate的配置信息编写在Spring配置文件中,可以省去独立的Hibernate配置文件,有利于配置信息的集中处理。使用的是LocalSessionFactoryBean的子类:AnnotationSessionFactoryBean,这里我所配置的数据源是dbcp数据源,需要在项目添加commons-dbcp-1.4.jar和commons-pool-1.6.jar两个文件(具体的jar包就不放在这里了)
实例代码如下:


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
	<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
	<property name="username" value="数据库用户名"/>
	<property name="password" value="数据库密码"/>
bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	
	<property name="hibernateProperties">
		<props>
			<prop key="hibernate.dialect">
				org.hibernate.dialect.Oracle10gDialect
			prop>
			<prop key="hibernate.show_sql">trueprop>
            <prop key="hibernate.format_sql">trueprop>
		props>
	property>
	
    <property name="mappingDirectoryLocations">
		<list>
			<value>classpath:cn/cyan/entityvalue>
		list>
	property>
bean>

其次,使用Spring提供的模板类:HibernateTemplate来简化Hibernate DAO,为登录功能的实现简化了大量的编码过程
DAO的实现类需要继承Spring提供的HibernateDaoSupport类,该基类会提供setSessionFactory()方法,当通过这个setter方法注入SessionFactory Bean时,会自动创建HibernateTemplate实例,这样就可以直接使用getHibernateTemplate()方法了。
实例代码如下

//UserDao
public interface UserDao{
	//登录
	public List<User> login(String username,String password);
}

//UserDaoImpl:UserDao实现类/
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
	@Override
	public List<User> login(String username,String password){
		String hql = "from User where username=? and password = ?";
		return this.getHibernateTemplate().find(hql,username,password);
	}
}

Spring配置文件中也需要进行对Dao的配置
示例代码如下:


<bean id="userDao" class="cn.cyan.entity.UserDaoImpl">
	<property name="sessionFactory" ref="sessionFactory"/>
bean>

然后,编写业务层并添加事务
在Spring配置文件中编写事务:首先需要导入两个命名空间:tx和aop
配置事务管理器对象


<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory"/>
bean>
 
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        tx:attributes>
    tx:advice>
    
    <aop:config>
        
        <aop:pointcut id="pointcut" expression="execution(* cn.bdqn.biz..*.*(..))"/>
        
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    aop:config>

还需要添加业务层,实例代码如下:

//UserBiz业务类
public interface UserBiz{
	public List<User> login(String username,String password) throws Exception;
}

//UserBizImpl业务实现类
public class UserBizImpl implements UserBiz{
	private UserDao userDao;
	//封装
	public void setUserDao(UserDao userDao){
		this.userDao = userDao;
	}
	public UserDao getUserDao(){
		return userDao;
	}
	@Override
	public List<User> login(String username,String password){
		User user = null;  //新建实体类对象
		List<User> userList = userDao.login(username,password);
		Iterator<User> it = userList.iterator();
		if(it.hasNext()){
			user = it.next();
		}
		return user;
	}
}

Spring配置文件中也需要进行对业务类的配置
示例代码如下:


<bean id="userBiz" class="cn.cyan.entity.UserBizImpl">
	<property name="userDao" ref="userDao"/>
bean>

实现Spring和Struts2的整合

为了更好的利用Spring提供的IoC特性实现依赖注入,我们通常希望将Action,拦截器等Struts2框架的核心对象交给Struts2创建和处理,而将Action所依赖的业务对象交由Spring来管理,前面的配置已经将业务对象的创建和管理交给了Spring,而现在我们需要实现的就是在Struts2创建Action对象时,为其注入Spring管理的业务对象,从而达到整合Struts2和Spring的目的,因为Struts2在设计的时候就已将考虑过河Spring的整合问题,并且给出了解决方法,那就是为我们的项目加入一个jar包:struts2-spring-plugin-2.3.16.3.jar(因为这里用到的Struts2是2.3版本,jar包的版本也要相对应),这里有个需要注意的问题:Struts2提供的整合插件默认情况下会使用按名称匹配的方式来为Action自动注入业务Bean,所以在Action中创建的业务类实例的setter()方法需要和Spring中的相匹配

来做个总结版:在默认条件下实现Struts2和Spring的整合,只需要两个步骤:

  1. 在工程中添加struts2-spring-plugin-2.3.16.3.jar文件;
  2. 按照名称相匹配的原则定义业务Bean和Action类中的setter方法

现在来创建视图控制层Action类,实现用户登录

//Action类
public class UserLoginAction extends ActionSupport{
	private String username;
	private String password;
	private UserBiz userBiz;
	
	//登录
	public String login(){
		try{
			User user = userBiz.login(username,password);
			if(user != null){
				System.out.println("登录成功!");
				Map session = ActionContext.getContext().getSession();
				session.put("user",user);
				return SUCCESS;
			}else{
				return ERROR;
			}
		}catch(Exception e){
			e.printStackTrance();
			return ERROR;
		}
	}
	//注意userBiz的setter方法要和Spring配置文件中的业务Bean的名称相匹配
	//省略getter,setter方法

}

struts.xml文件中的相关配置


<action name="userAction" class="cn.cyan.action.UserLoginAction">
	<result name="success">loginsuccess.jspresult>
	<result name="error">loginerror.jspresult>
	<result name="input">login.jspresult>
action>

最后,进行jsp页面的一个创建

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="userAction" method="post">
    用户名:<input type="text" name="username"><s:fielderror fieldName="ename"/><br>
    密码:<input type="password" name="password"><s:fielderror fieldName="epwd"/><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

配置web.xml

我们需要在项目中的web.xml进行最后的一个关于SSH框架的配置

配置ContextLoaderListener
Spring需要启动容器才能为其他框架提供服务,所以我们需要配置一个监听器。实例代码如下:


<context-param>
	<param-name>contextConfigLocationparam-name>
	<param-value>classpath:applicationContext.xmlparam-value>
context-param>

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListenerlistener-class>
    listener>

配置OpenSessionInViewFilter
是一个过滤器,其作用是把一个Hibernate Session和一次完整的请求过程绑定,从请求开始时开启Session,请求结束时再关闭Session,这使得在一次请求的周期内,所使用的Session是唯一的,且一直保持着开启,解决了延迟加载等问题。是一个标准的Servlet Filter。
实例代码如下:


    <filter>
        <filter-name>openSessionInViewfilter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>openSessionInViewfilter-name>
        <url-pattern>*.actionurl-pattern>
    filter-mapping>

struts2的配置


    <filter>
        <filter-name>strutsfilter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>strutsfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

SSH框架搭建结语

好啦,关于SSH框架的基础搭建到这里就差不多了,加上tomcat运行到浏览器中,登录功能也差不多了,可以稳定的运行,并且性能良好,需要的jar包和提到的jar包就不在这里提了,一定要注意jar包是否被使用,因为idea这个软件的缓存功能非常强大,如果实在不行可以reBuild解决或者重新加入jar包。(个人经验)

关于SSH框架,Struts2主持交互,Hibernate负责的是数据持久化,Spring管理组件之间的依赖关系并提供事务管理等服务。是一个好的企业级开发架构。

有什么不足或者是描述错误的地方欢迎指正,谢谢大家指教和点赞!

你可能感兴趣的:(笔记,spring,java,ssh)