Spring AOP的概念和应用

图片说明

一直搞不明白切点和连接点的概念,和什么时候需要使用AOP,望大神指点

6个回答

— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。
— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

 <aop:config>
   <aop:pointcut expression="execution(* com.yt.sx.db.service.impl.*.*(**))" id="serviceMethods"/>
   <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
 </aop:config>

这就是spring配置aop的方式,让service层去处理业务逻辑
dao层:public interface StaffInfoMapper{ List getStaffInfoion(StaffInfo bean); }
server层:public interface StaffService {public List getStaffInfo(StaffInfo bean);}
server.impl实现层:

 public class StaffServiceImpl implements StaffService{
    @Autowired
    public StaffInfoMapper staffInfoMapper;
    @Override
    public List<StaffInfo> getStaffInfo(StaffInfo bean) {
        List<StaffInfo> StaffInfoList = new ArrayList<StaffInfo>();
        if(bean.getStaffname()!=null && bean.getStaffpwd()!=null){
            StaffInfoList = staffInfoMapper.getStaffInfoion(bean);
        }
        return StaffInfoList;
    }
}

controller层:只是调用了接口方法,虽然这里用的是注解来依赖,其实都是一样的,不用注解也是生成get、set方法

 public class UserInfoController {
    @RequestMapping(value="getUserinfo")
    @ResponseBody
    public List<UserInfo> getUserinfo(HttpServletRequest request,HttpServletResponse reponse){
        List<UserInfo> list = new ArrayList<UserInfo>();
        list.add(new UserInfo("kkkkk","1111"));
        try {
            reponse.getWriter().print("{\"status\":true,\"msg\":\"success\"}");
        } catch (Exception e) {
        }
        return null;
    }
}

这样即使发了告诉你,你应该还是看不太明白,spring框架配置是很灵活的,为什么这个框架这么火,就是因为你如果通了想怎么用怎么用,围绕好出发点,层面的逻辑是脚,框架的配置是腿,想走得远,那个都不能少
注:我随手写的代码,逻辑没细心瞅,谁上来开喷,要告诉楼主的是aop的运用,不许乱喷!!!

weixin_38894522
叫我小妖精 回复zezr: 你加我扣扣吧,我给你做了个小项目,里面有spring的配置详情,401725372,看不明白问我
2 年多之前 回复
weixin_38894522
叫我小妖精 回复zezr: 概念是用来理解的,不要背概念那么死板,大白话就是com.yt.sx.db.service.impl.下面的所有类,都是代理类,也就是面向了切面
2 年多之前 回复
qq_39817945
zezr * com.yt.sx.db.service.impl.*.*(**))这里代表了server实现层的路径,相当于调用到这个路径成会触发通知,我想知道这个通知会有什么实际作用。
2 年多之前 回复
qq_39817945
zezr <aop:pointcut expression="execution(* com.yt.sx.db.service.impl.*.*(**))" id="serviceMethods"/>:expression这个属性相当与切点, <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>这个相当与连接点。我能这样理解吗?
2 年多之前 回复

我博客里有多篇讲aop的使用,http://blog.csdn.net/tianyaleixiaowu/article/details/70853147

qq_39817945
zezr "(execution(* com.im..*.*(..))")这条语句是表示切点还是连接点啊
2 年多之前 回复

连接点是一个点,而切点可能是多个点。使用AOP当然是为了记录日志的啦

qq_39817945
zezr 能说一下上面的代码那个是切点,那个是连接点吗?感觉(execution(* com.im..*.*(..))")这个是切点,连接点是通过@Before注解让(execution(* com.im..*.*(..))")与befor方法连接,是这样理解吗
2 年多之前 回复

面向切面编程(AOP是Aspect Oriented Program的首字母缩写),面向对象的特点是继承、多态和封装。
已这些为起点去找答案,通俗点说,aop就是给你创建代理类,用代理类给你工作,这样做的目的是业务逻辑分层清晰。
例如action层是前台调用的接口,而你的server层就是业务逻辑处理层,这时候用aop面向切面变成,就用一个dao层去映射sql并且让server去实现,action层只需要调用dao层即可
方便了逻辑,且这样做的好处是维护方便,代码执行效率高!

qq_39817945
zezr 这时候用aop面向切面变成,就用一个dao层去映射sql并且让server去实现,action层只需要调用dao层即可。-这句话不是太明白,能举例下什么情况这样使用
2 年多之前 回复

AOP面向切面编程,这种定义公式的问题找度娘就行了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
AOP和IOC的概念以及在Spring中是如何应用?
几个框架都略略地过了一遍现在还是对:AOP和IOC的概念以及在Spring中是如何应用不是很理解,希望大家能帮帮忙。
spring和maven的面试题会问那些呢?
过两天准备去一家公司面试,听朋友说他们用Spring和其他一些框架。我以前只是自己学过Spring,知道IOC AOP的基本概念。但是工作三年了没在实际应用过,所以不知道Spring的面试题会面什么,那些事务的配置呀,注解的使用呀都是只在书上看过,没具体实践和应用过。请大家跟点意见,应该重点复习那些东西呢? 还有是他们要求会配置maven,这个也没用过,惭愧了了(一直做外包)。个人感觉这次机会挺好,有机会能做一些产品和应用性强的项目。请各位给点帮助,个人感觉本人还是比较好学的,如果实际工作中用到的技术或者工具,会很快的学习和掌握。但是对于不用的东西,学完了常时间不用也就忘记了,不知道大家是否有同感。
ssh面试题,不是熟手就不要进来了。
1 Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因 2.MVC,分析一下struts是如何实现MVC的 3.struts中的几个关键对象的作用(说说几个关键对象的作用) 4.说说AOP和IOC的概念以及在spring中是如何应用的 5.Hibernate有哪几种查询数据的方式 6.load()和get()的区别 7.谈谈hibernate的延迟加载和openSessionInView 8.spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。 9.Hibernate中的update()和saveOrUpdate()的区别. 10.Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。
使用JUnit4 测试spring时 报找不到bean的错误
在学习《spring 3.x 企业应用实战》第二节的demo时,自己用maven来构建的案例, 按照书中的讲解完成了持久层与业务层之后使用JUnit4来测试代码时发生了问题: 报错信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.feng.service.TestUserService': Injection of autowired dependencies failed; 项目结构: ![图片说明](https://img-ask.csdn.net/upload/201607/07/1467883693_80911.jpg) 业务层: ![图片说明](https://img-ask.csdn.net/upload/201607/07/1467883710_654321.jpg) JUnit测试类: ![图片说明](https://img-ask.csdn.net/upload/201607/07/1467883689_315544.jpg) 配置文件(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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "> <!-- ①扫描类包,将标注spring注解的类自动转化Bean,同时将Bean注入 --> <context:component-scan base-package="com.feng.controller" /> <!-- ②定义一个使用DBCP实现的数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/sampledb" p:username="root" p:password="root" /> <!-- ③定义jdbc的模板Bean --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" /> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" /> <!-- 通过AOP配置提供事务增强,让service包下的Bean的所有方法拥有事务 --> <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(*com.feng.service..*(..))" id="serviceMethod" /> <aop:advisor advice-ref="serviceMethod" advice-ref="serviceMethod" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" /> </tx:attributes> </tx:advice> </beans>
SSH无法访问Controller 层,index.jsp页面却能正常访问.
麻烦各位大佬看看 SpringMVC ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="cn.yunda.controller"/> <context:component-scan base-package="cn.yunda.service"/> <mvc:annotation-driven/> <!-- 配置jsp的视图解析,可以不配置,已经自动生成,在这里只是添加了前缀和后缀,在控制器中return的时候少写一点代码而已 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 上传文件的时候使用的视图解析,如果有文件上传才需要配置 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设定上传文件总大小 --> <property name="maxUploadSize" value="500000" /> <!-- 文件编码 --> <property name="defaultEncoding" value="UTF-8"/> </bean> ``` Web.xml ``` <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>TestVue</display-name> <!-- 加载配置文件Jar包文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 载入配置xml配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <!-- 文件路径 --> <param-value>classpath:spring/application-hibernate.xml</param-value> </context-param> <!-- 编码格式控制 --> <filter> <!-- 定义名 --> <filter-name>encodingFilter</filter-name> <!-- 加载类 --> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <!-- 输入编码值 --> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <!--forceEncoding用来设置是否理会 request.getCharacterEncoding()方法 --> <param-name>ForceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 设置encodingFiler 的映射路径 --> <filter-mapping> <!-- 定义名 --> <filter-name>encodingFilter</filter-name> <!-- 路径 --> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>SpringMvc</servlet-name> <!-- DispatcherSevlet负责将请求分发,所有的请求都有经过它来统一分发。 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/application-hibernate.xml</param-value> </init-param> <!-- 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。 正数的值越小,启动该servlet的优先级越高。 --> <load-on-startup>1</load-on-startup> </servlet> <!-- 设置映射路径 --> <servlet-mapping> <servlet-name>SpringMvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` Controller 层 ```package cn.yunda.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller(value="AppController") public class AppController { @RequestMapping(value="/login") public String login() { System.out.println("进入页面"); return "login"; } @RequestMapping("/") public String Home() { return "index"; } } ```
spring mvc+shiro+cas 实现cas client功能 跳转回来404
http://securitycenter.com:8080/gtsys/cas?ticket=ST-14-HEDhc1GVQt0UYdiZpi7R-cas 返回这个地址 404 ![图片说明](https://img-ask.csdn.net/upload/201510/09/1444404164_27274.png) ``` <?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" xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <!-- 定时器开关 开始 --> <task:annotation-driven /> <!-- 标注类型 的事务配置 如果使用注解事务。就放开 <tx:annotation-driven />--> <!-- 统一异常处理方式 --> <bean id="exceptionHandler" class="com.lanyuan.exception.MyExceptionHandler"/> <!-- 初始化数据 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driverClass}" /> </bean> <bean id="pagePlugin" class="com.lanyuan.plugin.PagePlugin"> <property name="properties"> <props> <prop key="dialect">mysql</prop> <prop key="pageSqlId">.*query.*</prop> </props> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动匹配Mapper映射文件 --> <property name="mapperLocations" value="classpath:mappings/*-mapper.xml"/> <property name="typeAliasesPackage" value="com.lanyuan.entity"/> <property name="plugins"> <array> <ref bean="pagePlugin" /> </array> </property> </bean> <!-- 通过扫描的模式,扫描目录在com.lanyuan.mapper目录下,所有的mapper都继承SqlMapper接口的接口, 这样一个bean就可以了 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.lanyuan.mapper" /> </bean> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- <aop:config> <aop:pointcut expression="execution(public * com.lanyuan.controller.*(..))" id="pointcut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="logicDelById" propagation="REQUIRED" /> </tx:attributes> </tx:advice> --> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="log4jHandlerAOP" class="com.lanyuan.logAop.LogAopAction"></bean> <aop:config proxy-target-class="true"> <aop:aspect id="logAspect" ref="log4jHandlerAOP"> <aop:pointcut id="logPointCut" expression="execution(* org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(..))" /> <aop:around method="logAll" pointcut-ref="logPointCut" /> </aop:aspect> </aop:config> --> <!-- 使用Spring组件扫描的方式来实现自动注入bean --> <context:component-scan base-package="com.lanyuan.task" /> <!-- 隐式地向 Spring 容器注册 --> <context:annotation-config /> </beans> spring-application.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:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <tx:annotation-driven /> <context:component-scan base-package="com.lanyuan.controller" /> <context:component-scan base-package="com.lanyuan.logAop" /> <!-- 启动对@AspectJ注解的支持 --> <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 注解支持 --> <context:annotation-config/> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven> <!-- 处理responseBody 里面日期类型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <import resource="spring-mvc-shiro.xml"/> </beans> spring-mvc.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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="credentialsMatcher" class="com.lanyuan.shiro.credentials.RetryLimitHashedCredentialsMatcher"> <!-- hashAlgorithmName必须的,没有默认值。可以有MD5或者SHA-1,如果对密码安全有更高要求可以用SHA-256或者更高。 这里使用MD5 storedCredentialsHexEncoded默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码 hashIterations迭代次数,默认值是1。 --> <constructor-arg ref="cacheManager" /> <property name="hashAlgorithmName" value="md5" /> <!--<property name="hashIterations" value="2" />--> <!--<property name="storedCredentialsHexEncoded" value="true" />--> </bean> <!-- 会话Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- sid如果改为JSESSIONID会导致重定向循环 --> <constructor-arg value="sid"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="-1"/> </bean> <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="2592000"/><!-- 30天 --> </bean> <!-- rememberMe管理器 --> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <!-- rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)--> <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> <property name="cookie" ref="rememberMeCookie"/> </bean> <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <!-- 凭证匹配器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm" /> <property name="sessionManager" ref="sessionManager"/> <!-- 使用下面配置的缓存管理器 --> <property name="cacheManager" ref="cacheManager" /> <property name="rememberMeManager" ref="rememberMeManager"/> <property name="subjectFactory" ref="casSubjectFactory"/> </bean> <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> <property name="arguments" ref="securityManager"/> </bean> <!--自定义Realm --> <!-- <bean id="myRealm" class="com.lanyuan.shiro.MyRealm"> <property name="credentialsMatcher" ref="credentialsMatcher" /> <property name="cachingEnabled" value="false" /> --> <!-- 如需要自定义缓存时间放开以下.修改 ehcache.xml--> <!--<property name="authenticationCachingEnabled" value="true"/>--> <!--<property name="authenticationCacheName" value="authenticationCache"/>--> <!--<property name="authorizationCachingEnabled" value="true"/>--> <!--<property name="authorizationCacheName" value="authorizationCache"/>--> <!-- </bean> --> <!-- <property name="userService" ref="userService"/> --> <bean id="casRealm" class="com.lanyuan.shiro.MyCasRealm"> <property name="cachingEnabled" value="true"/> <property name="authenticationCachingEnabled" value="true"/> <property name="authenticationCacheName" value="authenticationCache"/> <property name="authorizationCachingEnabled" value="true"/> <property name="authorizationCacheName" value="authorizationCache"/> <!--该地址为cas server地址 --> <property name="casServerUrlPrefix" value="${shiro.casServer.url}"/> <!-- 该地址为是当前应用 CAS 服务 URL,即用于接收并处理登录成功后的 Ticket 的, 必须和loginUrl中的service参数保持一致,否则服务器会判断service不匹配--> <property name="casService" value="${shiro.client.cas}"/> </bean> <bean id="sysUserFilter" class="com.lanyuan.shiro.filter.SysUserFilter"/> <bean id="kickoutSessionControlFilter" class="com.lanyuan.shiro.filter.KickoutSessionControlFilter"> <property name="cacheManager" ref="cacheManager"/> <property name="sessionManager" ref="sessionManager"/> <property name="kickoutAfter" value="false"/> <property name="maxSession" value="1"/> <property name="kickoutUrl" value="/login.shtml"/> </bean> <bean id="casFilter" class="org.apache.shiro.cas.CasFilter"> <!--配置验证错误时的失败页面(Ticket 校验不通过时展示的错误页面) --> <property name="failureUrl" value="${shiro.failureUrl}"/> </bean> <bean id="casLogoutFilter" class="io.github.howiefh.cas.session.CasLogoutFilter"> <property name="sessionManager" ref="sessionManager"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"> <property name="redirectUrl" value="${shiro.logout.url}"/> </bean> <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- <property name="loginUrl" value="/login.shtml" /> <property name="successUrl" value="/index.shtml" /> --> <property name="loginUrl" value="${shiro.login.url}"/> <property name="successUrl" value="${shiro.login.success.url}"/> <property name="unauthorizedUrl" value="/denied.jsp" /> <!-- 自定义权限配置 --> <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" /> <property name="filters"> <util:map> <entry key="cas" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter" /> <entry key="casLogout" value-ref="casLogoutFilter" /> <entry key="sysUser" value-ref="sysUserFilter"/> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </util:map> </property> </bean> <!--自定义filterChainDefinitionMap --> <bean id="chainDefinitionSectionMetaSource" class="com.lanyuan.shiro.ChainDefinitionSectionMetaSource"> <property name="filterChainDefinitions"> <value> /casFailure.jsp = anon /cas = casLogout,cas /logout = logout /favicon.ico = anon /admin_files/** = anon /fonts/** = anon /404/** = anon /error.jsp = anon /js/** = anon /layer-v1.9.2/** = anon /notebook/** = anon /login.shtml = anon /denied.jsp = anon /install.shtml = anon /lanyuan.shtml = anon /** = casLogout,user </value> </property> </bean> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 会话DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean> <!-- 会话验证调度器 --> <!-- 全局的会话信息检测扫描信息间隔30分钟--> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 会话管理器 --> <!-- 全局的会话信息设置成30分钟,sessionValidationSchedulerEnabled参数就是是否开启扫描 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionDAO" ref="sessionDAO"/> <property name="sessionIdCookieEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean> <!--shiro缓存管理器 --> <bean id="cacheManager" class="com.lanyuan.shiro.spring.SpringCacheManagerWrapper" > <property name="cacheManager" ref="springCacheManager"/> </bean> <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcacheManager"/> </bean> <!--ehcache--> <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> </beans> spring-shiro.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <display-name>gtsys</display-name> <!-- 单点登出 --> <!-- <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-shiro.xml,classpath:spring-application.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <async-supported>true</async-supported> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.eot</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.shtml</welcome-file> </welcome-file-list> </web-app> web.xml ## shiro shiro.session.timeout=1800000 shiro.session.validate.timespan=1800000 # cas\u767B\u5F55URL shiro.login.url=https://localhost:8443/cas-server/login?service=http://securitycenter.com:8080/gtsys/cas # cas logout shiro.logout.url=https://localhost:8443/cas-server/logout?service=http://securitycenter.com:8080/gtsys # cas\u767B\u5F55\u6210\u529F\u8DF3\u8F6CURL shiro.login.success.url=http://securitycenter.com:8080/gtsys/index.shtml # cas\u670D\u52A1\u5668URL shiro.casServer.url=https://localhost:8443/cas-server # \u5BA2\u6237\u7AEFCAS\u767B\u5F55URL shiro.client.cas=http://securitycenter.com:8080/gtsys/cas # \u5BA2\u6237\u7AEFCAS\u9A8C\u8BC1\u5931\u8D25\u8DF3\u8F6CURL shiro.failureUrl=/casFailure.jsp ## dataSource dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 dataSource.username=root dataSource.password=1234 properties文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir"/> <!-- <diskStore>==========当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口) * <diskStore path="">==用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index * name=================缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里) * maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大 * maxElementsInMemory==内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况 * 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 * 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 * eternal==============缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds * timeToIdleSeconds====缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性 * 即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除 * timeToLiveSeconds====缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大 * 即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除 * overflowToDisk=======内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中) * 会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data * diskPersistent=======是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 * 这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存 * 要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法 * diskExpiryThreadIntervalSeconds==磁盘缓存的清理线程运行间隔,默认是120秒 * diskSpoolBufferSizeMB============设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB * memoryStoreEvictionPolicy========内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 * 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) --> <!-- 注意,以下缓存是永久有效,是系统初始化数据到缓存中,如果不需要永久有效,请另写,或在 --> <cache name="cache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> </cache> <!-- 登录记录缓存 锁定10分钟 --> <cache name="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <!-- <cache name="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> --> <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="shiro-kickout-session" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache> ehcache.xml package com.lanyuan.shiro; //import com.github.zhangkaitao.shiro.chapter15.service.UserService; import java.util.List; import javax.inject.Inject; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.cas.CasRealm; import org.apache.shiro.subject.PrincipalCollection; import com.lanyuan.entity.ResFormMap; import com.lanyuan.mapper.ResourcesMapper; import com.lanyuan.mapper.UserMapper; /** * <p>User: Zhang Kaitao * <p>Date: 14-2-13 * <p>Version: 1.0 */ public class MyCasRealm extends CasRealm { // private UserService userService; // // public void setUserService(UserService userService) { // this.userService = userService; // } @Inject private ResourcesMapper resourcesMapper; @Inject private UserMapper userMapper; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal(); // PathMatchingFilterChainResolver SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //authorizationInfo.setRoles(userService.findRoles(username)); // authorizationInfo.setStringPermissions(userService.findPermissions(username)); String userId = SecurityUtils.getSubject().getSession().getAttribute("userSessionId").toString(); List<ResFormMap> rs = resourcesMapper.findUserResourcess(userId); for (ResFormMap resources : rs) { authorizationInfo.addStringPermission(resources.get("resKey").toString()); } return authorizationInfo; } } MyCasRealm.java ``` ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config proxy-target-class="true"></aop:config> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans> spring-mvc-shiro.xml ``` 这个是更改 网上的蓝缘系统的 cas server 和cas client参考的 http://howiefh.github.io/2015/05/19/shiro-cas-single-sign-on/?utm_source=tuicool 不知道为什么会返回404
dwr框架结合Spring框架不能调用DAO方法
想用dwr框架做一个不刷新页面,验证用户名存不存在的方法,但是页面始终无法实现方法,后台不报错,只是在JSP页面上弹出ERROR错误。 后台已经测试,可以正确进入对应方法CheckData,并且email也传入进去了,但就是不能调用userBiz方法。 怀疑跟Spring框架结合有错误,两次查询了Spring配置,都是正确的,请问何解? 下面贴jsp相关代码: [code="java"] /*邮箱名是否注册检查*/ function checkResult1(){ var result=null; var email = document.getElementById('email').value; if(email <= 5){ result='<span class="STYLE7">用户名必须大于5个字符</span>'; document.getElementById('result1').innerHTML=result; }else if(email > 50){ result='<span class="STYLE7">用户名必须小于50个字符</span>'; document.getElementById('result1').innerHTML=result; }else{ CheckOccupied.checkEmailOccupied(email,msg1); } } function msg1(data){ var result = null; if(data == "yes"){ result='<img src="../images/check_right.gif" alt="">'; }else if(data == "no"){ result='<span class="STYLE7">该用户名已注册,请更换用户名或<a href="#">登录</a></span>'; }else{ result='数据错误'; } document.getElementById('result1').innerHTML=result; } [/code] spring框架相关代码: [code="java"] <!-- 声明事务管理器 --> <bean id="myHibTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 基于@Transactional注解方式的事务管理 --> <tx:annotation-driven transaction-manager="myHibTransactionManager" /> <!-- 定义事务通知 --> <tx:advice id="txAdvice" transaction-manager="myHibTransactionManager"> <!-- 指定事务传播规则 --> <tx:attributes> <!-- 对get打头的方法应用SUPPORTS事务规则 --> <tx:method name="get*" propagation="SUPPORTS" /> <!-- 对其他方法应用REQUIRED事务规则 --> <tx:method name="*" propagation="REQUIRED"></tx:method> </tx:attributes> </tx:advice> <!-- 定义切面,并将事务通知和切面组合(定义哪些方法应用事务规则) --> <aop:config> <!-- 对com.tyyf.biz包下的所有类的所有方法都应用事务规则 --> <aop:pointcut id="bizMethods" expression="execution(* com.tyyf.biz.*.*(..))" /> <!-- 将事务通知和切面组合 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" /> </aop:config> <bean id="checkData" class="com.tyyf.dwr.CheckData" scope="prototype"> <property name="userBiz" ref="userBiz" /> </bean> [/code] java代码: [code="java"] User user = new User(); // 使用UserBiz接声明属性userBiz,并添加set方法,用于依赖注入 UserBiz userBiz; public void setUserBiz(UserBiz userBiz) { this.userBiz = userBiz; } public String checkEmailOccupied(String email) { user.setEmail(email); if (userBiz.getUser(user) != null) { return "no"; } else { return "yes"; } } [/code] dwr配置代码: [code="java"] <dwr> <allow> <create creator="new" javascript="CheckOccupied"> <param name="class" value="com.tyyf.dwr.CheckData" /> </create> </allow> </dwr> [/code]
Spring mvc 空指针错误
LoginController ``` @Controller public class LoginController { @RequestMapping("test") public void login() { LoginServiceImp loginService = new LoginServiceImp(); loginService.loadUserInfo(); } } ``` LoginServiceImp ``` public class LoginServiceImp implements ILoginService { LoginDaoImp loginDao = new LoginDaoImp(); /* * (non-Javadoc) * * @see * com.sani.service.ILoginService#loadUserInfo(com.sani.bean.UserInfoBean) */ public List loadUserInfo() { return loginDao.loadUserInfo(); } } ``` LoginDaoImp ``` public class LoginDaoImp extends BaseDao implements ILoginDao { /* * (non-Javadoc) * * @see com.sani.dao.ILoginDao#loadUserInfo() */ public List<UserInfoBean> loadUserInfo() { String sql = "select NOW();"; List tmpList = this.getJdbcTemplate().queryForList(sql); System.out.println(tmpList.size()); return tmpList; } } ``` BaseDao ``` public class BaseDao extends JdbcDaoSupport { Logger log = Logger.getLogger(this.getClass().getName()); } ``` web.xml ``` <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 字符编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- 应用上下文配置文件 --> <!-- Spring 容器加载 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-db.xml</param-value> </context-param> <!-- 配置spring核心servlet --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- url-pattern配置为/,不带文件后缀,会造成其它静态文件(js,css等)不能访问。如配为*.do,则不影响静态文件的访问 --> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> ``` spring-servlet.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射--> <mvc:annotation-driven /> <!-- 允许对静态资源文件的访问 --> <mvc:default-servlet-handler /> <!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean --> <context:component-scan base-package="com.sani.controller" /> <context:component-scan base-package="com.sani.service" /> <context:component-scan base-package="com.sani.dao" /> <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 --> <!-- jsp视图解析器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> <property name="order" value="1" /> </bean> </beans> ``` spring-db.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:aop="http://www.springframework.org/schema/aop" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:task="http://www.springframework.org/schema/task" 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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd" default-autowire="byName"> <!-- <context:property-placeholder location="classpath:jdbc.properties" /> --> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" lazy-init="false"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/wms" /> <property name="user" value="root" /> <property name="password" value="123" /> <!--连接池中保留的最小连接数。 --> <property name="minPoolSize"> <value>5</value> </property> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize"> <value>30</value> </property> <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize"> <value>10</value> </property> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime"> <value>60</value> </property> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement"> <value>5</value> </property> <!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> <property name="maxStatements"> <value>0</value> </property> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod"> <value>60</value> </property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts"> <value>30</value> </property> <!-- 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false --> <property name="breakAfterAcquireFailure"> <value>true</value> </property> <!-- 因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false --> <property name="testConnectionOnCheckout"> <value>false</value> </property> </bean> <!-- 配置Jdbc模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" lazy-init="false"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="baseDAO" class="com.sani.dao.imp.BaseDao" lazy-init="false"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean> </beans> ``` 现在只要调用action—test就会空指针 是什么原因?应该这么改?
ssh的spring 无法注入怎么回事
<strong>UserInfoDAOImpl.java</strong> <br /><pre name="code" class="java">@Service public class UserInfoDAOImpl extends HibernateDaoSupport implements UserInfoDAO { public boolean login(Userinfo userinfo) { boolean isExist = false; Userinfo temp = (Userinfo)this.getHibernateTemplate().find("from Userinfo u where u.username=?", userinfo.getUsername()).get(0); try { if(userinfo.getPassword().equals(temp.getPassword())) isExist = true; } catch(Exception e) { e.printStackTrace(); } System.out.println("id:" + temp.getId()); System.out.println("username:" + temp.getUsername()); System.out.println("password:" + temp.getPassword()); System.out.println("isExist:" + isExist); return isExist; } }</pre> <br /><strong>LoginAction.java</strong> <br /><pre name="code" class="java">@Component @Results(value={ @Result(name="success", location="/login_success.jsp"), @Result(name="fail", location="/Login.jsp") }) public class LoginAction extends ActionSupport { private Userinfo userinfo; @Autowired private UserInfoDAO userInfoDAOImpl; public Userinfo getUserinfo() { return userinfo; } public void setUserinfo(Userinfo userinfo) { this.userinfo = userinfo; } public UserInfoDAO getUserInfoDAOImpl() { return userInfoDAOImpl; } public void setUserInfoDAOImpl(UserInfoDAO userInfoDAOImpl) { System.out.println("注入"); this.userInfoDAOImpl = userInfoDAOImpl; } @Action("login") public String login() { System.out.println("id:" + userinfo.getId()); System.out.println("username:" + userinfo.getUsername()); System.out.println("password:" + userinfo.getPassword()); if(userInfoDAOImpl == null) System.out.println("error"); if(userinfo == null) return "fail"; else return (userInfoDAOImpl.login(userinfo))?"success":"fail"; } }</pre> <br /><strong>applicationContext.xml</strong> <br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-lazy-init="true"&gt; &lt;bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; &lt;property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /&gt; &lt;property name="ignoreResourceNotFound" value="true" /&gt; &lt;property name="locations"&gt; &lt;list&gt; &lt;value&gt;classpath:application.properties&lt;/value&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;context:component-scan base-package="org.sales.dao.Impl" /&gt; &lt;!-- 数据源配置,使用应用内的DBCP数据库连接池 --&gt; &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; &lt;!-- Connection Info --&gt; &lt;property name="driverClassName" value="${jdbc.driverClassName}" /&gt; &lt;property name="url" value="${jdbc.url}" /&gt; &lt;property name="username" value="${jdbc.username}" /&gt; &lt;property name="password" value="${jdbc.password}" /&gt; &lt;/bean&gt; &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt; &lt;property name="dataSource" ref="dataSource" /&gt; &lt;property name="namingStrategy"&gt; &lt;bean class="org.hibernate.cfg.ImprovedNamingStrategy" /&gt; &lt;/property&gt; &lt;property name="hibernateProperties"&gt; &lt;props&gt; &lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt; &lt;prop key="hibernate.show_sql"&gt;${hibernate.show_sql}&lt;/prop&gt; &lt;prop key="hibernate.format_sql"&gt;${hibernate.format_sql}&lt;/prop&gt; &lt;prop key="hibernate.cache.provider_class"&gt;org.hibernate.cache.EhCacheProvider&lt;/prop&gt; &lt;!-- &lt;prop key="hibernate.cache.provider_configuration_file_resource_path"&gt;${hibernate.ehcache_config_file}&lt;/prop&gt;--&gt; &lt;/props&gt; &lt;/property&gt; &lt;property name="packagesToScan" value="org.sales.entity" /&gt; &lt;property name="annotatedClasses"&gt; &lt;list&gt; &lt;value&gt;org.sales.entity.Iteminfo&lt;/value&gt; &lt;value&gt;org.sales.entity.Cardinfo&lt;/value&gt; &lt;value&gt;org.sales.entity.Positioninfo&lt;/value&gt; &lt;value&gt;org.sales.entity.Sellinfo&lt;/value&gt; &lt;value&gt;org.sales.entity.Userinfo&lt;/value&gt; &lt;value&gt;org.sales.entity.Voteinfo&lt;/value&gt;&lt;/list&gt; &lt;/property&gt;&lt;/bean&gt; &lt;bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" &gt; &lt;property name="sessionFactory" ref="sessionFactory"/&gt; &lt;/bean&gt; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;property name="sessionFactory" ref="sessionFactory" /&gt; &lt;/bean&gt; &lt;tx:annotation-driven transaction-manager="transactionManager" /&gt; &lt;bean id="CardinfoDAO" class="org.sales.entity.CardinfoDAO"&gt; &lt;property name="sessionFactory"&gt; &lt;ref bean="sessionFactory" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="IteminfoDAO" class="org.sales.entity.IteminfoDAO"&gt; &lt;property name="sessionFactory"&gt; &lt;ref bean="sessionFactory" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="PositioninfoDAO" class="org.sales.entity.PositioninfoDAO"&gt; &lt;property name="sessionFactory"&gt; &lt;ref bean="sessionFactory" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="SellinfoDAO" class="org.sales.entity.SellinfoDAO"&gt; &lt;property name="sessionFactory"&gt; &lt;ref bean="sessionFactory" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="UserinfoDAO" class="org.sales.entity.UserinfoDAO"&gt; &lt;property name="sessionFactory"&gt; &lt;ref bean="sessionFactory" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="VoteinfoDAO" class="org.sales.entity.VoteinfoDAO"&gt; &lt;property name="sessionFactory"&gt; &lt;ref bean="sessionFactory" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;/beans&gt;</pre> <br /><strong>web.xml</strong> <br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;classpath*:applicationContext.xml&lt;/param-value&gt; &lt;/context-param&gt; &lt;filter&gt; &lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;param-name&gt;singleSession&lt;/param-name&gt; &lt;param-value&gt;true&lt;/param-value&gt; &lt;/init-param&gt; &lt;/filter&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; &lt;filter&gt; &lt;filter-name&gt;struts2Filter&lt;/filter-name&gt; &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;struts2Filter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;welcome-file-list&gt; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt; &lt;/welcome-file-list&gt; &lt;/web-app&gt; </pre> <br /> <br />结果在LoginAction.java里面输出: <br />id:null <br />username:username <br />password:USERNAME <br />error <br />说明: error是当被注入的属性为空的时候输出. <br /> 求解~ <br /> <br /><strong>异常(网页上的):</strong> <br />HTTP Status 500 - <br /> <br />type Exception report <br /> <br />message <br /> <br />description The server encountered an internal error () that prevented it from fulfilling this request. <br /> <br />exception <br /> <br />java.lang.NullPointerException <br /> org.sales.actions.LoginAction.login(LoginAction.java:53) <br /> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) <br /> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) <br /> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) <br /> java.lang.reflect.Method.invoke(Method.java:597) <br /> com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441) <br /> com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280) <br /> com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)<br/><strong>问题补充</strong><br/><div class="quote_title">xixix2004 写道</div><div class="quote_div">有异常吗。<br /> <br />敢不敢把异常发出来看一下。</div><br />发了<br/><strong>问题补充</strong><br/><div class="quote_title">xixix2004 写道</div><div class="quote_div">好吧,应该不需要异常,请把ACTION里定义的DAO的变量名,变得和xml里定义的BEAN ID属性一致。</div><br />xml里面没有对应的bean,因为使用注释<br/><strong>问题补充</strong><br/><div class="quote_title">yyf365 写道</div><div class="quote_div">可能和楼主的应用写法不太相同,请问你其他的service是否能注入成功呢?,不过是否能试试在applicationContext配置文件中的声明方式换一种呢?<br /><br />如:<br />&lt;bean id="UserInfoDAO"<br /> class="UserInfoDAOImp"&gt;<br /> &lt;/bean&gt;<br />这种形式注入,实例化由spring托管,而在action中只对UserInfoDAO的service进行注入呢<br /><br />而如果出了该service无法注入外,其他其余的service都能正常注入使用,那就另想办法了</div><br /> 可是这种方法有点麻烦,我想实现注释注入,xml文件里面有个扫描的:<br /> &lt;context:component-scan base-package="org.sales.dao.Impl" /&gt;&nbsp; <br/><strong>问题补充</strong><br/>已经试过在 <strong>applicationContext.xml</strong> 文件里面添加<br /><pre name="code" class="xml">&lt;bean id="userInfoDAOImpl" class="org.sales.dao.Impl.UserInfoDAOImpl"&gt; &lt;/bean&gt; &lt;bean id="loginAction" class="org.sales.actions.LoginAction"&gt; &lt;property name="userInfoDAOImpl"&gt; &lt;ref bean="userInfoDAOImpl" /&gt; &lt;/property&gt; &lt;/bean&gt;</pre><br /><br />异常信息一样.<br/><strong>问题补充</strong><br/><div class="quote_title">xixix2004 写道</div><div class="quote_div"><div class="quote_title">bbinglongg 写道</div><div class="quote_div"><div class="quote_title">xixix2004 写道</div><div class="quote_div">好吧,应该不需要异常,请把ACTION里定义的DAO的变量名,变得和xml里定义的BEAN ID属性一致。</div><br />xml里面没有对应的bean,因为使用注释</div><br /><br /><br />你完全没看懂我在说什么。<br /><br /><pre name="code" class="java">private UserInfoDAO userinfoDAO; </pre><br /><pre name="code" class="java"> &lt;bean id="userinfoDAO" class="org.sales.entity.UserinfoDAO"&gt; &lt;property name="sessionFactory"&gt; &lt;ref bean="sessionFactory" /&gt; &lt;/property&gt; &lt;/bean&gt; </pre><br /><br /><br /><br /></div><br />在它上面有一句:<br /><pre name="code" class="java">@Autowired</pre><br />是自动注入的意思<br/><strong>问题补充</strong><br/><div class="quote_title">xixix2004 写道</div><div class="quote_div">&lt;ref bean="UserInfoDAO" /&gt;这里的REF的BEAN, 写你之前定义的BEAN的ID。你可明白?</div><br />明白<br/><strong>问题补充</strong><br/><div class="quote_title">dwbin 写道</div><div class="quote_div">loginAction没有进行spring托管。<br />这个类spring不会自己进行注入的。你的ssh整合有问题</div><br /><br />那我应该怎么修改呢?<br/><strong>问题补充</strong><br/><div class="quote_title">dwbin 写道</div><div class="quote_div">loginAction没有进行spring托管。<br />这个类spring不会自己进行注入的。你的ssh整合有问题</div><br />在 <pre name="code" class="java">@Autowired</pre> 这个标签里面已经是注入了
Spring整合hibernate4时出现no session错误
首先将eclipse抛出的错误贴出来: ``` 严重: Servlet.service() for servlet [springDispatcherServlet] in context with path [/VideoMngSys] threw exception [Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread] with root cause org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:988) at com.vincent.videosys.dao.BaseDao.getSession(BaseDao.java:17) at com.vincent.videosys.dao.UserDao.usernameExist(UserDao.java:29) at com.vincent.videosys.service.UserService.usernameExistService(UserService.java:19) at com.vincent.videosys.controller.home.UserController.usernameExist(UserController.java:40) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod (RequestMappingHandlerAdapter.java:748) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter.java:689) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle (AbstractHandlerMethodAdapter.java:83) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931) .... ``` ![项目工程结构如下:](https://img-ask.csdn.net/upload/201601/02/1451707793_69876.png) 下面依次贴出我的相关文件代码: 1.web.xml ``` <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 加载Spring配置文件,Spring应用上下文,理解层次化的ApplicationContext --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 可以将POST请求转为PUT请求和DELETE请求 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- The front controller of this Spring Web application, responsible for handling all application requests --> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Map all requests to the DispatcherServlet for handling --> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app> ``` 2.spring-mvc.xml ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ......> <!-- 向Spring容器注册AutowiredAnnotationBeanPostProcessor、 CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPostProcessor、 RequiredAnnotationBeanPostProcessor,使系统能识别注解 --> <context:annotation-config /> <!-- 使用annotation自动注册bean,并检查@Controller、@Service、@Repository --> <context:component-scan base-package="com.vincent.videosys"></context:component-scan> <!-- 导入资源文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置C3P0数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean> <!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <property name="packagesToScan"> <list> <value>com.vincent.videosys.*</value> </list> </property> </bean> <!-- 配置hibernate的事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 定义AutoWired自动注入bean --> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean> <!-- 用注解来实现事务管理 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 3. 配置事务切入点, 再把事务属性和事务切入点关联起来 --> <aop:config> <aop:pointcut expression="execution(* com.vincent.videosys.service.*.*(..))" id="txPointcut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config> </beans> ``` 4.hibernate.cfg.xml ``` <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <!-- JDBC connection pool (use the built-in) --> <!-- <property name="connection.pool_size">1</property>--> <!-- 数据库使用的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Echo all executed SQL to stdout --> <!-- 设置 打印输出 sql 语句 为真 --> <property name="hibernate.show_sql">true</property> <!-- 设置格式为 sql --> <property name="hibernate.format_sql">true</property> <!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 --> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</property> </session-factory> </hibernate-configuration> ``` 5.db.properties jdbc.user=root jdbc.password=root jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql://localhost:3306/videomngsys jdbc.initPoolSize=5 jdbc.maxPoolSize=10 6. BaseDao.java ``` package com.vincent.videosys.dao; import javax.annotation.Resource; ..... @Repository("baseDao") public class BaseDao{ @Autowired protected SessionFactory sessionFactory; public Session getSession(){ return this.sessionFactory.getCurrentSession(); } } ``` 7.UserDao.java ``` package com.vincent.videosys.dao; import org.hibernate.Query; import org.hibernate.Session; .... @Repository("userDao") public class UserDao extends BaseDao{ protected SessionFactory sessionFactory; /** * 查看该用户名在数据库中是否存在 * 存在返回true * 不存在返回false * 默认返回true * @param username * @return */ public boolean usernameExist(String username){ boolean exist = true; String hqlString = "from user where username = :username"; Session session = super.getSession(); Query query = session.createQuery(hqlString); query.setParameter("username", username); List<User> list = query.list(); if(list.size() > 0) { exist = false; } return exist; } } ``` 8 UserService.java ``` package com.vincent.videosys.service; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; ... @Transactional @Service("userService") public class UserService { @Autowired private UserDao userDao; public boolean usernameExistService(String username){ return userDao.usernameExist(username); } } ``` 9. UserController.java ``` package com.vincent.videosys.controller.home; import java.util.HashMap; import java.util.Map; import javax.annotation.Resource; ..... @RequestMapping("/user") @Controller public class UserController { @Autowired private UserService userService; @ResponseBody @RequestMapping(value="/usernameExist",method=RequestMethod.POST) public Map<String, String> usernameExist(@RequestParam("username")String usernameString ){ Map<String, String> resultMap = new HashMap<String, String>(); System.out.println("username: "+usernameString); if(userService.usernameExistService(usernameString)){ resultMap.put("status", "1");//exits } else{ resultMap.put("status", "0");//not exist } return resultMap; } } ``` 每次程序执行到UserController类中的userNameExist方法时,开始调用userService中的方法时,便开始抛出错误.....
spring3 + hibernate 4.1 配置的问题
项目用:spring MVC + spring 3.2.4 + Hibernate 4.2.6+spring security3.1.4 在启动容器时,spring security 通过hibernate去数据库加载权限时,报:No Session found for current thread异常。 异常如下: [code="java"] Caused by: org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:990) at com.seveng.weixin.foundation.dao.support.HibernateGenericDao.getSession(HibernateGenericDao.java:58) at com.seveng.weixin.foundation.dao.support.HibernateGenericDao.getAll(HibernateGenericDao.java:85) at com.seveng.weixin.foundation.security.filter.support.WeixinInvocationSecurityMetadataSourceService.loadResourceDefine(WeixinInvocationSecurityMetadataSourceService.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:344) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:295) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:130) ... 60 more [/code] spring MVC 配置文件:spring-mvc.xml [code="xml"] <mvc:annotation-driven /> <!-- 开启controller注解支持 --> <context:component-scan base-package="com.seveng.weixin" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> [/code] spring 主配置文件: [code="xml"] <context:component-scan base-package="com.seveng.weixin"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> [/code] 事务的配置: [code="xml"] <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="merge*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="put*" propagation="REQUIRED" /> <tx:method name="use*" propagation="REQUIRED" /> <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到 --> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="list*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true"> <!-- 对业务逻辑层实施事务 --> <aop:pointcut id="txPointcut" expression="execution(* com.seveng.weixin..service.impl.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> </aop:config> <aop:aspectj-autoproxy expose-proxy="true"/> <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" /> [/code] 数据库数相关配置: [code="xml"] <!-- 加载资源文件 --> <context:property-placeholder location="classpath:config/database.properties" /> <!-- 数据库映射 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${connection.driver_class}" /> <property name="url" value="${connection.url}" /> <property name="username" value="${connection.username}" /> <property name="password" value="${connection.password}" /> </bean> <!-- hibernate 需要的信息 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>com.seveng.weixin.**.model.*</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop> <prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop> <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop> <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> <prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop> <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop> <prop key="hibernate.cache.use_structured_entries">${hibernate.cache.use_structured_entries}</prop> <prop key="net.sf.ehcache.configurationResourceName">${net.sf.ehcache.configurationResourceName}</prop> <prop key="hibernate.current_session_context_class">${hibernate.current_session_context_class}</prop> </props> </property> </bean> [/code] spring security 相关配置: [code="xml"] <!-- 不拦截的请求 --> <security:http pattern="/login" security="none" /> <security:http pattern="/images/**" security="none" /> <security:http pattern="/css/**" security="none" /> <security:http pattern="/js/**" security="none" /> <!-- 保护应用程序的所有URL --> <security:http auto-config="true"> <!-- login-page: 指定登录页面 --> <security:form-login login-page="/login" /> <security:logout logout-success-url="/login" /> <!-- 会话管理配置 ,设置最多登录一次,二次登录会让第一次登录失效, 则设置error-if-maximum-exceeded为false,要求第一次有效设置为true --> <security:session-management invalid-session-url="/login"> <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="false" /> </security:session-management> <!-- 增加一个自定义的filter,放在FILTER_SECURITY_INTERCEPTOR之前, 实现用户、角色、权限、资源的数据库管理。 --> <security:custom-filter ref="weixinFilter" before="FILTER_SECURITY_INTERCEPTOR" /> </security:http> <!-- 一个自定义的filter,必须包含authenticationManager, accessDecisionManager,securityMetadataSource三个属性。 --> <bean id="weixinFilter" class="com.seveng.weixin.foundation.security.filter.WeixinFilterSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager" /> <property name="accessDecisionManager" ref="weixinAccessDecisionManager" /> <property name="securityMetadataSource" ref="weixinInvocationSecurityMetadataSourceService" /> </bean> <!-- 注意能够为authentication-manager 设置alias别名 --> <security:authentication-manager alias="authenticationManager"> <security:authentication-provider user-service-ref="appUserDetailsService"> <security:password-encoder ref="passwordEncoder"> <security:salt-source user-property="username" /> </security:password-encoder> </security:authentication-provider> </security:authentication-manager> <!-- 事件监听:实现了 ApplicationListener监听接口,包括AuthenticationCredentialsNotFoundEvent 事件, AuthorizationFailureEvent事件,AuthorizedEvent事件, PublicInvocationEvent事件 --> <bean class="org.springframework.security.authentication.event.LoggerListener" /> <!-- 用户的密码加密或解密 --> <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" /> <!-- 启用用户的缓存功能 --> <bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache"> <property name="cache" ref="userEhCache" /> </bean> <bean id="userEhCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheName" value="userCache" /> <property name="cacheManager" ref="cacheManager" /> </bean> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" > <property name="configLocation" value="classpath:config/ehcache.xml" /> </bean> [/code] 当容器启动时,spring security加载权限的代码 [code="java"] @PostConstruct @Transactional public void loadResourceDefine() { List<Authority> authorities = this.getAll(Authority.class); // 应当是资源为key, 权限为value。 资源通常为url, 权限就是那些以ROLE_为前缀的角色。 一个资源可以由多个权限来访问。 resourceMap = new HashMap<String, Collection<ConfigAttribute>>(); for (Authority auth : authorities) { ConfigAttribute ca = new SecurityConfig(auth.getAuthName()); Set<Resource> resources = auth.getResources(); for (Resource res : resources) { String url = res.getResString(); // 判断资源文件和权限的对应关系,如果已经存在相关的资源url,则要通过该url为key提取出权限集合,将权限增加到权限集合中 if (resourceMap.containsKey(url)) { Collection<ConfigAttribute> value = resourceMap.get(url); value.add(ca); resourceMap.put(url, value); } else { Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>(); atts.add(ca); resourceMap.put(url, atts); } } } } [/code]
使用activeMQ监听,调用mapper时为null怎么解决,请大神帮忙看看
**spring文件配置如下:** <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/jms"> <context:annotation-config/> <context:component-scan base-package="com.lizx" /> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <!-- 定义事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 定义事务策略 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--所有以query开头的方法都是只读的 --> <tx:method name="query*" read-only="true" /> <tx:method name="get*" read-only="true" /> <!--其他方法使用默认事务策略 --> <tx:method name="delete*" propagation="REQUIRED" read-only="false"/> <tx:method name="edit*" propagation="REQUIRED" read-only="false"/> <tx:method name="add*" propagation="REQUIRED" read-only="false"/> </tx:attributes> </tx:advice> <aop:config> <!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型, 这里星号表明匹配所有返回类型。 com.bw.service.*.*(..)表明匹配com.bw.service包下的所有类的所有 方法 --> <aop:pointcut id="myPointcut" expression="execution(* com.lizx.app.service.*.*(..))" /> <!--将定义好的事务处理策略应用到上述的切入点 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" /> </aop:config> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <!-- 加载mybatis.cfg.xml文件 --> <property name="configLocation" value="classpath:conf/SqlMapConfig.xml"></property> <!-- 自动扫描需要定义类别名的包,将包内的JAVA类的类名作为类别名 --> <property name="typeAliasesPackage" value="com.lizx.app"></property> </bean> <!-- 自动扫描所有的Mapper接口与文件 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.lizx.app.mapper"></property> </bean> <import resource="classpath*:conf/spring-ActiveMQ.xml" /> </beans> ------------------------------------ **activemq配置如下:** <?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:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd"> <mvc:annotation-driven /> <amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://127.0.0.1:61616" userName="admin" password="admin" /> <!-- 配置JMS连接工长 --> <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <constructor-arg ref="amqConnectionFactory" /> <property name="sessionCacheSize" value="100" /> </bean> <!-- 定义消息队列(Queue) --> <bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue"> <!-- 设置消息队列的名字 --> <constructor-arg> <value>Jaycekon</value> </constructor-arg> </bean> <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="defaultDestination" ref="demoQueueDestination" /> <property name="receiveTimeout" value="10000" /> <!-- true是topic,false是queue,默认是false,此处显示写出false --> <property name="pubSubDomain" value="false" /> </bean> <!-- 配置消息队列监听者(Queue) --> <bean id="queueMessageListener" class="com.lizx.app.MQListener" /> <bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="demoQueueDestination" /> <property name="messageListener" ref="queueMessageListener" /> </bean> </beans> ------------------------------------ **在监听中使用为null时的情况** ![图片说明](https://img-ask.csdn.net/upload/201802/25/1519561067_682041.png) **在其它地方调用,不为null时的情况:** ![图片说明](https://img-ask.csdn.net/upload/201802/25/1519561131_923727.png)
在Spring注解驱动配置下使用Quartz调度有问题,大家帮忙看看
最近一直在使用JSF+Hibernate+Spring的配置进行项目二期的重构与开发,并采用了注解的方式,确实减少了很大的工作量。 但目前碰到一个问题,就是需要在其中使用调度程序,每天执行一些调度处理。 之前一期项目中使用了XML配置方式,调度能正常运行,而现在采用注解后就不行了。 代码如下: [code="java"] /** * 报表调度器 * * @author angeltears 2009-11-22 * */ public class ReportScheduler { protected Logger logger = LoggerFactory.getLogger(ReportScheduler.class); private static final int SIZE_PER_TIME = 5000; private ReportCatalogBS reportCatalogBS; private RptModifyIntBS rptModifyIntBS; public void doFromModify2MakeJob() { ...... } public void doSummaryJob() { ...... } } [/code] 此类用于执行调度,方法doFromModify2MakeJob和doSummaryJob都是调度执行的方法。它们在不同的时间点分别执行。 XML配置文件如下: [code="java"] <?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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 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/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" default-lazy-init="true"> <!-- import resource="securityContext.xml" / --> <!-- 定义受环境影响易变的变量 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <!-- 标准配置 --> <value>classpath*:/application.properties </value> <!-- 本地开发环境配置 --> <!-- value>classpath*:/application.local.properties</value --> <!-- 服务器生产环境配置 --> <!-- <value>file:/var/myapp/application.server.properties</value> --> </list> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" p:initialSize="5" p:maxActive="100" p:maxIdle="30" p:maxWait="1000" p:poolPreparedStatements="true" p:defaultAutoCommit="false" /> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="csvServiceDao" class="com.fenet.gddb.cds.dao.csv.CsvServiceDao"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean> <!-- 数据源配置,使用应用服务器的数据库连接池 --> <!-- <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" /> --> <!-- Hibernate配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource"> <property name="namingStrategy"> <bean class="org.hibernate.cfg.ImprovedNamingStrategy" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.generate_statistics">${hibernate.generate_statistics} </prop> <prop key="hibernate.cache.use_query_cache"> ${hibernate.cache.use_query_cache} </prop> <prop key="hibernate.cache.use_second_level_cache"> ${hibernate.cache.use_second_level_cache} </prop> <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments} </prop> <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size} </prop> <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size} </prop> <prop key="hibernate.query.factory_class"> ${hibernate.query.factory_class} </prop> <prop key="hibernate.cache.provider_class"> ${hibernate.cache.provider_class} </prop> <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file} </prop> </props> </property> <property name="packagesToScan" value="com.fenet.gddb.cds.model.*,com.fenet.gddb.cds.model.*.*,com.fenet.gddb.cds.model.*.*.*" /> </bean> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 事务管理器配置,多数据源JTA事务--> <!-- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager or WebLogicJtaTransactionManager" /> --> <context:component-scan base-package="com.fenet.gddb.cds" /> <context:annotation-config /> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="reportScheduler" class="com.fenet.gddb.cds.scheduler.ReportScheduler"> <property name="reportCatalogBS" ref="reportCatalogBS" /> <property name="rptModifyIntBS" ref="rptModifyIntBS" /> </bean> <bean id="summaryJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="reportScheduler" /> <property name="targetMethod" value="doSummaryJob" /> </bean> <bean id="summaryJobCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="summaryJobDetail" /> <!-- 每天18点10分到20点执行,每隔1分钟执行一次 --> <property name="cronExpression" value="0 10/1 18,20 * * ?" /> <!-- 每月的最后一天18点10分开始到20点之间,每隔1分钟运行一次的执行 --> <!--property name="cronExpression" value="0 10/1 18,20 L * ?" /--> </bean> <bean id="modify2MakeJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="reportScheduler" /> <property name="targetMethod" value="doFromModify2MakeJob" /> </bean> <bean id="modify2MakeTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="modify2MakeJobDetail" /> <!-- 每天0点至6点执行,每隔30分钟运行一次 --> <property name="cronExpression" value="0 10/5 18,20 * * ?" /> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="modify2MakeTrigger" /> <ref bean="summaryJobCronTrigger" /> </list> </property> </bean> </beans> [/code] Web.xml中的ContextLoaderListener和contextConfigLocation都配置了,但在指定的时间内,却一点反应也没有,请各路英雄解救下!谢谢了 [b]问题补充:[/b] 我明天试试,谢谢! 另外,spring封装quartz类SchedulerFactoryBean不能使用惰加载,和<bean class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="true" > 是冲突的吧?不能使用惰加载不是应该设置为lazy-init="false"吗
多数据源spring 报java.lang.NullPointerException
在调用test.java的时候就会报 Exception in thread "main" java.lang.NullPointerException at cn.m_solution.mds.mds40.service.MDS40T01Service.getStudent(MDS40T01Service.java:23) at cn.m_solution.mds.mds40.service.test.main(test.java:13) 请大家一定帮忙,已经弄了两天了 [color=red]moduleContext-sys.xml:[/color] <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- +++++++++++++++++++++++++++++++++++++++++ --> <!-- 系统关联设定(必须) --> <!-- +++++++++++++++++++++++++++++++++++++++++ --> <bean id="ApplicationInfo" class="net.uniuvo.webridger.beans.ApplicationInfo"> <!-- 应用系统名称 --> <property name="applicationName" value="mds" /> <!-- 允许直接访问的Action列表 --> <property name="directAccessActions"> <list> <value>mds00.do</value> <value>/mds13.do</value> <value>/mds40.do</value> </list> </property> <!-- 禁止访问的扩展名列表 --> <property name="prohibitedExtensions"> <list> <value>js</value> <value>css</value> <value>jsp</value> <value>html</value> </list> </property> <!-- 禁止访问的扩展名中例外的文件列表 --> <property name="restrictionEscapeFiles"> <list> <value>/pages/index.html</value> <value>/pages/mds40/mds40s00.jsp</value> </list> </property> </bean> <!-- +++++++++++++++++++++++++++++++++++++++++ --> <!-- 数据库关联设定(必须) --> <!--此bean告诉Spring去哪找数据库的配置信息,因为有此Bean才出现下面用${}标记来取变量的语句--> <!-- +++++++++++++++++++++++++++++++++++++++++ --> <!-- 这里定义了ibatis的配置文件所在的位置 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>/WEB-INF/config/jdbc/jdbc.properties</value> </property> </bean> <!-- <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">--> <bean id="ds0" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName0}" /> <property name="url" value="${jdbc.url0}" /> <property name="username" value="${jdbc.username0}" /> <property name="password" value="${jdbc.password0}" /> </bean> <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName1}" /> <property name="url" value="${jdbc.url1}" /> <property name="username" value="${jdbc.username1}" /> <property name="password" value="${jdbc.password1}" /> </bean> <bean id="DataSource" class="net.uniuvo.webridger.dao.DynamicDataSource"> <property name= "targetDataSources"> <map key-type="java.lang.String"> <entry key="ds0" value-ref="ds0"/> <entry key="ds1" value-ref="ds1"/> </map> </property> <property name="defaultTargetDataSource" ref="ds0"/> </bean> <!--这里就声明了具体的事务 --> <bean id="attrSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"> <property name="properties"> <props> <prop key="execute*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="select*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 定义事务处理拦截器 --> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref local="transactionManager" /> </property> <property name="transactionAttributeSource"> <ref local="attrSource" /> </property> </bean> <!-- 定义事务经理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="DataSource" /> </property> </bean> <!-- 自动代理 (业务处理Bean的Id) --> <bean id="autoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <idref bean="transactionInterceptor" /> </list> </property> <property name="beanNames"> <list> <value>*Service</value> </list> </property> </bean> <!-- iBATIS相关设定 --> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="/WEB-INF/sqlMapConfig.xml" /> <property name="dataSource"> <ref bean="DataSource" /> </property> <property name="lobHandler"> <ref local="oracleLobHandler" /> </property> </bean> <!-- 定义DAO --> <!-- 检索用DAO --> <bean id="queryDAO" class="net.uniuvo.webridger.dao.QueryDAOiBatisImpl"> <property name="sqlMapClient"> <ref local="sqlMapClient" /> </property> </bean> <!-- 追加 更新 删除用DAO --> <bean id="updateDAO" class="net.uniuvo.webridger.dao.UpdateDAOiBatisImpl"> <property name="sqlMapClient"> <ref local="sqlMapClient" /> </property> </bean> <!--根据sqlMapClien创建一个SqlMapClient模版类--> <bean id="SqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"> <property name="sqlMapClient"> <ref bean="sqlMapClient" /> </property> </bean> <bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" /> <bean id="oracleLobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.OracleLobHandler" > <property name="nativeJdbcExtractor"><ref local="nativeJdbcExtractor"/></property> </bean> <!-- 这里就是Facade了,注意,它有个parent属性,就是这个属性,使它的操作受到了事物管理的限制 <bean id="baseFacade" parent="baseTransactionProxy"> <property name="target"> <bean class="facade.BaseFacadeImpl"> 把DAO做为属性注入到Facade中去 <property name="proDao" ref="proDao" /> <property name="errDao" ref="errDao" /> <property name="userDao" ref="userDao" /> <property name="orderDao" ref="orderDao" /> </bean> </property> </bean> --> </beans> [color=red]sqlmapconfig.xml[/color] <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/> <typeHandler jdbcType="CLOB" javaType="java.lang.String" callback="org.springframework.orm.ibatis.support.ClobStringTypeHandler" /> <sqlMap resource="../config/sql/sqlMap-mds.xml" /> <sqlMap resource="../config/sql/sqlMap-mds00.xml" /> <sqlMap resource="../config/sql/sqlMap-mds01.xml" /> <sqlMap resource="../config/sql/sqlMap-mds02.xml" /> <sqlMap resource="../config/sql/sqlMap-mds03.xml" /> <sqlMap resource="../config/sql/sqlMap-mds04.xml" /> <sqlMap resource="../config/sql/sqlMap-mds10.xml" /> <sqlMap resource="../config/sql/sqlMap-mds11.xml" /> <sqlMap resource="../config/sql/sqlMap-mds12.xml" /> <sqlMap resource="../config/sql/sqlMap-mds13.xml" /> <sqlMap resource="../config/sql/sqlMap-mds20.xml" /> <sqlMap resource="../config/sql/sqlMap-mds21.xml" /> <sqlMap resource="../config/sql/sqlMap-mds22.xml" /> <sqlMap resource="../config/sql/sqlMap-mds23.xml" /> <sqlMap resource="../config/sql/sqlMap-mds30.xml" /> <sqlMap resource="../config/sql/sqlMap-mds31.xml" /> <sqlMap resource="../config/sql/sqlMap-mds32.xml" /> <sqlMap resource="../config/sql/sqlMap-mds33.xml" /> <sqlMap resource="../config/sql/sqlMap-mds40.xml" /> </sqlMapConfig> sqlMap-mds40.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap > <select id="sql.mds40.001" parameterClass="cn.m_solution.mds.mds40.form.MDS40Form" resultClass="cn.m_solution.mds.mds40.form.MDS40Form"> select syr from vehicle where hpzl = #hpzl# and hphm = #hphm# </select> </sqlMap> MDS40T01Service package cn.m_solution.mds.mds40.service; import org.springframework.orm.ibatis.SqlMapClientTemplate; import cn.m_solution.mds.mds40.form.MDS40Form; public class MDS40T01Service { SqlMapClientTemplate sqlMapClientTemplate; public MDS40Form getStudent(){ MDS40Form form40 = new MDS40Form(); sqlMapClientTemplate.queryForObject("sql.mds40.001",form40); return form40; } /** * @return the sqlMapClientTemplate */ public SqlMapClientTemplate getSqlMapClientTemplate() { return sqlMapClientTemplate; } /** * @param sqlMapClientTemplate the sqlMapClientTemplate to set */ public void setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate) { this.sqlMapClientTemplate = sqlMapClientTemplate; } } test.java package cn.m_solution.mds.mds40.service; import org.springframework.jdbc.core.support.JdbcDaoSupport; public class test extends JdbcDaoSupport{ /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MDS40T01Service s = new MDS40T01Service(); s.getStudent(); } }
有人可以解决一下关于“ 通配符的匹配很全面, 但无法找到元素 'tx:advice' 的声明”的问题
``` xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 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.1.xsd http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!--配置sessionFactory 将数据源注入,并设置hibernate的基本配置 --> <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/hiber_first"></property> <property name="username" value="root"></property> <property name="password" value="chen007"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="datasource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!-- 配置映射文件, --> <property name="mappingResources" value="cn/cc/vo/Person.hbm.xml"/> </bean> <!--将SessionFactory 注入DAO,拥有sessionFactory容器后才容易进行presistent操作 --> <bean id="userDao" class="cn.cc.springIntergratingHibernate.IUserDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!--设置事务管理,需要注入sessionFactory --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> <!--配置事务增强处理器 --> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> 所有以get开头的方法只有只读权限 <tx:method name="get*" read-only="true"/> 其他方法使用默认设置 <tx:method name="*"/> </tx:attributes> </tx:advice> <aop:config> <!--指定在IUserDao切入点 使用txAdvice事务增强处理--> <aop:pointcut expression="bean(IUserDao)" id="userPointcut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="userPointcut"/> </aop:config> <!--配置事务拦截器 transactionInterceptor,需要注入TransactionManager --> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <!--为事务拦截器注入一个管理器 --> <property name="transactionManager" ref="transactionManager"></property> <property name="transactionAttributes"> <!--定义事务传播属性 --> <props> <prop key="save">PROPAGATION_REQUIRED</prop> <prop key="delete">PROPAGATION_REQUIRED</prop> <prop key="check">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!--定义BeanNameAutoProxyCreator代理,自动创建相关bean --> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!--指定哪些bean自动生成代理 --> <property name="beanNames"> <list> <value>userDao</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> </beans> ``` 可以看出来nameSpace已经导入了相关的应用了,但还是找不到
Spring中dao的值注入不到业务层,配置文件中的sessionFactory创建也不起作用
<p>只有在dao层能得到数据,传不到Biz层,如果在Biz层  buyinfoDAO=new BuyinfoDAOImpl();就没问题了,但就没有依赖注入的意义了</p> <p>java代码:</p> <p> </p> <p>applicationContext.xml配置:</p> <p>&lt;bean id="sessionFactory"<br> class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br> &lt;property name="configLocations"&gt;<br> &lt;list&gt;&lt;value&gt;classpath:hibernate.cfg.xml&lt;/value&gt;&lt;/list&gt;<br> &lt;/property&gt;<br><br> &lt;/bean&gt;<br><br><br> &lt;!-- 配置Hibernate的事务管理器 --&gt;<br> &lt;!-- 使用HibernateTransactionManager类实现基于Hibernate的事务管理器 --&gt;<br> &lt;bean id="TxManager"<br> class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br> &lt;property name="sessionFactory" ref="sessionFactory" /&gt;<br> &lt;/bean&gt;<br><br> &lt;!-- 定义事物通知,需要指定一个事务管理器 --&gt;<br> &lt;tx:advice id="txAdvice" transaction-manager="TxManager"&gt;<br> &lt;tx:attributes&gt;<br> &lt;tx:method name="get*" read-only="true" /&gt;<br> &lt;tx:method name="find*" read-only="true" /&gt;<br> &lt;tx:method name="search*" read-only="true" /&gt;<br> &lt;tx:method name="query*" read-only="true" /&gt;<br> &lt;tx:method name="add*" propagation="REQUIRED" /&gt;<br> &lt;tx:method name="del*" propagation="REQUIRED" /&gt;<br> &lt;tx:method name="update*" propagation="REQUIRED" /&gt;<br> &lt;tx:method name="do*" propagation="REQUIRED" /&gt;<br> &lt;tx:method name="*" read-only="true" /&gt;<br> &lt;/tx:attributes&gt;<br> &lt;/tx:advice&gt;<br> &lt;aop:config&gt;<br> &lt;!-- 定义那些方法应用这些规则 --&gt;<br> &lt;aop:pointcut id="serviceMethod" expression="execution(* com.jxc.biz.*.*(..))" /&gt;<br> &lt;!-- 将应用通知与应用规则方法组合 --&gt;<br> &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" /&gt;<br> &lt;/aop:config&gt;<br><br> &lt;!-- 配置用户处理DAO  --&gt;<br> &lt;bean id="buyinfoDAO" class="com.jxc.dao.impl.BuyinfoDAOImpl"&gt;<br> &lt;property name="sessionFactory" ref="sessionFactory"&gt;&lt;/property&gt;<br> &lt;/bean&gt;<br><br><br> &lt;!-- 配置用户业务处理Biz --&gt;<br> &lt;bean id="buyinfoBiz" class="com.jxc.biz.impl.BuyinfoBizImpl"&gt;<br> &lt;property name="buyinfoDAO" ref="buyinfoDAO"&gt;&lt;/property&gt;<br> &lt;/bean&gt;<br><br> &lt;!-- 配置用户处理Action --&gt;<br> &lt;bean id="buyinfoaction" class="com.jxc.action.BuyinfoAction"&gt;<br> &lt;property name="buyinfoBiz" ref="buyinfoBiz"&gt;&lt;/property&gt;<br> &lt;/bean&gt;<br>&lt;/beans&gt;</p> <p> </p> <p> </p> <p>dao实现类</p> <p>package com.jxc.dao.impl;<br><br>import java.util.List;<br><br>import org.hibernate.Query;<br>import org.hibernate.Session;<br>import org.hibernate.Transaction;<br>import org.springframework.orm.hibernate3.support.HibernateDaoSupport;<br><br>import com.jxc.bean.Buyinfo;<br>import com.jxc.dao.BuyinfoDAO;<br>import com.jxc.util.HibernateSessionFactory;<br><br>public class BuyinfoDAOImpl extends HibernateDaoSupport implements BuyinfoDAO {<br>    Session session=null;<br><br>    public List&lt;Buyinfo&gt; select() {<br>        session=HibernateSessionFactory.getSession();<br>        String hql="from Buyinfo";<br>        Query query = session.createQuery(hql);<br>        List list=query.list();<br>      /*  List&lt;Buyinfo&gt; list=this.getHibernateTemplate().find("from Buyinfo");*/用这种方法得不到值<br>        <br>        return list;<br>    }<br><br>    /**<br>     * @param args<br>     */<br>    public static void main(String[] args) {<br>        BuyinfoDAOImpl buyinfoDAOImpl=new BuyinfoDAOImpl();<br>        List&lt;Buyinfo&gt; list=buyinfoDAOImpl.select();<br>        System.out.println(list.size());<br>    }<br><br><br>}</p> <p> </p> <p>biz层:</p> <p>package com.jxc.biz.impl;<br><br>import java.util.List;<br><br>import com.jxc.bean.Buyinfo;<br>import com.jxc.biz.BuyinfoBiz;<br>import com.jxc.dao.BuyinfoDAO;<br>import com.jxc.dao.impl.BuyinfoDAOImpl;<br><br>public class BuyinfoBizImpl implements BuyinfoBiz {<br>    <br>    private BuyinfoDAO buyinfoDAO ;<br><br>    public void setBuyinfoDAO(BuyinfoDAO buyinfoDAO) {<br>        this.buyinfoDAO = buyinfoDAO;<br>    }<br><br><br><br>    <br>    /**<br>     * 查询进货记录<br>     */<br>    public List select() {<br>      //buyinfoDAO=new BuyinfoDAOImpl();<br>        List&lt;Buyinfo&gt; list=null;<br>        try {<br>            list = this.buyinfoDAO.select();<br>        } catch (Exception e) {<br>            <br>            e.printStackTrace();<br>        }<br>        return list;<br>    }<br>  <br>    public static void main(String[] args){<br>        BuyinfoBizImpl buy = new BuyinfoBizImpl();<br>        List list=buy.select();<br>        System.out.println(list.size());<br>        <br>        <br>        <br>    }<br>    <br>}</p> <p> </p> <p>package com.jxc.action;<br><br>import java.util.List;<br>import java.util.Map;<br><br>import com.jxc.bean.Buyinfo;<br>import com.jxc.biz.BuyinfoBiz;<br>import com.jxc.biz.impl.BuyinfoBizImpl;<br>import com.opensymphony.xwork2.ActionContext;<br>import com.opensymphony.xwork2.ActionSupport;<br><br><br><br>public class BuyinfoAction extends ActionSupport {<br>    private Buyinfo buy=null;<br>    private BuyinfoBiz buyinfoBiz;<br>    public Buyinfo getBuy() {<br>        return buy;<br>    }<br>    public void setBuy(Buyinfo buy) {<br>        this.buy = buy;<br>    }<br>    <br>    public void setBuyinfoBiz(BuyinfoBiz buyinfoBiz) {<br>        this.buyinfoBiz = buyinfoBiz;<br>    }<br> <br>    @SuppressWarnings("unchecked")<br>    public String select(){<br>        Map session = ActionContext.getContext().getSession();<br>        BuyinfoBizImpl b=new BuyinfoBizImpl();<br>        List list=null;<br>        try {<br>            list = b.select();<br>        } catch (Exception e) {<br>            // TODO Auto-generated catch block<br>            e.printStackTrace();<br>        }<br>        session.put("buyinfo", list);<br>        return "select";<br>        <br>        <br>    }<br>  <br><br>}</p> <p> </p> <p> </p>
jquery ajax方法调用在session超时以后如何跳转到登录页面?
jquery ajax方法调用在session超时以后如何跳转到登录页面? session超时以后虽然被过滤器过滤到了,但是并不会跳转到登录页面请求具体的解决方法。 我参考了这篇文章,但是我调用ajaxStart不起作用。 http://www.blogjava.net/vickzhu/archive/2009/06/05/280223.html ext jquery 用户访问超时(ext session过期) 解决两种情况下的用户访问超时。 a)普通http请求的session超时。 b)异步http请求的session超时,使用ext后大部分的界面刷新都是异步的ajax请求。 不管是那种类型的http请求总是可以由一个过滤器来捕捉。 分类:普通http请求的header参数中没有x-requested-with:XMLHttpRequest头信息,而异步的有。 其实对于常见的ajax框架,header中还有标示自己身份的header信息。 对于普通的http请求,发现session超时后直接重定向到一个超时页面,显示访问超时。 对于异步http请求,发现session超时后则向请求的response中写入特定的超时头信息,客户端ajax对象检测 头信息,发现有超时状态标志后调用显示超时信息的javascript方法,提示用户访问超时。 服务器端session超时后在过滤器中为response添加新的头信息,标记该请求超时: if(r.getHeader("x-requested-with")!=null && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ response.setHeader("sessionstatus","timeout"); } 使用Ext.Ajaxt对象完成异步请求的交互,Ext.Ajax是单实例对象(非常重要,全局单一Ext.Ajax实例!)。 注册Ext.Ajax的requestcomplete事件,每个ajax请求成功后首先响应该事件。在该事件的回调函数里面判断 访问请求是否超时。使用Ext.Ajax对象的好处是,只需要引入一个包含了几行超时处理代码的js文件,就可以 为当前应用增加超时处理功能,原有代码不需要做任何修改。 使用Ext.Ajaxt对象完成异步请求交互,假如checkUserSessionStatus是你的回调方法,每个页面引用: Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this); function checkUserSessionStatus(conn,response,options){ //Ext重新封装了response对象 if(typeof response.getResponseHeader.sessionstatus != 'undefined'){ //发现请求超时,退出处理代码... } } 可以利用的几个特性:a)所有的ajax请求均带有x-requested-with:XMLHttpRequest头信息b)Ext.Ajax是单实例对象(非常重要,全局单一Ext.Ajax实例!)c)注册Ext.Ajax的requestcomplete事件,每个ajax请求成功后首先响应该事件(概念类似spring的aop拦截)。 jquery提供了几个全局事件可以用来处理session过期请求,如当ajax请求开始时会触发ajaxStart()方法的回调函数;当ajax请求结束时,会触发ajaxStop()方法的回调函数。这些方法都是全局的方法,因此无论创建它们的代码位于何处,只要有ajax请求发生时,都会触发它们。类似的事件还有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。 如果使某个ajax请求不受全局方法的影响,那么可以在使用$.ajax()方法时,将参数中的global设置为false,jquery代码如下:$.ajax({ url:"test.html", global:false//不触发全局ajax事件}) 对于其他的ajax框架,解决用户访问请求超时这个问题的思路是类似的。
昨天正常,今天不正常的问题 Error creating bean with name 'sessionFactory'
[size=large]这样的配置用了好久了,一直没出状况,今天突然出状况了,而且重新集成ssh框架后也是同样的错误,郁闷中...,MyEclipse启动tomcat就报错,不知所谓何? 贴出来请教下有遇到此问题的大侠:[/size] 平台采用ssh框架,集成环境的jar包是用MyEclipse8.0M2自动创建, [img]http://dl.iteye.com/upload/attachment/188763/761d5160-fb8c-3b87-bbbb-c9e23a7c008f.png[/img] 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:p="http://www.springframework.org/schema/p" 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.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- 定义数据源Bean --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://127.0.0.1:3306/task_system?useUnicode=true&amp;characterEncoding=UTF-8"> </property> <property name="username" value="root"></property> <property name="password" value="1234"></property> </bean> <!--定义了Hibernate的SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.jdbc.batch_size">20</prop> </props> </property> <property name="mappingResources"> <list> <value>/pojo/UserDept.hbm.xml</value> <value>/pojo/UserEmployee.hbm.xml</value> <value>/pojo/UserJob.hbm.xml</value> </list> </property> </bean> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 报错: 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) [b]问题补充:[/b] 问题解决了,是我不知道什么时候把jsp页面的struts标签里加个html标签了,肯定是放错位置了,后来纠正后,又不小心还原了一下吧,所以没发现,今天看了楼下的朋友的答案,提醒了我,在jsp页面里把代码分段删除测试,终于发现问题之所在了。谢谢您的热心,多亏您提醒我。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
C++(数据结构与算法):62---搜索树(二叉搜索树、索引二叉搜索树)
一、搜索树的复杂度分析 本文考察二叉搜索树和索引二叉搜索树 二叉搜索树的渐进性能可以和跳表媲美: 查找、插入、删除操作所需的平均时间为Θ(logn) 查找、插入、删除操作的最坏情况的时间为Θ(n) 元素按升序输出时所需时间为Θ(n) 虽然在最坏情况下的查找、插入、删除操作,散列表和二叉搜索树的时间性能相同,但是散列表在最好的情况下具有超级性能Θ(1) 不过,对于一个指定的关键...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
立即提问