SSH框架的搭建
之前自己跟着大神们,把Spring MVC+Spring+Mybatis框架搭好了,觉得SSM框架挺好用的,方便、快捷开发。但是出来工作后,看到SSH才是必不可少的框架,不仅要会,还要非常熟练,
因为SSH框架是很多系统开发的最基础的框架。但是我以前却忘了巩固基础,今天突然心血来潮,也想自己搭建一个SSH框架来用用,进一步深入了解SSH框架。
首先要下载好搭建SSH框架需要的jar包:
1.Spring所需jar包
2.Struts2所需jar包(由于struts2.3.32以前的版本已出现多种漏洞,建议还是用较新的版本,以免日后还要填补漏洞,不断修改jar包)
3.Hibernate所需jar包
将这些jar包都导入到WEB-INF/lib下后就可以开始写配置文件了
(1)首先是web.xml的配置
1 <!-- 配置Spring的ContextLoaderListener监听器 --> 2 3 <listener> 4 5 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 6 </listener> 7 <context-param> 8 <param-name>contextConfigLocation</param-name> 9 <param-value>classpath:applicationContext*.xml</param-value> 10 </context-param> 11
<!-- session监听器 用于监听session,当session销毁时,把用户名从session列表中移除-->
<listener>
<listener-class>cn.mym.basic.listener.MyHttpSessionListener</listener-class>
</listener>
12 <!-- 配置Spring的OpenSessionInViewFilter过滤器,以解决Hibernate的懒加载异常(LazyInitializationException) --> 13 <filter> 14 <filter-name>OpenSessionInViewFilter</filter-name> 15 <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 16 </filter> 17 <filter-mapping> 18 <filter-name>OpenSessionInViewFilter</filter-name> 19 <url-pattern>*.action</url-pattern> 20 </filter-mapping> 21 <!-- 配置Struts2的过滤器 --> 22 <filter> 23 <filter-name>struts2</filter-name> 24 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 25 </filter> 26 <filter-mapping> 27 <filter-name>struts2</filter-name> 28 <url-pattern>/*</url-pattern> 29 </filter-mapping>
配置好web.xml后,开始分别配置spring、struts、hibernate
(1)spring的配置applicationContext.xml文件
<?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:context="http://www.springframework.org/schema/context" 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.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- 自动扫描与装配bean --> <context:component-scan base-package="cn.mym"></context:component-scan> <!-- Kaptcha验证码 --> <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha"> <property name="config"> <bean class="com.google.code.kaptcha.util.Config"> <constructor-arg> <props> <prop key="kaptcha.border">yes</prop> <prop key="kaptcha.border.color">150,150,150</prop> <prop key="kaptcha.textproducer.font.color">red</prop> <prop key="kaptcha.textproducer.font.size">22</prop> <prop key="kaptcha.image.width">70</prop> <prop key="kaptcha.image.height">24</prop> <prop key="kaptcha.textproducer.char.string">1234567890</prop> <prop key="kaptcha.textproducer.char.length">4</prop> <prop key="kaptcha.textproducer.font.names">新宋体</prop> <prop key="kaptcha.background.clear.from">white</prop> <prop key="kaptcha.noise.impl">com.google.code.kaptcha.impl.NoNoise</prop> <prop key="kaptcha.obscurificator.impl">com.google.code.kaptcha.impl.ShadowGimpy</prop> </props> </constructor-arg> </bean> </property> </bean> <!-- 配置SessionFactory(与Hibernate整合) --> <!-- 引入配置文件 --> <bean id="propertyConfigurer" class="cn.mym.basic.cfg.SpringPropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- <context:property-placeholder location="classpath:jdbc.properties" /> --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close"> <!-- 指定Hibernate的配置文件的位置 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 配置DataSource --> <property name="dataSource"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据库连接信息 --> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="user" value="${username}"></property> <property name="password" value="${password}"></property> <!-- 其他一些配置 --> <property name="initialPoolSize" value="${initialPoolSize}"></property> <property name="minPoolSize" value="${minPoolSize}"></property> <property name="maxPoolSize" value="${maxPoolSize}"></property> <property name="acquireIncrement" value="${acquireIncrement}"></property> <property name="maxStatements" value="${maxStatements}"></property> <property name="maxStatementsPerConnection" value="${maxStatementsPerConnection}"></property> <property name="maxIdleTime" value="${maxIdleTime}"></property> </bean> </property> </bean> <!-- 配置声明式事务,使用基于注解的方式 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
(1)struts的配置struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 设定为开发模式 --> <constant name="struts.devMode" value="false" /> <!-- 指定action的后缀 --> <constant name="struts.action.extension" value="action" /> <!-- 指定主题为simple --> <constant name="struts.ui.theme" value="simple" /> <package name="default" namespace="/" extends="struts-default,jasperreports-default"> <!-- 全局的result配置 --> <!-- 配置拦截器 --> <interceptors> <!-- 声明拦截器 --> <interceptor name="checkPrivilege" class="cn.mym.basic.interceptor.CheckPrivilegeInterceptor"></interceptor> <!-- 声明拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="checkPrivilege" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <!-- 默认本包中的所有action都要经过myStack这个拦截器栈 --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <!-- 全局的result配置 --> <global-results> <result name="loginUI">/WEB-INF/jsp/loginLogoutAction/loginUI.jsp</result> <result name="index">/WEB-INF/jsp/indexAction/index.jsp</result> <result name="privilegeError">/privilegeError.jsp</result> <result name="error" >/error.jsp</result> </global-results> <!-- 全局错误跳转 --> <global-exception-mappings> <exception-mapping exception="java.lang.NullPointerException" result="error" /> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings> <!-- Struts2与Spring整合后,class属性中写的是bean的名称 --> <action name="testAction" class="testAction"> <result name="success">/test.jsp</result> </action> <!-- 岗位管理 --> <action name="roleAction_*" class="roleAction" method="{1}"> <result name="list">/WEB-INF/jsp/roleAction/list.jsp</result> <result name="saveUI">/WEB-INF/jsp/roleAction/saveUI.jsp</result> <result name="setPrivilegeUI">/WEB-INF/jsp/roleAction/setPrivilegeUI.jsp</result> <result name="toList" type="redirectAction">roleAction_list</result>
</action>
</package>
</struts>
(3)hibernate的配置hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库信息 --> <property name="dialect"> org.hibernate.dialect.MySQL5InnoDBDialect </property> <!-- 其他配置 --> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <!-- 开启二级缓存. --> <property name="hibernate.cache.use_second_level_cache"> true </property> <!-- 指定二级缓存提供商 EhCacheProvider:此类仅仅是一个缓存的加载类. --> <property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </property> <!-- 启用查询缓存 --> <property name="cache.use_query_cache">true</property> <!-- 声明映射文件 --> <!-- 基本模块 --> <mapping resource="cn/mym/basic/domain/User.hbm.xml" /> <!-- 招生及收费管理系统模块 --> <mapping resource="cn/mym/scms/domain/Secondary.hbm.xml" /> <mapping resource="cn/mym/scms/domain/SecondaryCheck.hbm.xml" /> <class-cache usage="read-write" class="cn.mym.basic.domain.CodeType" /> </session-factory> </hibernate-configuration>
session监听类
public class MyHttpSessionListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent se) {//创建session } @SuppressWarnings("unchecked")//当session销毁时,移除登录名 public void sessionDestroyed(HttpSessionEvent se) { User user = (User) se.getSession().getAttribute("user"); Map<String,Object> userMap = (Map<String, Object>) se.getSession().getServletContext().getAttribute("userMap"); if(user!=null){ if(userMap.get(user.getLoginName())!=null){ userMap.remove(user.getLoginName()); } } } }
引入配置jdbc配置文件jdbc.properties的SpringPropertyPlaceholderConfigurer类
public class SpringPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException { String password = (String)props.get("password"); if (password != null) props.setProperty("password", SecurityUtils.decryptAES(password)); super.processProperties(beanFactoryToProcess, props); } }