【SSH】S2SH框架搭建

本文详细介绍了如何使用S2SH框架整合完成一个简单的登录功能,包括开发环境搭建、Struts2、Spring、Hibernate的配置以及相关组件的整合步骤。重点展示了如何在前端页面实现用户输入验证和后端的登录逻辑处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  本demo实现的是一个简单的登陆功能。

1、开发环境

MyEclipse 10+JDK1.6+Tomact7+Struts 2.3.28.1+Spring 2.0.8+Hibernate 3.2.0

2、准备工作

新建一个web项目,并下载相应的jar包。

引入的所有jar包:

注:如果出现包冲突现象,留下高版本。

3、搭建Struts2

 1)引入jar包:asm-3.3.jar

               commons-fileupload-1.3.1.jar

               commons-io-2.2.jar

               commons-lang3-3.2.jar

               freemarker-2.3.22.jar

               javassist-3.11.0.GA.jar

              log4j-api-2.3.jar

              ognl-3.0.14.jar

              struts2-core-2.3.28.1.jar

              xword-core-2.3.28.1.jar  

 

2)在Web.xml中配置struts2

<span style="font-family:KaiTi_GB2312;font-size:18px;"><!--配置struts2 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>		<!--设置过滤 -->
	</filter-mapping></span>
 3) 从struts2压缩包中拷贝出一个struts.xml文件放置src目录下。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- 设置成开发模式,开启它则默认开启了i18n.reload、configuration.xml.reload -->
	<constant name="struts.devMode" value="true" />
	
	<!--把扩展名配置为action -->
	<constant name="struts.action.extension" value="action" />
	
	<!--把主题配置为simple -->
	<constant name="struts.ui.theme" value="simple" />
	
	<!-- 将Action的创建交给spring来管理 -->  
  	<constant name="struts.objectFactory" value="spring" /> 
  	
  	

	<!--一个package可以包含多个action,一个Struts可以包含多个package -->
	<!--package起到分类的作用,支持继承 -->
	<package name="struts2" extends="struts-default">

		<!--方法一 -->
		<!-- <action name="login" class="com.jmj.struts2.LoginAction"> <result 
			name="success">/main.jsp</result> <result name="input">/login.jsp</result> 
			</action> -->

		<!-- 方法二 -->
		<!--class值设为了loginAction,即LoginAction类的bean的ID。这样我们就把LoginAction类交给了spring管理。 -->
		<action name="login" class="loginAction">
			<result name="success">/main.jsp</result>
			<result name="input">/login.jsp</result>
		</action>
	</package>
</struts>
</span>

4、 搭建Spring

1)引入的jar包:spring.jar

               log4j-1.2.14.jar                         

               commons-logging.jar 

2)在src下建立application.xml文件

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	

	<!-- Spring整合Hibernate主要是对hibernate的Session进行管理,包含Session的创建、提交、关闭的整个生命周期。 -->
	<!--配置sessionFactory,让spring来创建Session -->
	<!--我们原来是用HibernateSessionFactory.java来创建Session的,现在删除即可, 交给Spring创建。这里,创建了一个Session工厂类的Bean,其ID为“sessionFactory”。 -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
	</bean>

	<!-- 配置事务管理器 -->
	<!--这里创建了一个id为transactionManager的事务管理器,它匹配一个session工厂, <ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID。 -->
	 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	 	<property name="sessionFactory" ref="sessionFactory"/>
	 </bean>

	<!--对事务管理器进行事务设置 -->
	<!--这里创建了一个advice(通知),对事务管理器进行事务设置,这里意思是指,对于以save、del、update开头的方法应用事务。 -->
	<tx:advice id="smAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>

	<!-- 把事务应用到具体类 -->
	<!-- <aop:config>

		<aop:pointcut id="smMethod" expression="execution(*test.service.impl.*.*(..))" />

		<aop:advisor pointcut-ref="smMethod" advice-ref="smAdvice" />

	</aop:config> -->
	
	<!--注入sessionFactory -->
	<bean id="userDao" class="com.jmj.hibernate.UserDaoImpl" scope="singleton">
		<!-- 由于该类是继承于HibernateDaoSupport,所以需要将sessionFactory注入 -->
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!--注入userDao -->
	<bean id="userManager" class="com.jmj.spring.UserManagerImpl">
		<property name="userDao" ref="userDao" />
	</bean>

	<!--写action和业务逻辑层依赖注入 -->
	<!--将scope设置成prototype,预防了线程安全问题 -->
	<!--注入userManger -->
	<bean id="loginAction" class="com.jmj.struts2.LoginAction" scope="prototype">
		<property name="userManager" ref="userManager" />
	</bean>
	
	
</beans>
</span>

3)在web.xml中添加对application.xml文件的引用

<span style="font-family:KaiTi_GB2312;font-size:18px;"><!--配置applicationContext.xml -->
	<!-- * 从类路径下加载spring的配置文件, 多个配置文件可以用逗号和空格区分 * classpath: 关键字特指类路径下加载 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param></span>

5、搭建Hibernate

1)引入的jar包:Hibernate3.jar

               dom4j-1.6.1.jar

               commons-logging-1.0.4.jar

               commons-collections-2.1.1.jar

               cglib-nodep-2.2.3.jar

               jta.jar

               asm.jar

               antlr-2.7.6.jar:hibernate执行hql语句

2)在src目录下,建立hibernate.cfg.xml文件,配置数据库连接和hibernate与数据库对象的关系映射文件。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<!-- 连接数据库配置 -->
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- hibernate_first为你的数据库名称 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/s2sh_user</property>
		<property name="hibernate.connection.username">用户名</property>
		<property name="hibernate.connection.password">密码</property>
		<!-- 配置适配器 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 打印sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化sql语句 -->
		<property name="hibernate.format_sql">true</property>
		
		 <!-- validate 加载hibernate时,验证创建数据库表结构 -->
        <!-- create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。 -->
         <!-- create-drop 加载hibernate时创建,退出是删除表结构 -->
         <!-- update 加载hibernate自动更新数据库结构 -->
         
		<!-- hibernate与数据库的对象关系映射文件**.hbm.xml -->
		<mapping resource="/com/jmj/domain/User.hbm.xml"/>
		
		
	</session-factory>
</hibernate-configuration></span>
3)建立对象关系映射文件:User.hbm.xml

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	
<hibernate-mapping>
	<class name="com.jmj.domain.User" table="t_user">
		<id name="id" >
			<generator class="uuid"></generator>
		</id>
		<property name="username"/>
		<property name="password"></property>
	</class>
</hibernate-mapping></span>

6、整合S2SH框架

1)引入的jar包:struts2-spring-plugin-2.3.28.1.jar  -----struts2和spring整合的jar包

                mysql-connector-jar-3.1.13-bin.jar:mysql数据库驱动

2)在web.xml文件中,加入监听

<span style="font-family:KaiTi_GB2312;font-size:18px;"><listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener></span>
3)其他部分的代码详解

UserDaoImpl.java:

<span style="font-family:KaiTi_GB2312;font-size:18px;">/**  
 * @Title: UserDaoImpl.java
 * @Package com.jmj.hibernate
 * @Description: TODO
 * @author meng
 * @date 2016-5-17 下午7:46:27
 */
package com.jmj.hibernate;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.jmj.domain.User;

/**
 * ClassName: UserDaoImpl
 * 
 * @Description: TODO
 * @author meng
 * @date 2016-5-17 下午7:46:27
 */
public class UserDaoImpl
		extends
		HibernateDaoSupport
		implements
		UserDao
{
	@SuppressWarnings({ "unused",
			"rawtypes" })
	public boolean findUserByUserName(
			String username,String password)
	{
		List list=this.getHibernateTemplate().find("from User u where u.username=? and password=?",new String[]{username,password});
		
		if (null==list|| list.isEmpty())
		{
			return false;
		}
		
		return true;
		//删除、添加、更新用户
		/*this.getHibernateTemplate().delete(user)    
		save(user)
		update(user)*/

	}

}
</span>
UserManagerImpl.java

<span style="font-family:KaiTi_GB2312;font-size:18px;">/**  
 * @Title: UserManagerImpl.java
 * @Package com.jmj.spring
 * @Description: TODO
 * @author meng
 * @date 2016-5-17 上午11:46:23
 */
package com.jmj.spring;

import java.util.List;

import com.jmj.domain.User;
import com.jmj.hibernate.UserDao;

/**
 * ClassName: UserManagerImpl
 * @Description: TODO
 * @author meng
 * @date 2016-5-17 上午11:46:23
 */
public class UserManagerImpl
		implements
		UserManager
{
	private UserDao userDao;

	
	public UserDao getUserDao()
	{
		return userDao;
	}


	public void setUserDao(
			UserDao userDao)
	{
		this.userDao = userDao;
	}


	/* (non-Javadoc)
	 * @see com.jmj.spring.UserManager#findUser(java.lang.String, java.lang.String)
	 */
	public boolean findByUserName(String username,String password){
		if(this.userDao.findUserByUserName(username,password))
		{
			return true;
		}
		
		return false;
	}

}
</span>
LoginAction.java

<span style="font-family:KaiTi_GB2312;font-size:18px;">/**  
 * @Title: LoginAction.java
 * @Package com.jmj.struts
 * @Description: TODO
 * @author meng
 * @date 2016-5-17 上午10:24:44
 */
package com.jmj.struts2;

import java.util.Map;

import com.jmj.domain.User;
import com.jmj.spring.UserManager;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * ClassName: LoginAction
 * @Description: 登陆Action
 * @author meng
 * @date 2016-5-17 上午10:24:44
 */
public class LoginAction
		extends
		ActionSupport
{
	private User user;
	
	public User getUser()
	{
		return user;
	}

	public void setUser(
			User user)
	{
		this.user = user;
	}

	private UserManager userManager;
	
	public UserManager getUserManager()
	{
		return userManager;
	}

	public void setUserManager(
			UserManager userManager)
	{
		this.userManager = userManager;
	}

	@Override
	public String execute()
			throws Exception
	{
		if(userManager.findByUserName(user.getUsername(),user.getPassword())){
			return SUCCESS;
		}
		
		return INPUT;
	}

	@Override
	public void validate()
	{
		if (user.getUsername()==null || user.getUsername().length()==0)
		{
			super.addActionError("用户名不能为空!");
		}
		if (user.getPassword()==null||user.getPassword().length()==0)
		{
			super.addActionError("密码不能为空!");
		}
	}
}
</span>
User.java

<span style="font-family:KaiTi_GB2312;font-size:18px;">/**  
 * @Title: User.java
 * @Package com.jmj.hibernate
 * @Description: TODO
 * @author meng
 * @date 2016-5-17 上午11:38:31
 */
package com.jmj.domain;

/**
 * ClassName: User
 * @Description: TODO
 * @author meng
 * @date 2016-5-17 上午11:38:31
 */
public class User
{
	private String id;
	
	private String username;
	
	private String password;

	public String getId()
	{
		return id;
	}

	public void setId(
			String id)
	{
		this.id = id;
	}

	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;
	}
	
}
</span>
JSP页面:

login.jsp

<span style="font-family:KaiTi_GB2312;font-size:18px;"><form action="login.action">
        <!--此种方式是action中有相应的属性  -->
        <%-- 用户名:<s:textfield name="username"/><br>
        密码:<s:password name="password"/><br>
        <s:submit value="提交"/> --%>
        
        <!--此种方式是action中引用model  -->
        用户名:<s:textfield name="user.username"/><br>
        密码:<s:password name="user.password"/><br>
        <s:submit value="提交"/>
        
        <!-- 用户名:<input type="text" name="username"><br>
        密  码:<input type="password" name="password"><br>
        <input type="submit" value="登陆"> -->
    </form>
</span>

main.jsp

<span style="font-family:KaiTi_GB2312;font-size:18px;">欢迎【<s:property value="user.username"/>】登陆!</span>

知识拓展:

   在action 里面定义要接收的参数,并提供相应的setter,getter,则Jsp页面可以直接使用此属性名;而在action中引用model层的模型,保存其对象,则jsp页面中需要使用“对象.属性名”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值