SSH整合

来源:互联网 发布:淘宝卖家怎么删除订单 编辑:程序博客网 时间:2024/06/05 11:02

引言:相比较springboot亦或是比较传统的ssm,ssh实在太重,做一次总结


关于这次整合,主要将一些配置整合,常用框架,常用工具包,常用dao封装等

下载地址https://pan.baidu.com/s/1pL40Bvt

一.配置文件

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: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.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 加载属性文件 --><context:property-placeholder location="classpath:db.properties"/><!-- 配置数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}"/><property name="jdbcUrl" value="${jdbc.jdbcUrl}"/><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean> <!-- 配置LocalSessionFactoryBean,spring提供的用于整合hibernate的工厂bean --><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 注入hibernate相关的属性配置 --><!-- <property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop><prop key="hibernate.hbm2ddl.auto">update</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop></props></property>注入hibernate的映射文件<property name="mappingLocations"><list><value>classpath:com/pojo/*.xml</value></list></property> --> <property name="configLocation" value="classpath:hibernate.cfg.xml"/>          <!-- 自动扫描注解方式配置的hibernate类文件 -->          <property name="packagesToScan">              <list>                  <value>com.wpx.pojo</value>              </list>          </property>  </bean><!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"/></bean>  <!-- 配置事务通知属性 -->      <tx:advice id="txAdvice" transaction-manager="transactionManager">          <!-- 定义事务传播属性 -->          <tx:attributes>              <tx:method name="insert*" propagation="REQUIRED" />              <tx:method name="update*" propagation="REQUIRED" />              <tx:method name="edit*" propagation="REQUIRED" />              <tx:method name="save*" propagation="REQUIRED" />              <tx:method name="add*" propagation="REQUIRED" />              <tx:method name="new*" propagation="REQUIRED" />              <tx:method name="set*" propagation="REQUIRED" />              <tx:method name="remove*" propagation="REQUIRED" />              <tx:method name="delete*" propagation="REQUIRED" />              <tx:method name="change*" propagation="REQUIRED" />              <tx:method name="get*" propagation="REQUIRED" read-only="true" />              <tx:method name="find*" propagation="REQUIRED" read-only="true" />              <tx:method name="load*" propagation="REQUIRED" read-only="true" />              <tx:method name="*" propagation="REQUIRED" read-only="true" />          </tx:attributes>      </tx:advice>        <!-- 配置事务切面 -->      <aop:config>          <aop:pointcut id="serviceOperation"              expression="execution(* com.wpx.service.*.*(..))" />          <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />      </aop:config>  <!-- 组件扫描 --><context:component-scan base-package="com.wpx"/><!-- 支持spring注解 --><context:annotation-config/><tx:annotation-driven/><!-- 配置shiro框架的过滤器工厂对象 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- 注入安全管理器对象 --><property name="securityManager" ref="securityManager"/><!-- 注入相关页面访问URL --><property name="loginUrl" value="/login.jsp"/><property name="successUrl" value="/index.jsp"/><property name="unauthorizedUrl" value="/unauthorized.jsp"/><!--注入URL拦截规则 --><property name="filterChainDefinitions"><value>/css/** = anon/js/** = anon/images/** = anon/validatecode.jsp* = anon/login.jsp = anon/userAction_login.action = anon/* = authc</value></property></bean><!-- 注册安全管理器对象 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="realm" ref="bosRealm"/><!-- 注入缓存管理器 --><property name="cacheManager" ref="cacheManager"/></bean><!-- 注册缓存管理器 --><bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"><!-- 注入ehcache的配置文件 --><property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/></bean><!-- 注册realm --><bean id="myRealm" class="com.wpx.utils.MyRealm"></bean><!-- 开启shiro框架注解支持 --><bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"><!-- 必须使用cglib方式为Action对象创建代理对象 --><property name="proxyTargetClass" value="true"/></bean><!-- 配置shiro框架提供的切面类,用于创建代理对象 --><bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/><!-- 注册自定义作业类 --><bean id="myJob" class="com.wpx.job.MailJob"><property name="username" value="1256317570@qq.com"/><property name="password" value="123456"/><property name="smtpServer" value="smtp.126.com"/></bean><!-- 配置JobDetail --><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 注入目标对象 --><property name="targetObject" ref="myJob"/><!-- 注入目标方法 --><property name="targetMethod" value="execute"/></bean><!-- 配置触发器 --><bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- 注入任务详情对象 --><property name="jobDetail" ref="jobDetail"/><!-- 注入cron表达式,通过这个表达式指定触发的时间点 --><property name="cronExpression"><value>0/5 * * * * ?</value></property></bean><!-- 配置调度工厂 --><bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><!-- 注入触发器 --><property name="triggers"><list><ref bean="myTrigger"/></list></property></bean></beans>
db.properties

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql:///jdbc.user=rootjdbc.password=root


ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">    <diskStore path="java.io.tmpdir"/>    <defaultCache            maxElementsInMemory="10000"            eternal="false"            timeToIdleSeconds="120"            timeToLiveSeconds="120"            overflowToDisk="true"            maxElementsOnDisk="10000000"            diskPersistent="false"            diskExpiryThreadIntervalSeconds="120"            memoryStoreEvictionPolicy="LRU"            /></ehcache>
hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>  <!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.MySQL5Dialect</property>          <property name="show_sql">true</property>          <property name="hbm2ddl.auto">update</property>    </session-factory>  </hibernate-configuration>

log4j.properties

### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.errlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=d:/mylog.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=info, stdout
struts.xml

<?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><constant name="struts.devMode" value="false" /><constant name="struts.objectFactory" value="spring"/><package name="basicstruts2" extends="struts-default"><interceptors><!-- 注册自定义拦截器 --><interceptor name="loginInterceptor" class="com.wpx.web.interceptor.LoginInterceptor"><param name="excludeMethods">login</param></interceptor><!-- 自定义拦截器栈 --><interceptor-stack name="myStack"><interceptor-ref name="loginInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><default-interceptor-ref name="myStack"/><!-- 全局结果集定义 --><global-results><result name="login">/login.jsp</result></global-results><!-- 需要进行权限控制的页面访问 --><action name="page_*_*"><result type="dispatcher">/WEB-INF/pages/{1}/{2}.jsp</result></action></package></struts>


二.Dao层

BaseDao.java

package com.wpx.dao.basedao;import java.io.Serializable;import java.util.List;import com.wpx.utils.PageBean;public interface BaseDao<T> {/** * 保存一个对象 *  * @param o * @return */public Serializable save(T o);/** * 删除一个对象 *  * @param o */public void delete(T o);/** * 更新一个对象 *  * @param o */public void update(T o);/** * 保存或更新对象 *  * @param o */public void saveOrUpdate(T o);/** * 合并对象 * @param o */public void merge(T o);/** * 查询 *  * @param hql * @return */public List<T> find(String hql);/** * 查询集合 *  * @param hql * @param param * @return */public List<T> find(String hql, Object[] param);/** * 查询集合 *  * @param hql * @param param * @return */public List<T> find(String hql, List<Object> param);/** * 查询集合(带分页) *  * @param hql * @param param * @param page *            查询第几页 * @param rows *            每页显示几条记录 * @return */public List<T> find(String hql, Object[] param, PageBean pageBean);/** * 查询集合(带分页) *  * @param hql * @param param * @param page * @param rows * @return */public List<T> find(String hql, List<Object> param, PageBean pageBean);/** * 获得一个对象 *  * @param c *            对象类型 * @param id * @return Object */public T get(Class<T> c, Serializable id);/** * 获得一个对象 *  * @param hql * @param param * @return Object */public T get(String hql, Object[] param);/** * 获得一个对象 *  * @param hql * @param param * @return */public T get(String hql, List<Object> param);/** * select count(*) from 类 *  * @param hql * @return */public Long count(String hql);/** * select count(*) from 类 *  * @param hql * @param param * @return */public Long count(String hql, Object[] param);/** * select count(*) from 类 *  * @param hql * @param param * @return */public Long count(String hql, List<Object> param);/** * 执行HQL语句 *  * @param hql * @return 响应数目 */public Integer executeHql(String hql);/** * 执行HQL语句 *  * @param hql * @param param * @return 响应数目 */public Integer executeHql(String hql, Object[] param);/** * 执行HQL语句 *  * @param hql * @param param * @return */public Integer executeHql(String hql, List<Object> param);/** * 执行SQL语句 * @param sql * @return */public Integer executeSql(String sql);}
BaseDaoImpl.java

package com.wpx.dao.basedao;import java.io.Serializable;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.wpx.utils.PageBean;public class BaseDaoImpl<T> implements BaseDao<T>{private SessionFactory sessionFactory;public SessionFactory getSessionFactory() {return sessionFactory;}@Autowiredpublic void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}private Session getCurrentSession() {return sessionFactory.getCurrentSession();}public Serializable save(T o) {return this.getCurrentSession().save(o);}public void delete(T o) {this.getCurrentSession().delete(o);}public void update(T o) {this.getCurrentSession().update(o);}public void saveOrUpdate(T o) {this.getCurrentSession().saveOrUpdate(o);}public List<T> find(String hql) {return this.getCurrentSession().createQuery(hql).list();}public List<T> find(String hql, Object[] param) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.length > 0) {for (int i = 0; i < param.length; i++) {q.setParameter(i, param[i]);}}return q.list();}public List<T> find(String hql, List<Object> param) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.size() > 0) {for (int i = 0; i < param.size(); i++) {q.setParameter(i, param.get(i));}}return q.list();}public List<T> find(String hql, Object[] param, PageBean pageBean) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.length > 0) {for (int i = 0; i < param.length; i++) {q.setParameter(i, param[i]);}}return q.setFirstResult(pageBean.getStart()).setMaxResults(pageBean.getPageSize()).list();}public List<T> find(String hql, List<Object> param, PageBean pageBean) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.size() > 0) {for (int i = 0; i < param.size(); i++) {q.setParameter(i, param.get(i));}}return q.setFirstResult(pageBean.getStart()).setMaxResults(pageBean.getPageSize()).list();}public T get(Class<T> c, Serializable id) {return (T) this.getCurrentSession().get(c, id);}public T get(String hql, Object[] param) {List<T> l = this.find(hql, param);if (l != null && l.size() > 0) {return l.get(0);} else {return null;}}public T get(String hql, List<Object> param) {List<T> l = this.find(hql, param);if (l != null && l.size() > 0) {return l.get(0);} else {return null;}}public Long count(String hql) {return  (Long) this.getCurrentSession().createQuery(hql).uniqueResult();}public Long count(String hql, Object[] param) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.length > 0) {for (int i = 0; i < param.length; i++) {q.setParameter(i, param[i]);}}return (Long) q.uniqueResult();}public Long count(String hql, List<Object> param) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.size() > 0) {for (int i = 0; i < param.size(); i++) {q.setParameter(i, param.get(i));}}return (Long) q.uniqueResult();}public Integer executeHql(String hql) {return this.getCurrentSession().createQuery(hql).executeUpdate();}public Integer executeHql(String hql, Object[] param) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.length > 0) {for (int i = 0; i < param.length; i++) {q.setParameter(i, param[i]);}}return q.executeUpdate();}public Integer executeHql(String hql, List<Object> param) {Query q = this.getCurrentSession().createQuery(hql);if (param != null && param.size() > 0) {for (int i = 0; i < param.size(); i++) {q.setParameter(i, param.get(i));}}return q.executeUpdate();}public void merge(T o) {// TODO Auto-generated method stubthis.getCurrentSession().merge(o);}public Integer executeSql(String sql) {Query q = this.getCurrentSession().createSQLQuery(sql);return q.executeUpdate();}}
UserDao.java
package com.wpx.dao;import com.wpx.dao.basedao.BaseDao;import com.wpx.pojo.User;public interface UserDao extends BaseDao<User>{public User findUserByUsernameAndPassword(String username, String password);}

UserDaoImpl.java
package com.wpx.dao;import java.util.List;import com.wpx.dao.basedao.BaseDaoImpl;import com.wpx.pojo.User;public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{public User findUserByUsernameAndPassword(String username, String password) {String hql = "FROM User u WHERE u.username = ? AND u.password = ?";List<User> list = this.find(hql, new String[]{"username","password"});if(list != null && list.size() > 0){return list.get(0);}return null;}}
三.Service层

UserService.java

package com.wpx.service;import com.wpx.pojo.User;public interface UserService {public User findUserByUsernameAndPassword(String username, String password);}

UserServiceImpl.java

package com.wpx.service.impl;import javax.annotation.Resource;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.wpx.dao.UserDao;import com.wpx.pojo.User;import com.wpx.service.UserService;@Service@Transactionalpublic class UserServiceImpl implements UserService{@Resourceprivate UserDao userDao;public User findUserByUsernameAndPassword(String username, String password) {return userDao.findUserByUsernameAndPassword(username, password);}}

四.web层

BaseAction.java

package com.wpx.web.action;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;/** * 表现层通用实现 * @author wangpx * * @param <T> */public class BaseAction<T> extends ActionSupport implements ModelDriven<T>{protected T model;public T getModel() {return model;}//通过构造方法  动态获取实体类型,通过反射创建model对象public BaseAction() {ParameterizedType genericSuperclass=(ParameterizedType) this.getClass().getGenericSuperclass();//获得BaseAction上声明的泛型数组Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();Class<T> entityClass = (Class<T>) actualTypeArguments[0];//通过反射来创建对象try {model=entityClass.newInstance();} catch (Exception e) {new RuntimeException("通过反射创建对象异常");e.printStackTrace();}}}

UserAction.java

package com.wpx.web.action;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import com.wpx.pojo.User;/** * 用户控制层 * @author wangpx * */@Controller@Scope("prototype")public class UserAction extends BaseAction<User>{}

UserAction-validation.xml

<!DOCTYPE validators PUBLIC"-//Apache Struts//XWork Validator 1.0.3//EN""http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"><validators><field name="userName"><field-validator type="requiredstring"><message>用户名不能为空</message></field-validator><field-validator type="stringlength"><param name="maxLength">12</param><param name="minLength">3</param><message>用户名长度必须在${minLength}到${maxLength}之间</message></field-validator></field><field name="password"><field-validator type="requiredstring"><message>密码不能为空</message></field-validator></field></validators>

LoginInterceptor.java

package com.wpx.web.interceptor;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.ActionProxy;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;import com.wpx.pojo.User;/** * 自定的拦截器 * MethodFilterInterceptor好处可以指定对某些请求不做拦截 * @author wangpx * */public class LoginInterceptor extends MethodFilterInterceptor{@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception {//ActionProxy proxy = invocation.getProxy();//String actionName = proxy.getActionName();//String namespace = proxy.getNamespace();//System.out.println(actionName+namespace);User user = (User) ServletActionContext.getRequest().getSession().getAttribute("currentUser");if(user == null){return "login";}return invocation.invoke();}}

五.Pojo

User.java

package com.wpx.pojo;import java.io.Serializable;/** * 用于用户登录 * @author wangpx * */public class User implements Serializable{private Integer id;private String userName;private String password;public Integer getId() {return id;}public void setId(Integer 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;}public User() {}public User(String userName, String password) {this.userName = userName;this.password = password;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", password=" + password + "]";} }

User.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="com.itheima.bos.domain.User" table="t_user">        <id name="id" type="java.lang.String">            <column name="id" length="32" />            <generator class="uuid" />        </id>        <property name="username" type="java.lang.String">            <column name="username" length="20" not-null="true" />        </property>        <property name="password" type="java.lang.String">            <column name="password" length="32" not-null="true" />        </property>      </class>    <query name="user.editpassword">    UPDATE User SET password = ? WHERE id = ?    </query></hibernate-mapping>

六.job,工具类

MailJob.java

package com.wpx.job;import java.util.Date;/** * 定时任务 * 发送邮件 * @author wangpx * */public class MailJob {public void execute() {System.out.println("要发邮件了。。。" + new Date());}}
MyRealm.java
package com.wpx.utils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;/** * 自定义Realm * @author wangpx * */public class MyRealm extends AuthorizingRealm{/** * 为当前的登录的用户角色和权限 */@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { return null;}/** * 验证当前登录的用户 */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { return null;}}
PageBean.java

package com.wpx.utils;/** * 用于分页 * @author wangpx * */public class PageBean {private int start;private int page;private int pageSize;public int getStart() {return (page-1)*pageSize;}public void setStart(int start) {this.start = start;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}}
DES.java

package com.wpx.utils;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;/** * DES加密工具类 * @author wangpx */public class DES {public static String encryptDES(String encryptString, String encryptKey) throws Exception {SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedData = cipher.doFinal(encryptString.getBytes());return Base64.encodeBase64String(encryptedData);}public static String decryptDES(String decryptString, String decryptKey) throws Exception {byte[] byteMi = Base64.decodeBase64(decryptString);SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, key);byte decryptedData[] = cipher.doFinal(byteMi);return new String(decryptedData);}public static void main(String[] args) throws Exception {}}








原创粉丝点击