三大框架都用到了java 的反射机制。在Struts中,Action代理正是利用了Java的反射机制创建出了Action实例;在Hibernate中,在将数据库中的数据封装成Java对象时,需要调用pojo的set方法,这用的就是反射机制;在Spring中,它管理的bean都是通过反射机制创建出来的
hibernate中的延迟加载
在Struts中,约定大于配置。前台请求的路径如project!list.action ,按照Struts的约定,则会跳到ProjectAction中执行list方法 ,
如果该方法返回的字符串是info,那么按照Struts的约定 所以 web包中放的Action类取名都是xxxAction(此处为ProjectAction),而放在WEB-INF下的content文件夹下的JSP取名都是xxx-xxx.jsp(此处为project-info.jsp)。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <constant name="struts.action.extension" value="jspx"></constant> <constant name="struts.convention.default.parent.package" value="myPackage" /> <constant name="struts.convention.package.locators" value="web"/> <constant name="struts.convention.package.locators.basePackage" value="com" /> 这两行明确了Action类存放的位置 <package name="myPackage" extends="struts-default"> <!--约定大于配置,所以这里省略了Action的配置--> </package> </struts>
Spring中最核心的组建就是Bean,原来Spring解决了一个非常关键的问题他可以让 你把对象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制
Context就是一个Bean关系的集合,这个关系集合又叫Ioc容器,一旦建立起这个Ioc容器后Spring就可以为你工作了
Core就是发现、建立和维护每 个Bean之间的关系所需要的一些列的工具,从这个角度看来,Core这个组件叫Util更能让你理解。
单独使用 | 整合使用 |
---|---|
单独使用Struts时,需要①在web.xml中配置Struts2的过滤器 ②在源文件夹下建立Struts的配置文件,内容主要为对Action的配置 |
①仍需要在web.xml中配置Struts2的过滤器 ②仍在源文件夹下建立Struts的配置文件,区别在于根据 约定大于配置,省略了对Action的配置,增加了三个常量 说明Action组建的位置 |
单独使用Hibernate时,需要①在实体包中建立数据映射文件xxx.hbm.xml, 内容主要为对Java对象和数据库表中的数据之间映射的配置 ②在源文件夹下建立Hibernate.cfg.xml,内容主要为对使用的数据库的配置 以及对数据映射文件位置的配置 ③在源文件夹下建立ehcache.xml文件 |
①可以仍在实体包中建立数据映射文件,但经常采用JPA注释 取代基于xml的数据映射的配置 ②省略了Hibernate.cfg.xml,对数据库的配置在源文件夹下的 applicationContext.xml中进行 ③仍在在源文件夹下建立ehcache.xml文件 |
单独使用Spring,需要 ①在源文件夹下建立applicationContext.xml的配置文件 主要内容为对Bean节点的配置以及对Bean之间关系的说明 |
①仍在在源文件夹下建立applicationContext.xml的配置文件 ②需要在web.xml中进行一系列的配置 |
基于注释的ssh项目中的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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 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"> <!-- 对目标包使用注释注入 --> <context:component-scan base-package="com"/> 后者没有这一行 <!-- 声明注释的驱动 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 声明dataSource(使用dbcp,也可以使用c3p0),运用了数据库连接池技术,--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql:///projectdb"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> <property name="initialSize" value="5"></property> <property name="maxActive" value="20"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="packagesToScan" value="com.pojo"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop> </props> </property> </bean> <!-- 声明JDBC事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 声明 HibernateTemplate--> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
基于xml文件配置的ssh项目中的applicationContext.xml文件
位置 | 主要配置项 | |
---|---|---|
web.xml | WebRoot/WEB-INF/ | ①Spring的字符集过滤器---统一网页的码型 ②openSessionInview-----为了将Hibernate的Session生命周期延长至一次Http请求,满足对视图的渲染 ③Struts过滤器----Struts的核心控制器 ④Spring的监听器-----为了读取到ApplicationContext.xml文件 |
applicationContext.xml | 源文件夹etc下 | ①启用注释进行依赖注入,使用注释定义事务 ②配置数据源 ③配置Hibernate会话工厂sessionFactory ④事务管理器transactionManager |
applicationContext-shiro.xml | 源文件夹etc下 | |
struts.xml | 源文件夹etc下 | 主要对Action进行配置 如果遵循了“约定”,无需对Action进行配置,但需要增加常量说明Action的包位置 |
ehcache.xml | 源文件夹etc下 | <?xml version="1.0" encoding="UTF-8"?> <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> </ehcache> |
<?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>springEncoding</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>springEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- OpenSessionInview 作用??延长session的生命周期 --> <filter> <filter-name>openSessionInView</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- shiroFilter 权限框架 (session 与 struts 之间) <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>--> <!-- Struts框架,本来Struts就需要在web.xml中配置一个过滤器,现在不变 --> <filter> <filter-name>Struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 监听器,为了读取到applicationContext文件--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:applicationContext*.xml </param-value> </context-param> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>