spring_3
Struct2、Hibernate3、Spring3框架搭建实战

Struct2、Hibernate3、Spring3框架搭建实战采⽤⽬前最新的struts-2.3.1.2、hibernate3.6.10.Final、spring-framework-3.1.1.RELEASE开发包,以及eclipse-jee-indigo-SR2-win32、apache-tomcat-7.0.27服务器、JDK6和mysql5做开发环境,参考了前辈的⼀篇相关⽂章,改正了其中的错误和疏漏,克服了公司分配的“新”机器每⼩时⾃动重启三次的困难,终于把环境给搭好了。
整个过程中遵循的⼀个原则是,避免引⼊⽤不到的jar包,以求搭建⼀个最⼩的SSH 运⾏环境。
⾸先创建⼀个Dynamic web project 输⼊任意名字如SSHBase。
第⼀步:加载Spring环境我们需要引⼊的包有:org.springframework.asm-3.1.1.RELEASE.jarorg.springframework.beans-3.1.1.RELEASE.jarorg.springframework.context-3.1.1.RELEASE.jarorg.springframework.core-3.1.1.RELEASE.jarorg.springframework.expression-3.1.1.RELEASE.jarorg.springframework.jdbc-3.1.1.RELEASE.jarorg.springframework.web-3.1.1.RELEASE.jarorg.springframework.orm-3.1.1.RELEASE.jar由于spring默认开启了⽇志,还需要加⼊commons-logging的jar包,否则会报错。
建议不要⼀次性加⼊应该先加最核⼼的运⾏代码看缺少什么加什么,这样就不会加多余的包进来了,spring3已经把包按功能分开,不像以前⼀个包,这样更灵活,只要运⾏我们需要的功能,⽽没⽤到的就不⽤在硬性的添加进来。
Struts2+Spring3+Hibernate4+Maven整合

Struts2+Spring3+Hibernate4+Maven整合目录1.建立Maven工程2.搭建Spring33.搭建Struts2并整合Spring34.搭建Hibernate4并整合Spring3内容1.建立Maven工程第一步:第二步:第三步:第四步:注意:这里的JDK要选择默认的,这样别人在使用的时候,如何JDk不一致的话也不会出错,如下图所示:第五步:Maven标准目录src/main/javasrc/main/resourcessrc/test/javasrc/test/resources第六步:发布项目:Maven install清除编译过的项目:Maven cleanOK,Mean 工程创建成功!2. 搭建 Spring3(1)下载Spring3需要的jar包1.spring-core2.spring-context3.spring-jdbc4.spring-beans5.spring-web6.spring-expression7.spring-orm在pom.xml中编写Spring3需要的包,maven会自动下载这些包。
<!-- spring3 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>3.1.2.RELEASE</version></dependency>(2)编写Spring配置文件<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd /schema/context/schema/context/spring-context-3.0.xsd "><!-- 引入属性文件 --><context:property-placeholderlocation="classpath:config.properties"/><!-- 自动扫描dao和service包(自动注入) --><context:component-scan base-package="com.zc.dao,com.zc.service" /></beans>(3)编写测试首先,在src/main/java中创建com.zc.service包,在包中编写一个UserService 接口,代码如下:package com.zc.service;/*** 测试* @author ZC* */public interface UserService {public void test();}然后,在src/main/java中创建com.zc.service.imple包,在包中编写UserServiceImple 实现类,代码如下:package com.zc.service.impl;import org.springframework.stereotype.Service;import erService;@Service("userService")public class UserServiceImpl implements UserService {@Overridepublic void test() {System.out.println("Hello World!");}}注意:@Service("userService")使用junit注解完成service 注入,所以还要在pom.xml中配置junit注解。
struts2+spring3+hibernate整合教程

Struts2+Spring3+hibernate3整合(2011年7月末,最新)上次下载了一个教程,上面写着:“献给我亲爱的老婆!”(羡慕不已)。
想了想,我没老婆,难道没什么好写了!不难…献给我暗恋过的每一个女人!(嘿嘿…)如果在你遇到的女生中有一个幽默豁达的女生,不要犹豫,追上去,就娶她了!一,需要的框架包二,建立project,添加相应的.jar文件(重点)1,eclipse中建立dynamic web project,这里是ssh_integrate_0100。
2,src中创建需要的类,这里以一个域模型为user的例子说明。
(现在建立这些类,可以方便我们在搭建时候随时测试!)User.javaIUserDao.javaUserDaoImpl.javaIUserService.javaUserServiceImpl.java3,拷贝spring-framework-3.1.0\dist目录下的所有jar包,注意有一个不是jar的文件,当然拷过去也没事。
4,拷贝spring运行中需要的其他jar文件,主要是mons-logging,可以从spring-framework-3.0.2.RELEASE-dependencies中找到。
ii.Aspectjrt.jar和aspect-waver.jar,可以从spring-framework-2.5.6-with-dependencies/lib/aspectj下面找到(不知道为什么,spring-framework-3.0.2.RELEASE-dependencies中没有aspectjrt的jar包)iii.aopalliance.Jar,apache-dbcp.jar,apache-pool.jar,可以从spring-framework-3.0.2.RELEASE-dependencies中找到。
5,建立beans.xml,这里使用的是annotation和component-scan,这样配置可以大大简化配置,所以是best-practice,其他配置请参考spring文档。
struts2+spring3+mybatis整合

--src|-com.ssm|-action|-LoginAction.java|-entity|-User.java|-iface|-IUserDao.java|-impl|-UserDao.java|-seriface|-IUserServices.java|-impl|-UserServices.java|-sqlmap|-User.xmlapplicationContext.xmldatabase.Propertieslog4j.PropertiesmyBatis-config.xmlstruts.Propertiesstruts.xmlok直接上代码了:Action类: LoginAction.javapackage com.ssm.action;import java.util.ArrayList;import java.util.List;import com.opensymphony.xwork2.Action;import er;import com.ssm.seriface.IUserService;public class LoginAction implements Action{private User user;private IUserService userServices;public void setUserServices(IUserService userServices) {erServices = userServices;}public User getUser(){return user;}public void setUser(User user){er = user;}public String execute() throws Exception{String aaa= getUser().getId()+"";List userList= new ArrayList();userList= userServices.selectUserById(getUser().getId()); if(userList.size()>0){return Action.SUCCESS;}else{return Action.ERROR;}}}实体类User.javapackage com.ssm.entity;import java.io.Serializable;import java.util.Date;public class User implements Serializable{private int id;private String name;private String password;private Date birthday;public User(){}public User(String name, String password, Date birthday) {= name;this.password= password;this.birthday= birthday;}public int getId(){return id;}public void setId(int id){this.id = id;}public String getName(){return name;}public void setName(String name){ = name;}public String getPassword(){return password;}public void setPassword(String password){this.password = password;}public Date getBirthday(){return birthday;}public void setBirthday(Date birthday){this.birthday = birthday;}}IUserDao接口类IUserDao.javapackage com.ssm.iface;import java.util.List;public interface IUserDao{public boolean userVaild(String name, String password);public List selectUserById(int id);}UserDaoImpl实现接口类:UserDaoImpl.javapackage com.ssm.iface.impl;import java.util.List;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import com.ssm.iface.IUserDao;//import com.ssb.baseutil.SqlMapClientDaoSupport;//import com.ssb.iface.IUserDao;//import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; public class UserDaoImpl extends SqlMapClientDaoSupport implements IUserDao {public List selectUserById(int id){// TODO Auto-generated method stubreturn getSqlMapClientTemplate().queryForList("selectUserById", id);}public boolean userVaild(String name, String password){// TODO Auto-generated method stubreturn false;}/*public boolean userVaild(String name, String password){return false;}public List selectUserById(String id){return getSqlMapClientTemplate().queryForList("getUserById", id);}*/}业务类IUserServices.javapackage com.ssm.seriface;import java.util.List;public interface IUserService{public boolean userVaild(String name, String password); public List selectUserById(int id);}UserServicesImpl.javapackage com.ssm.seriface.impl;import java.util.List;import com.ssm.iface.IUserDao;import com.ssm.seriface.IUserService;public class UserServiceImpl implements IUserService{private IUserDao serviceUserDao= null;public IUserDao getServiceUserDao(){return serviceUserDao;}public void setServiceUserDao(IUserDao serviceUserDao) {this.serviceUserDao = serviceUserDao;}public List selectUserById(int id){// TODO Auto-generated method stubreturn serviceUserDao.selectUserById(id);}public boolean userVaild(String name, String password){// TODO Auto-generated method stubreturn erVaild(name, password);}}mybatis实体配置文件User.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC"-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="user"><resultMap type="User" id="userResultMap"><id property="id" column="ID"/><result property="name" column="NAME"/><result property="password" column="PASSWORD"/><result property="birthday" column="BIRTHDAY"/></resultMap><select id="selectUserById" parameterType="ng.String" resultType="User"><![CDATA[SELECT * FROM USER SUWHERE SU.ID = #{id}]]></select></mapper>sprng配置文件applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p" xmlns:context="/schema/context"xmlns:jee="/schema/jee" xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.5.xsd/schema/context/schema/context/spring-context-2.5.xsd/schema/jee/schema/jee/spring-jee-2.5.xsd/schema/tx/schema/tx/spring-tx-2.5.xsd"><!-- 数据源属性配置文件--><!-- <bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath:com/databaseconfig/database.properties"/></bean>--><context:property-placeholder location="classpath:database.properties"/><bean id="dataSource" class="boPooledDataSource"><property name="driverClass" value="${jdbc.driverClassName}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${ername}" /><property name="password" value="${jdbc.password}" /><property name="autoCommitOnClose" value="true"/><property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/><property name="initialPoolSize" value="${cpool.minPoolSize}"/><property name="minPoolSize" value="${cpool.minPoolSize}"/><property name="maxPoolSize" value="${cpool.maxPoolSize}"/><property name="maxIdleTime" value="${cpool.maxIdleTime}"/><property name="acquireIncrement" value="${cpool.acquireIncrement}"/><property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/> </bean><!-- 数据连接管理--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- myBatis文件--><!--<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:myBatis-config.xml"/></bean>--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="configLocation" value="classpath:myBatis-config.xml"/><property name="dataSource" ref="dataSource"/></bean><!-- ibatis2.x 配置<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="classpath:myBatis-config.xml"/><property name="dataSource" ref="dataSource"/></bean>--><bean id="mapDao" class="org.mybatis.spring.MapperFactoryBean"><!-- 这里是接口,不是接口实现类了--><property name="mapperInterface" value="com.ssm.iface.IUserDao"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean><bean id="userServices" class="erServiceImpl"><property name="serviceUserDao" ref="mapDao"/></bean><bean id="LoginAction" class="com.ssm.action.LoginAction"><property name="userServices" ref="userServices"/></bean></beans>数据库连接属性配置文件(其实可以不用这么复杂)database.Propertiesjdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/ddtest?characterEncoding=utf8 ername=rootjdbc.password=123cpool.checkoutTimeout=5000cpool.minPoolSize=20cpool.maxPoolSize=50cpool.maxIdleTime=7200cpool.maxIdleTimeExcessConnections=1800cpool.acquireIncrement=10log4j 随便到log4j里copy一个吧mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC"-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><typeAliases><typeAlias alias="User" type="er"/></typeAliases><mappers><mapper resource="com/ssm/sqlmap/User.xml" /></mappers></configuration>struts配置文件struts.Properties##整合spring的struts.objectFactory=springeClassCache = truestruts.locale=zh_CNstruts.i18n.encoding=GBKstruts的Action配置文件struts.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="style" extends="struts-default"><!--<action name="loginAction" class="sys.style.design.action.LoginAction"> <result name="success">success.jsp</result><result name="error">error.jsp</result></action>--><action name="loginAction" class="com.ssm.action.LoginAction"><result name="success">success.jsp</result><result name="error">error.jsp</result></action></package></struts>。
SpringSecurity3源码分析-SessionManagementFilter分析-上

SessionManagementFilter过滤器对应的类路径为org.springframework.security.web.session.SessionManagementFilter这个过滤器看名字就知道是管理session的了,http标签是自动配置时,默认是添加SessionManagementFilter过滤器到filterChainProxy中的,如果不想使用这个过滤器,需要做如下配置<;security:http auto-config=";true";>;<;security:session-management session-fixation-protection=";none";/>;<;/security:http>;其实在之前的过滤器中有使用到session策略了,但是没有细说。
SessionManagementFilter提供两大类功能:1.session固化保护-通过session-fixation-protection配置2.session并发控制-通过concurrency-control配置下面看SessionManagementFilter的bean是如何创建的void createSessionManagementFilters() {Element sessionMgmtElt = DomUtils.getChildElementByTagName(httpElt, Elements.SESSION_MANAGEMENT);Element sessionCtrlElt = null;String sessionFixationAttribute = null;String invalidSessionUrl = null;String sessionAuthStratRef = null;String errorUrl = null;//如果配置了标签,解析标签的属性、子标签if (sessionMgmtElt != null) {sessionFixationAttribute = sessionMgmtElt.getAttribute(ATT_SESSION_FIXATION_PROTECTION);invalidSessionUrl = sessionMgmtElt.getAttribute(ATT_INVALID_SESSION_URL);sessionAuthStratRef = sessionMgmtElt.getAttribute(ATT_SESSION_AUTH_STRATEGY_REF);errorUrl = sessionMgmtElt.getAttribute(ATT_SESSION_AUTH_ERROR_URL); sessionCtrlElt = DomUtils.getChildElementByTagName(sessionMgmtElt, Elements.CONCURRENT_SESSIONS);//判断是否配置了concurrency-control子标签if (sessionCtrlElt != null) {//配置了并发控制标签则创建并发控制过滤器和session注册的bean定义createConcurrencyControlFilterAndSessionRegistry(sessionCtrlElt);}}if (!StringUtils.hasText(sessionFixationAttribute)) {sessionFixationAttribute = OPT_SESSION_FIXATION_MIGRATE_SESSION;} else if (StringUtils.hasText(sessionAuthStratRef)) {pc.getReaderContext().error(ATT_SESSION_FIXATION_PROTECTION + "; attribute cannot be used"; +"; in combination with "; + ATT_SESSION_AUTH_STRATEGY_REF, pc.extractSource(sessionCtrlElt));}boolean sessionFixationProtectionRequired = !sessionFixationAttribute.equals(OPT_SESSION_FIXATION_NO_PROTECTION);BeanDefinitionBuilder sessionStrategy;//如果配置了concurrency-control子标签if (sessionCtrlElt != null) {assert sessionRegistryRef != null;//session控制策略为ConcurrentSessionControlStrategysessionStrategy = BeanDefinitionBuilder.rootBeanDefinition(ConcurrentSessionControlStrategy.class) ;sessionStrategy.addConstructorArgValue(sessionRegistryRef);String maxSessions = sessionCtrlElt.getAttribute(";max-sessions";); //添加最大session数if (StringUtils.hasText(maxSessions)) {sessionStrategy.addPropertyValue(";maximumSessions";, maxSessions);}String exceptionIfMaximumExceeded = sessionCtrlElt.getAttribute(";error-if-maximum-exceeded";);if (StringUtils.hasText(exceptionIfMaximumExceeded)) {sessionStrategy.addPropertyValue(";exceptionIfMaximumExceeded";, exceptionIfMaximumExceeded);}} else if (sessionFixationProtectionRequired || StringUtils.hasText(invalidSessionUrl)|| StringUtils.hasText(sessionAuthStratRef)) {//如果没有配置concurrency-control子标签//session控制策略是SessionFixationProtectionStrategysessionStrategy = BeanDefinitionBuilder.rootBeanDefinition(SessionFixationProtectionStrategy.class );} else {//<;session-management session-fixation-protection=";none";/>;sfpf = null;return;}//创建SessionManagementFilter,并设置依赖的bean、propertyBeanDefinitionBuilder sessionMgmtFilter = BeanDefinitionBuilder.rootBeanDefinition(SessionManagementFilter.class);RootBeanDefinition failureHandler = new RootBeanDefinition(SimpleUrlAuthenticationFailureHandler.class);if (StringUtils.hasText(errorUrl)) {failureHandler.getPropertyValues().addPropertyValue(";defaultFailureUrl";, errorUrl);}sessionMgmtFilter.addPropertyValue(";authenticationFailureHandler";, failureHandler);sessionMgmtFilter.addConstructorArgValue(contextRepoRef);if (!StringUtils.hasText(sessionAuthStratRef)) {BeanDefinition strategyBean = sessionStrategy.getBeanDefinition();if (sessionFixationProtectionRequired) {sessionStrategy.addPropertyValue(";migrateSessionAttributes";,Boolean.valueOf(sessionFixationAttribute.equals(OPT_SESSION_FIXATION_MIGRATE_SES SION)));}sessionAuthStratRef = pc.getReaderContext().generateBeanName(strategyBean);pc.registerBeanComponent(new BeanComponentDefinition(strategyBean, sessionAuthStratRef));}if (StringUtils.hasText(invalidSessionUrl)) {sessionMgmtFilter.addPropertyValue(";invalidSessionUrl";, invalidSessionUrl);}sessionMgmtFilter.addPropertyReference(";sessionAuthenticationStrategy";, sessionAuthStratRef);sfpf = (RootBeanDefinition) sessionMgmtFilter.getBeanDefinition();sessionStrategyRef = new RuntimeBeanReference(sessionAuthStratRef);}//创建并发控制Filter和session注册的beanprivate void createConcurrencyControlFilterAndSessionRegistry(Element element) {final String ATT_EXPIRY_URL = ";expired-url";;final String ATT_SESSION_REGISTRY_ALIAS = ";session-registry-alias";;final String ATT_SESSION_REGISTRY_REF = ";session-registry-ref";;CompositeComponentDefinition compositeDef =new CompositeComponentDefinition(element.getTagName(), pc.extractSource(element));pc.pushContainingComponent(compositeDef);BeanDefinitionRegistry beanRegistry = pc.getRegistry();String sessionRegistryId = element.getAttribute(ATT_SESSION_REGISTRY_REF);//判断是否配置了session-registry-ref属性,用于扩展//默认情况下使用SessionRegistryImpl类管理session的注册if (!StringUtils.hasText(sessionRegistryId)) {// Register an internal SessionRegistryImpl if no external reference supplied.RootBeanDefinition sessionRegistry = new RootBeanDefinition(SessionRegistryImpl.class);sessionRegistryId = pc.getReaderContext().registerWithGeneratedName(sessionRegistry);pc.registerComponent(new BeanComponentDefinition(sessionRegistry, sessionRegistryId));}String registryAlias = element.getAttribute(ATT_SESSION_REGISTRY_ALIAS);if (StringUtils.hasText(registryAlias)) {beanRegistry.registerAlias(sessionRegistryId, registryAlias);}//创建并发session控制的FilterBeanDefinitionBuilder filterBuilder =BeanDefinitionBuilder.rootBeanDefinition(ConcurrentSessionFilter.class);//注入session的注册实现类filterBuilder.addPropertyReference(";sessionRegistry";, sessionRegistryId);Object source = pc.extractSource(element);filterBuilder.getRawBeanDefinition().setSource(source);filterBuilder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);String expiryUrl = element.getAttribute(ATT_EXPIRY_URL);if (StringUtils.hasText(expiryUrl)) {WebConfigUtils.validateHttpRedirect(expiryUrl, pc, source);filterBuilder.addPropertyValue(";expiredUrl";, expiryUrl);}pc.popAndRegisterContainingComponent();concurrentSessionFilter = filterBuilder.getBeanDefinition();sessionRegistryRef = new RuntimeBeanReference(sessionRegistryId);}接着看SessionManagementFilter过滤器执行过程public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;//省略……//判断当前session中是否有SPRING_SECURITY_CONTEXT属性if (!securityContextRepository.containsContext(request)) {Authentication authentication =SecurityContextHolder.getContext().getAuthentication();if (authentication != null &;&; !authenticationTrustResolver.isAnonymous(authentication)) {try {//再通过sessionStrategy执行session固化、并发处理//与UsernamePasswordAuthenticationFilter时处理一样,后面会仔细分析。
【SpringFramework】Spring入门教程(三)使用注解配置

【SpringFramework】Spring⼊门教程(三)使⽤注解配置本⽂主要介绍四个⽅⾯:(1) 注解版本IOC和DI(2) Spring纯注解(3) Spring测试(4) SpringJDBC - Spring对数据库的操作使⽤注解配置Spring⼊门说在前⾯学习基于注解的IoC配置,⼤家脑海⾥⾸先得有⼀个认知,即注解配置和xml配置要实现的功能都是⼀样的,都是要降低模块间的耦合度。
仅仅只是配置的形式不⼀样。
关于实际的开发中到底使⽤xml还是注解,每家公司有着不同的使⽤习惯。
所以这两种配置⽅式我们都需要掌握。
基于注解配置的⽅式也已经逐渐代替xml配置。
所以我们必须要掌握使⽤注解的⽅式配置Spring。
配置步骤注意:如果使⽤Eclipse需要先安装了STS插件,或者使⽤STS开发⼯具创建项⽬。
本⽂使⽤IDEA进⾏演⽰。
1.2.1. 第⼀步:拷贝必备jar包到⼯程的lib⽬录。
注意:在基于注解的配置中,我们还要多拷贝⼀个aop的jar包。
如下图:1.2.2. 第⼆步:在类的根路径下创建⼀个任意名称的xml⽂件(不能是中⽂)注意:基于注解整合时,Spring配置⽂件导⼊约束时需要多导⼊⼀个context命名空间下的约束。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd"></beans>1.2.3. 第⼆步:创建⼀个服务类创建⼀个测试的服务类,并且加⼊使⽤@Component注解,声明该类允许注⼊到Spring容器package org.cjw.service;import ponent;/*使⽤注解配置时,需要将Spring框架启动就创建对象的类表⽰为组件类表⽰组件类使⽤@Component注解*/@Componentpublic class CustomerService {public void save() {System.out.println("-保存数据-");}}1.2.4. 第四步在spring的配置⽂件加⼊扫描注解<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd"><!-- 声明扫描包及其⼦包的类,如果发现有组件注解的类,就创建对象并加⼊到容器中去 --><context:component-scan base-package="org.cjw" /></beans>1.2.5. 第五步:测试调⽤代码package org.cjw.test;import org.cjw.service.CustomerService;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class CustomerServiceTest {@Testpublic void testSave() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");CustomerService customerService = context.getBean(CustomerService.class);customerService.save();}}--测试结果,如果可以调⽤服务⽅法,测试成功。
Struts2+Spring3+Hibernate3 集成方法
Struts2+Spring3+Hibernate3 集成 目 录 1.Struts2集成 ..................................................... 11.1. 把Struts提供的jar包拷贝到/WEB-INF/lib/目录下 (1)1.2. 在web.xml中配置Struts的过滤器 (2)2.Struts2开发 ..................................................... 22.1 编写Struts Action程序,需要继承ActionSupport (2)2.2 创建struts.xml的Action映射文件 (3)3.Struts2+Spring集成 .............................................. 33.1 按第1步“Struts2集成”方法集成Struts2 (3)3.2 再把Struts的Spring插件把拷贝到/WEB-INF/lib/目录下 (3)3.3 把Spring提供的jar拷贝到/WEB-INF/lib/目录下 (3)3.4 web.xml配置Spring的过滤器 (3)3.5 创建applicationContext.xml配置文件 (4)4.Struts2+Spring+Hibernate集成 ..................................... 54.1 先按照“Struts2+Spring集成”方法执行 (5)4.2 导入Apache Commons几个jar包 (5)4.3 导入Hibernate几个jar包 (5)4.4 数据库的JDBC驱动 (5)4.5 在applicationContext.xml中加入如下的配置 (5)4.6 创建hibernate.cfg.xml文件 (6)5.Struts2+Spring+Hibernate开发 ..................................... 65.1 编写Model类 (6)5.2 编写Model类的HBM映射文件 (7)5.3 在applicationContext.xml中指定HBM映射文件路径 (8)5.4 编写DAO接口和实现类程序,并继承HibernateDaoSupport (8)5.5 在applicationContext.xml中配置DAO Bean (10)6.注意事项 ....................................................... 101. Struts2集成1.1.把Struts提供的jar包拷贝到/WEB-INF/lib/目录下Struts需要如下几个包:解压:struts-2.2.3.1-lib.zip需要:struts2-core-2.2.3.1.jarxwork-core-2.2.3.1.jarognl-3.0.1.jarfreemarker-2.3.16.jarjavassist-3.11.0.GA.jar和所有以“commons-”开头的包。
Spring3 Mybatis 异常处理
Spring3 Mybatis 异常处理通常在Dao 层将所有异常都转嫁到Spring 的RuntimeException 体系中来-DataAccessExceptionSpring的DAO框架没有抛出与特定技术相关的异常,例如SQLException或HibernateException,抛出的异常都是与特定技术无关的org.springframework.dao.DataAccessException类的子类,避免系统与某种特殊的持久层实现耦合在一起。
DataAccessException是RuntimeException,是一个无须检测的异常,不要求代码去处理这类异常,遵循了Spring的一般理念:异常检测会使代码到处是不相关的catch或throws语句,使代码杂乱无章;并且NestedRuntimeException的子类,是可以通过NestedRuntimeException的getCause()方法获得导致该异常的另一个异常。
Spring 的异常分类有1./**2. * 根据时间获取日KPI数据3. * @param date 日期4. * @return5. */6.public List<KPIDataBean> getKPIOfDayDataByDate(String date) throws DataAccessException;并在它的实现类中也抛出这么个异常。
这样,在调用这个方法的时候,我们捕获这个异常即可:[java]view plaincopy1.try {2. list = kpiDao.getKPIOfDayDataByDate(date);3.} catch(DataAccessException e) {4. System.out.println("test:" + e.getMessage());5.}这样就可以捕获相应的异常了。
Shiro Struts2 Spring3 加上@RequiresPermissions 后@Autowired失效
Shiro+Struts2+Spring3 加上@RequiresPermissions 后@Autowired失效@ParentPackage("all")@Namespace("/project")public class ProjectAction extends BaseAction { public final static Logger logger =LoggerFactory .getLogger(ProjectAction.class);@Autowired(required=true) private ProjectService projectService; private String code; private Project project; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public Project getProject() { return project; } public void setProject(Project project) { this.project = project; }@RequiresPermissions("SYS_PROJECT:FIND")@Action(value = "findAll", results = { @Result(name = "success", type = "json", params = { "ignoreHierarchy", "false", "root", "dataMap" }) }) public String findAll(){ Subject subject = SecurityUtils.getSubject(); if (subject.isPermitted("SYS_PROJECT:FIND")){ System.out .println("授权验证通过"); } ProjectCriteria projectCriteria = new ProjectCriteria(); Criteria criteria =projectCriteria.createCriteria(); if (project == null) { project = new Project(); } if (project.getCode() != null&& !"".equals(project.getCode().trim())){ criteria.andCodeLike("%" + project.getCode() + "%"); } if (project.getName() != null&& !"".equals(project.getName().trim())){ criteria.andNameLike("%" + project.getName() + "%"); } int total = 0; try { System.out.println(projectService==null); total =projectService.countByCriteria(projectCriteria); }catch(Run timeException e){ System.out.println(e); }dataMap.put("total", total); dataMap.put("rows", projectService.selectByCriteria(projectCriteria)); return SUCCESS; }@RequiresPermissions("SYS_PROJECT:ADD")@Action(value = "add", results = { @Result(name = "success", type = "json", params = { "ignoreHierarchy", "false", "root", "resultMap" }) }) public String add() { try { projectService.saveProject(project);resultMap.put("success", "true"); resultMap.put("msg", "add success"); } catch (Exception e){ resultMap.put("msg", "add error" + e.getStackTrace()); }return SUCCESS; }@RequiresPermissions("SYS_PROJECT:UPD")@Action(value = "toUpdate", results = { @Result(name = "success", type = "json", params = {"includeProperties", "project.*" }) }) public String toUpdate() { project =projectService.selectByPrimaryKey(this.getCode()); return SUCCESS; }@RequiresPermissions("SYS_PROJECT:UPD")@Action(value = "update", results = { @Result(name = "success", type = "json", params = { "ignoreHierarchy", "false", "root", "resultMap" }) }) public String update() { try { projectService.updateByPrimaryKey(project); resultMap.put("success", "true"); resultMap.put("msg", "Update success"); } catch (Exception e){ resultMap.put("msg", "Update error" + e.getMessage()); } return SUCCESS; }@RequiresPermissions("SYS_PROJECT:DEL")@Action(value = "delete", results = { @Result(name = "success", type = "json", params = { "ignoreHierarchy", "false", "root", "resultMap" }) }) public String delete() { try{ projectService.deleteByPrimaryKey(this.getCode()); resultMap.put("success", "true"); resultMap.put("msg", "Delete success"); } catch (Exception e){ resultMap.put("msg", "Delete error" + e.getMessage()); } return SUCCESS; }}加上@RequiresPermissions注释后可以获取到授权信息,但是projectService无法注入。
2022年英语春天的作文_spring 3篇
英语春天的作文_spring 3篇导读:关于”春天“的英语作文范文3篇,作文题目:spring。
以下是关于春天的六级英语范文,每篇作文均为高分范文带翻译。
关于”春天“的英语作文范文3篇,作文题目:spring。
以下是关于春天的六级英语范文,每篇作文均为高分范文带翻译。
高分英语作文1:springSpring has come, every corner of the earth is full of the breath of spring, everywhere is spring, beautiful reed trees draw out the thin willow silk, decorated with clean light yellow tender leaf grass, bring the fragrance of the soil drill, clusters, clusters, as well as green flowers also stretch out themselves, yawn, found the small head of the children are off the heavy winter Clothes, easy exchange from home birds, bright spring clothes, singing interesting songs, tell us: spring is coming, spring comes ly, in the pond, in the field, in the sky, everywhere is full of vitality of natural scenery has become rich and colorful, spring scenery is too beautiful, spring people's mood is more beautiful rickets, the whole winter's wallboard pull Straight, happy smile, full of hope, the park life, photography young people, fishing for the elderly, insect catching children, one by one infatuated with the embrace of nature, forget to return my deep love for spring, I like to smell the flowers, see the green trees, hear Xiao Wu singing happily, deeply love spring, because spring is full of vitality, full of vitality New hope.中文翻译:春天来了,地球上的每一个角落都充满了春天的气息,到处都是春天美丽的芦苇树抽出了细细的柳树丝,上面点缀着干净的淡嫩叶草带来了泥土的芬芳钻,一簇簇,一簇簇,还有嫩绿的花也舒展开来自己,打了个哈欠,找到了小脑袋的孩子们都脱下了笨重的冬衣,轻松地交换了从家里飞来的小鸟们鲜艳的春装,在唱着有趣的听着歌,告诉我们:春天来了春天天真地来了,在池塘里,在田野里,在天空里,到处都是焕发着生机的自然风光也变得丰富多彩春天的景色太美了,春天人们的心情更美佝偻病整个冬天的壁板都拉直了,欢快的笑脸充满了希望的公园里生活起来了,摄影的年轻人,钓到了老人人,捕捉昆虫的孩子,一个个都迷恋在大自然的怀抱里,忘了还我深爱着春天,我喜欢闻着花香,看到大树嫩绿,听到小吴欢快地歌唱着深深地爱着春天,因为春天充满了生机,充满了新的希望。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用JDBC更新数据 使用JDBC更新数据 JDBC
public void updatePerson(Person person) throws SQLException{ Connection conn = null; PreparedStatement pstmt = null; try{ conn = dataSource.getConnection(); pstmt = conn.prepareStatement(“update person set firstName=?, lastName=? where id=?”); pstmt.setString(0, person.getFirstName()); pstmt.setString(1, person.getLastName()); pstmt.setInt(2, person.getId().intValue()); pstmt.executeUpdate(); } catch(SQLException sqle){ LOGGER.error(e); } finally{ try { if (pstmt != null) { pstmt.colse(); pstmt = null;} }catch(SQLException sqle){ LOGGER.warn(e); } try { if (conn != null) { conn.colse(); = null;} }catch(SQLException sqle){ LOGGER.warn(e); } } }
令人生厌又无奈的样板代码
样板代码的重要性:
– 释放资源和处理错误让数据访问更为可靠; – 如果没有这些,错误没有发现、资源继续占用, 将导致不可预测的代码和资源泄露。
Template 和Callback
Template Callback
– 参考opensource-spring中的template 设计模式
在Spring中使用JDBC Spring中使用JDBC 中使用
使用JDBC的优点:
– 不需要精通另外框架的查询语言; – 可以更好地调整数据访问的性能; – 可以使用数据库的所有特性。
JDBC代码的问题:
– 需要管理数据库资源; – 需要处理异常;
使用JDBC插入数据 使用JDBC插入数据 JDBC
提供了DAO Spring 提供了DAO
DAO代表数据访问对象(Data Access Object)。 DAO的存在提供了读写数据库中数据的一种方法。 在DAO中,把功能通过接口暴露,应用的其他部分就可以 通过这些接口来访问数据库。
数据访问层的合适途径
服务对象通过接口访问DAO,这样会有不少好处。考虑一 下会有哪些好处?
public void insertPerson(Person person) throws SQLException{ Connection conn = null; PreparedStatement pstmt = null; try{ conn = dataSource.getConnection(); pstmt = conn.prepareStatement(“insert into person (id, firstName, lastName) values (?, ?, ?)”); pstmt.setInt(0, person.getId().intValue()); pstmt.setString(1, person.getFirstName()); pstmt.setString(2, person.getLastName()); pstmt.executeUpdate(); } catch(SQLException sqle){ LOGGER.error(e); } finally{ try { if (pstmt != null) { pstmt.colse(); pstmt = null;} }catch(SQLException sqle){ LOGGER.warn(e); } try { if (conn != null) { conn.colse(); conn = null;} }catch(SQLException sqle){ LOGGER.warn(e); } } }
在应用中处理数据库访问的缺陷:
– 需要初始化数据访问框架 – 管理资源 – 处理各种各样的异常;
Spring的数据访问框架 Spring的数据访问框架
它整合了各种各样的数据访问技术
– DAO
可以直接通过JDBC、Java Data Objects(JDO)、或者是 某种Object/Relational Mapping(ORM)工具(如 Hibernate)来持久化数据。
Spring被抛出的异常都是与特定技术无关的 org.springframework.dao.DataAccessException类的子 类。 思考:这样做有什么好处?
DataAccessException
DataAccessException是RuntimeException DataAccessException是Spring的 NestedRuntimeException的子类。
conn
使用JDBC读取数据 使用JDBC读取数据 JDBC
public void insertPerson(Person person) throws SQLException{ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ conn = dataSource.getConnection(); pstmt = conn.prepareStatement(“select id, firstName, lastName from person”); pstmt.executeQuery(); Set persons = new HashSet(); while (rs.next()){ person.add(new Person(rs.getInt(“id”), rs.getString(“firstName”), rs.getString(“lastname”))); } return persons; } catch(SQLException sqle){ LOGGER.error(e); } finally{ try { if (rs != null) { rs.colse(); rs = null;} }catch(SQLException sqle){ LOGGER.warn(e); } try { if (pstmt != null) { pstmt.colse(); pstmt = null;} }catch(SQLException sqle){ LOGGER.warn(e); } try { if (conn != null) { conn.colse(); conn = null;} }catch(SQLException sqle){ LOGGER.warn(e); } } }
DAO模版(Template)和回调(Callback) DAO模版(Template)和回调(Callback) 模版(Template)和回调 模版管理流程的固定部分 回调处填写实现细节。
IncorrectUpdateSemanticsDataAccessException Update时发生某些没有预料到的情况,例如更改超过预期 的记录数,当这个异常被抛出时,执行着的事物不会被回滚 InvalidDataAccessApiUsageException InvalidDataAccessResourceUsageException OptimisticLockingFailureException TypeMismatchDataAccessException UncategorizedDataAccessException 一个数据库访问的Java API没有正确使用,例如必须在 执行前编译好的查询编译失败了 错误使用数据访问资源,例如用错误的SQL语法访问关 系型数据库 乐观锁的失败。这将由ORM工具或用户的DAO实现抛出 Java类型和数据类型不匹配,例如试图把String类型插入 到数据库的数值型字段中 有错误发生,但无法归类到某一更为具体的异常中
使用JndiObjectFactoryBean <bean id=“dataSource” class=“org.springframework.jndi.JndiObjectFactoryBean”> <property name=“jndiName”> <value>java:comp/env/jdbc/myDatasource</ value> </property> </ng对JDBC的支持
– 避免写很多有关JDBC的模版化代码。
介绍Spring如何与几个流行的Object-Relation Mapping (O/R Mapping,对象/关系映射)框架集成
– 例如Hibernate
Spring的数据持久化 Spring的数据持久化
Spring的DAO异常层次 Spring的DAO异常层次
异 常 CleanupFailureDataAccessException DataAccessResourceFailureException DataIntegrityViolationException DataRetrievalFailureException DeadlockLoserDataAccessException 何 时 抛 出 一项操作成功地执行,但在释放数据库资源时发生异常 (例如,关闭一个Connection) 数据访问资源彻底失败,例如不能连接数据库 Insert或Update数据时违反了完整性,例如违反了唯一性 限制。 某些数据不能被检索到,例如不能通过关键字找到一条 记录 当前的操作因为死锁而失败