Jar包

aaarticlea/png;base64,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" alt="" />

----------------------------------------------------Spring配置---------------------------------

applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- 0.连接池属性设置读取指定的properties文件 -->
<context:property-placeholder location="classpath:db.properties" /> <!-- 1.将连接池放入spring容器 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!--2. 配置 Mybatis的会话工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置Mybatis的核心 配置文件所在位置 -->
<property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml" />
</bean> <!-- 3.1 mapper代理配置方法一 这种方法需要大量重复的配置代理对象
MapperFactoryBean:根绝mapper接口生成代理对象 <bean id="selectUser" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="cn.qlq.core.dao.SelectUser"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
--> <!-- 3.2通过MapperScannerConfigurer扫描进行批量生成代理对象
遵循规范:mapper.java和mapper.xml名字一样且在同一个目录下
自动扫描出来的代理对象的id为mapper类类名(首字母小写)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的包名,如果有多个,用半角逗号分隔 -->
<property name="basePackage" value="cn.qlq.mapper"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean> <!-- 4.配置事务管理器 -->
<!-- 事务核心管理器,封装了事务操作,依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 5.开启注解管理aop事务 -->
<tx:annotation-driven/> <!-- 事务模板对象,依赖于事务核心管理器 -->
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean> <!-- ················开始使用XML管理事务························ -->
<!-- 配置事务通知(无论哪种方式都要用到事务的核心管理器)-->
<tx:advice transaction-manager="transactionManager" id="firstTx">
<tx:attributes>
<!--以方法为单位,指定方法应用事务什么属性
isolation:隔离级别
read-only:只读属性
propagation:传播行为
-->
<!-- 企业中运用通配符命名规则。两套增删改查(8种) -->
<tx:method name="save*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="persist*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="delete*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="remove*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="update*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="modify*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="get*" isolation="DEFAULT" read-only="true" propagation="REQUIRED"/>
<tx:method name="find*" isolation="DEFAULT" read-only="true" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice> <!-- 配置织入 -->
<aop:config>
<!-- 配置切点表达式 -->
<aop:pointcut expression="execution(* cn.qlq.Service.*ServiceImpl.*(..))" id="texPc"/>
<!-- 配置切面:切点+通知
advice-ref:通知名称
pointcut-ref:切点名称
-->
<aop:advisor advice-ref="firstTx" pointcut-ref="texPc"/>
</aop:config>
</beans>

applicationContext-action.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" 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-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- 与struts2整合的配置 -->
<context:component-scan base-package="cn.qlq.Action"></context:component-scan> </beans>

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!--4.注解扫描service -->
<!-- 4.开启组件自动扫描,也就是启用注解。前提是导入spring-context-3.2.xsd约束和引入新的命名空间,注解扫描service出错了 --> <context:component-scan base-package="cn.qlq.service"></context:component-scan> </beans>

----------------------------------------Mybatis配置----------------------------------------------------

sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- 只需要定义个别名,这个应该有-->
<!-- <typeAliases >
<package name="cn.qlq.mapper"/>
</typeAliases>
动态代理也不需要配置这个扫描,留着也行
<mappers>
原始DAO开发使用这个手动加载xml
<package name="cn.xm.mapper"/>
</mappers> --> </configuration>

----------------------------------------Struts配置----------------------------------------------

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="true" />
<!-- 错误处理页面,其他配置文件可以继承这个package -->
<package name="default" namespace="/" extends="struts-default">
<!-- 全局结果集,所有action都可以使用 -->
<global-results>
<result name="myerror">/page/error/myerror.jsp</result>
<result name="error">/page/error/error.jsp</result>
</global-results>
<global-exception-mappings>
<!-- 可以配置多个,如果捕获的异常类型不知道会被error2拦截 ,优先匹配明确类型的exception-->
<!-- 自定义异常 -->
<exception-mapping result="myerror" exception="cn.qlq.Exception.MyException"></exception-mapping>
<!-- 未知异常 -->
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
</package> <include file="struts/error.xml"></include>
<include file="struts/permission.xml"></include>
<include file="struts/paper.xml"></include>
</struts>

-----------------------------------------Shiro配置-------------------------------------

applicationContext-shiro.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
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-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- web.xml中shiro的filter对应的bean -->
<!-- Shiro 的Web过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<!-- loginUrl认证提交地址,如果没有认证将会请求此地址进行认证,请求此地址将由formAuthenticationFilter进行表单认证 -->
<property name="loginUrl" value="/login.action" />
<!-- 认证成功统一跳转到first.action,建议不配置,shiro认证成功自动到上一个请求路径 -->
<property name="successUrl" value="/first.action" />
<!-- 通过unauthorizedUrl指定没有权限操作时跳转页面 -->
<property name="unauthorizedUrl" value="/refuse.jsp" />
<!-- 自定义filter配置 -->
<property name="filters">
<map>
<!-- 将自定义 的FormAuthenticationFilter注入shiroFilter中 -->
<entry key="authc" value-ref="formAuthenticationFilter" />
</map>
</property>
<!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 -->
<property name="filterChainDefinitions">
<value>
<!-- 静态资源放行 -->
<!-- /images/** = anon /js/** = anon /styles/** = anon 对错误页面放行 /error.jsp
= anon -->
<!-- 验证码,可匿名访问 -->
/validatecode.jsp = anon <!-- 配置记住我或认证通过可以访问的地址 -->
/index.jsp = user
/first.action = user
/welcome.jsp = user <!--增加试卷使用注解需要有增加权限 -->
<!-- /paper_addSt.action = perms[paper:create] -->
<!-- /user_findUser.action = perms[user:find] -->
<!-- 删除用户需要有删除用户的权限 -->
/user_deleteUser.action = perms[user:delete] <!-- 请求 logout.action地址,shiro去清除session -->
/logout.action = logout <!-- /** = authc 所有url都必须认证通过才可以访问 -->
/** = authc <!-- 所有url都可以匿名访问 -->
<!-- /** = anon -->
</value>
</property>
</bean> <!-- securityManager安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 注入realm -->
<property name="realm" ref="customRealm" />
<!-- 注入缓存管理器 -->
<property name="cacheManager" ref="cacheManager" />
<!-- 注入session管理器 -->
<property name="sessionManager" ref="sessionManager" />
<!-- 记住我 -->
<property name="rememberMeManager" ref="rememberMeManager" />
</bean> <!-- realm -->
<bean id="customRealm" class="cn.qlq.Shiro.CustomRealm">
<!-- 将凭证匹配器设置到realm中,realm按照凭证匹配器的要求进行散列 -->
<property name="credentialsMatcher" ref="credentialsMatcher" />
</bean> <!-- 凭证匹配器 -->
<bean id="credentialsMatcher"
class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<property name="hashAlgorithmName" value="md5" />
<property name="hashIterations" value="1" />
</bean> <!-- 缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml" />
</bean> <!-- 会话管理器 -->
<bean id="sessionManager"
class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- session的失效时长,单位毫秒 -->
<property name="globalSessionTimeout" value="600000" />
<!-- 删除失效的session -->
<property name="deleteInvalidSessions" value="true" />
</bean> <!-- 自定义form认证过虑器 -->
<!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->
<bean id="formAuthenticationFilter" class="cn.qlq.Shiro.CustomFormAuthenticationFilter">
<!-- 表单中账号的input名称 -->
<property name="usernameParam" value="username" />
<!-- 表单中密码的input名称 -->
<property name="passwordParam" value="password" />
<!-- 记住我input的名称 -->
<property name="rememberMeParam" value="rememberMe" />
</bean> <!-- rememberMeManager管理器,写cookie,取出cookie生成用户信息 -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cookie" ref="rememberMeCookie" />
</bean>
<!-- 记住我cookie -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!-- rememberMe是cookie的名字 -->
<constructor-arg value="rememberMe" />
<!-- 记住我cookie生效时间30天 -->
<property name="maxAge" value="2592000" />
</bean> </beans>

shiro-ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!--diskStore:缓存数据持久化的目录 地址 -->
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>

--------------------------------------数据库配置---------------------------------------------------------------

db.properties

;;;;;;;;;;;;;;;;;;;;
;DataBaseConnection;
;;;;;;;;;;;;;;;;;;;; jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shiro
jdbc.username=sa
jdbc.password=123456

----------------------------------------------Log4j配置---------------------------------------------------

log4j.properties

#设置logger级别DEBUG、INFO、WRNING、ERROR和输出格式A、B、C或D
log4j.rootLogger=DEBUG, A #输出到控制台
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n #输出到E盘的log.log文件
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.File=E:\\log.log
log4j.appender.B.layout=org.apache.log4j.SimpleLayout #输出到E盘的log.html文件
log4j.appender.C=org.apache.log4j.RollingFileAppender
log4j.appender.C.File=E:\\log.html
log4j.appender.C.MaxFileSize=1000KB
log4j.appender.C.MaxBackupIndex=10
log4j.appender.C.layout=org.apache.log4j.HTMLLayout log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=E:\\log.log
log4j.appender.D.layout=org.apache.log4j.TTCCLayout

Spring+Struts+Mybatis+Shiro整合配置的更多相关文章

  1. spring和mybatis的整合配置

    参考自: http://www.cnblogs.com/wangmingshun/p/5674633.html 链接中的文章里一共有三种整合方式,太多了怕记混了. 我这里只保留第二种. spring中 ...

  2. Spring+SpringMVC+MyBatis的整合

    1.基本概念   1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-On ...

  3. 关于Spring和mybatis的整合

    Spring同Mybatis的整合 1.引入相应的jar包.(Mybatis的jar包,Spring的jar包,mybatis-spring-1.1.1.jar). 2.编写相应的包(三层的包).搭建 ...

  4. 基于maven进行spring 和mybatis的整合(Myeclpise)

    学习日记:基于maven进行spring和mybatis的整合,进行分页查询 什么是maven:maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试 ...

  5. Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM

    写在前面的话   承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合基础篇(八)mysql中文查询bug修复

    写在前面的话 在测试搜索时出现的问题,mysql通过中文查询条件搜索不出数据,但是英文和数字可以搜索到记录,中文无返回记录.本文就是写一下发现问题的过程及解决方法.此bug在第一个项目中点这里还存在, ...

  7. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶

    日常啰嗦 上一篇文章<Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建>简单的讲了一下SVN服务器的搭建,并没有详细的介绍配置文件及一些复杂的功能, ...

  8. Spring+SpringMVC+MyBatis+easyUI整合优化篇(二)Log4j讲解与整合

    日常啰嗦 上一篇文章主要讲述了一下syso和Log间的一些区别与比较,重点是在项目的日志功能上,因此,承接前文<Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Sy ...

  9. Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试>讲了不为和不能两个状态,针对不为,只能自己调整心态了,而对于不能,本文会结合一 ...

随机推荐

  1. M - Help Hanzo LightOJ - 1197 (大区间求素数)

    题意: 求[a,b]之间的素数的个数 数很大...数组开不起 所以要想到转化 因为小于等于b的合数的最小质因子 一定小于等于sqrt(b),所以只需要求出来[0,sqrt(b)]的素数  然后取倍数删 ...

  2. Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds

    Servers -->双击你的启动服务--> 对话框左下角切换选项卡为 Overview -->中东找到Timeouts 把Start(in seconds)改为 100  ,然后按 ...

  3. 自学工业控制网络之路1.1-工业控制系统发展历程CCS DCS FCS

    返回 自学工业控制网络之路 自学工业控制网络之路1.1-工业控制系统发展历程CCS DCS FCS 工业控制系统是对诸如图像.语音信号等大数据量.高速率传输的要求,又催生了当前在商业领域风靡的以太网与 ...

  4. android 使用广播 接收和拦截 android系统短信

    package com.app.sms_broadcastreceiver; import android.app.Activity; import android.content.Broadcast ...

  5. CF1073E Segment Sum 解题报告

    CF1073E Segment Sum 题意翻译 给定\(K,L,R\),求\(L~R\)之间最多不包含超过\(K\)个数码的数的和. \(K\le 10,L,R\le 10^{18}\) 数位dp ...

  6. 转载:Windows下stdlib.h与glut.h中exit()函数重复定义的解决方案

    最近用到 OpenGL的第三方库Glut,碰到了exit()这个函数在stdlib.h与glut.h两个头文件中重复定义的情况,解决方案如下: 打开glut.h,找到exit()函数定义的地方(144 ...

  7. bzoj3698 XWW的难题

    题意:给你个n * n的实数矩阵,你需要把它中的每个数上/下取整,并满足如下条件: 每行最后一个数等于前面的和. 每列最后一个数等于前面的和. n行n列的那个元素始终为0,不予考虑. 求满足条件下矩阵 ...

  8. A1016. Phone Bills

    A long-distance telephone company charges its customers by the following rules: Making a long-distan ...

  9. A1056. Mice and Rice

    Mice and Rice is the name of a programming contest in which each programmer must write a piece of co ...

  10. 如何将Anaconda更新到想要的python版本

    最近用Anaconda比较多,因为它里面的包很全啊.如果下个原生的python,要用的时候得自己一个个装. 但是有些包又互相依赖,一个个装的时候实在很抓狂.懒人就想到了anaconda这种套装集合了. ...