• 傅老师课堂:Java高级应用之Struts2+Spring2+Hibernate3大集成


    开篇一笑:一对情侣,非常恩爱,但男友喜欢说脏话,一天女友提出要带男友回家吃个饭,见见家长,千叮万嘱让男友别说脏话,男友在家憋了一晚上没说一句脏话,天气寒冷,到走的时候女友家长要出来送他们,男友客气的说了一句:叔叔,别送了,你看阿姨冻那个逼样。

    本片文章详细介绍了如何使用SSH搭建系统架构,同学们只要按照老师教的步骤,绝对能够融会贯通,一气呵成,犹如坐春风般的舒适感,有木有?!我看到下面有个别同学已经按耐不住一颗躁动的心了,那就不用废话了,随着老师的节奏躁动起来吧,你离架构师就差那么一点了。
    环境:jdk-1_5_0_14、struts-2.1.6、spring-framework-2.5.5、hibernate-3.2、jstl -1.1.2
    一、 Struts2
    1、 包:
    xwork-2.1.2.jar
    freemarker-2.3.13.jar
    struts2-core-2.1.6.jar
    commons-logging-1.0.4.jar
    commons-io-1.3.2.jar
    commons-fileupload-1.2.1.jar
    ognl-2.6.11.jar
    struts2-spring-plugin-2.1.6.jar
    说明:Struts2官方提供的插件struts2-spring-plugin-2.1.6.jar,直接与spring进行整合,只需要在配置文件Struts.properties设置:struts.objectFactory=spring,这样,就将struts2的对象管理交给了spring2的IOC容器。
    2、  配置web.xml文件
    任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载。
    通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts 2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts 2框架。
    因为Struts 2将核心控制器设计成Filter,而不是一个普通Servlet。故为了让Web应用加载FilterDispacher,只需要在web.xml文件中配置FilterDispatcher即可。
    配置FilterDispatcher的代码片段如下:

    <!-- 配置Struts 2框架的核心Filter -->
         <filter>
            <!-- 配置Struts 2核心Filter的名字 -->
            <filter-name>struts</filter-name>
            <!-- 配置Struts 2核心Filter的实现类 -->
            <filter-class>
                org.apache.struts2.dispatcher.FilterDispatcher
            </filter-class>
            <init-param>
                <!-- 配置Struts 2框架默认加载的Action包结构 -->
                <param-name>actionPackages</param-name>
                <param-value>
                    org.apache.struts2.showcase.person
                </param-value>
            </init-param>
            <!-- 配置Struts 2框架的配置提供者类 -->
            <init-param>
                <param-name>configProviders</param-name>
                <param-value>lee.MyConfigurationProvider</param-value>
            </init-param>
        </filter>
    

    正如上面看到的,当配置Struts 2的FilterDispatcher类时,可以指定一系列的初始化参数,为该Filter配置初始化参数时,其中有3个初始化参数有特殊意义:
    config:该参数的值是一个以英文逗号(,)隔开的字符串,每个字符串都是一个XML配置文件的位置。Struts 2框架将自动加载该属性指定的系列配置文件。
    actionPackages:该参数的值也是一个以英文逗号(,)隔开的字符串,每个字符串都是一个包空间,Struts 2框架将扫描这些包空间下的Action类。
    configProviders:如果用户需要实现自己的ConfigurationProvider类,用户可以提供一个或多个实现了ConfigurationProvider接口的类,然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开。
    除此之外,还可在此处配置Struts 2常量,每个<init-param>元素配置一个Struts 2常量,其中<param-name>子元素指定了常量name,而<param-value>子元素指定了常量value。
    提示   关于Struts 2常量的讲解,请参阅本书的4.1.2节。
    在web.xml文件中配置了该Filter,还需要配置该Filter拦截的URL。通常,我们让该Filter拦截所有的用户请求,因此使用通配符来配置该Filter拦截的URL。
    下面是配置该Filter拦截URL的配置片段:

    <!-- 配置Filter拦截的URL -->
        <filter-mapping>
            <!-- 配置Struts 2的核心FilterDispatcher拦截所有用户请求 -->
            <filter-name>struts</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping> 

    配置了Struts 2的核心FilterDispatcher后,基本完成了Struts 2在web.xml文件中的配置。
    如果Web应用使用了Servlet 2.3以前的规范,因为Web应用不会自动加载Struts 2框架的标签文件,因此必须在web.xml文件中配置加载Struts 2标签库。
    配置加载Struts 2标签库的配置片段如下:

    <!-- 手动配置Struts 2的标签库 -->
    <taglib>
        <!-- 配置Struts 2标签库的URI -->
        <taglib-uri>/s</taglib-uri>
        <!-- 指定Struts 2标签库定义文件的位置 -->                    
        <taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
    </taglib>  

    在上面配置片段中,指定了Struts 2标签库配置文件物理位置:/WEB-INF/struts- tags.tld,因此我们必须手动复制Struts 2的标签库定义文件,将该文件放置在Web应用的WEB-INF路径下。
    如果Web应用使用Servlet 2.4以上的规范,则无需在web.xml文件中配置标签库定义,因为Servlet 2.4规范会自动加载标签库定义文件。
    提示   Struts 2的标签库定义文件包含在struts2-core-2.0.6.jar文件里,在struts2-core-2.0.6.jar文件的META-INF路径下,包含了一个struts-tag.tld文件,这个文件就是Struts 2的标签库定义文件,Servlet 2.4规范会自动加载该标签库文件。
    对于Servlet 2.4以上的规范,Web应用自动加载该标签库定义文件。加载struts-tag.tld标签库定义文件时,该文件的开始部分包含如下代码片段:

        <taglib>
            <!-- 定义标签库的版本 -->
            <tlib-version>2.2.3</tlib-version>
            <!-- 定义标签库所需的JSP版 -->
            <jsp-version>1.2</jsp-version>
            <short-name>s</short-name>
            <!-- 定义Struts 2标签库的URI -->
            <uri>/struts-tags</uri>
        </taglib>

    3、 建立struts.xml和struts.properties
    Struts.xml配置文件详解:

    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
    <struts>
        <!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
        <include file="struts-default.xml"></include>
        <!-- package提供了将多个Action组织为一个模块的方式
            package的名字必须是唯一的 package可以扩展 当一个package扩展自
            另一个package时该package会在本身配置的基础上加入扩展的package
            的配置 父package必须在子package前配置
            name:package名称
            extends:继承的父package名称
            abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
            namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action
        -->
        <package name="com.kay.struts2" extends="struts-default"
            namespace="/test">
            <interceptors>
                <!-- 定义拦截器
                    name:拦截器名称
                    class:拦截器类路径
                -->
                <interceptor name="timer" class="com.kay.timer"></interceptor>
                <interceptor name="logger" class="com.kay.logger"></interceptor>
                <!-- 定义拦截器栈 -->
                <interceptor-stack name="mystack">
                    <interceptor-ref name="timer"></interceptor-ref>
                    <interceptor-ref name="logger"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!-- 定义默认的拦截器 每个Action都会自动引用
                如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
            <default-interceptor-ref name="mystack"></default-interceptor-ref>
            <!-- 全局results配置 -->
            <global-results>
                <result name="input">/error.jsp</result>
            </global-results>
            <!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)
                name:action名称
                class: 对应的类的路径
                method: 调用Action中的方法名
            -->
            <action name="hello"
                class="com.kay.struts2.Action.LoginAction">
                <!-- 引用拦截器
                    name:拦截器名称或拦截器栈名称
                -->
                <interceptor-ref name="timer"></interceptor-ref>
                <!-- 节点配置
                    name : result名称 和Action中返回的值相同
                    type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher
                -->
                <result name="success" type="dispatcher">/talk.jsp</result>
                <!-- 参数设置
                    name:对应Action中的get/set方法
                -->
                <param name="url">http://www.sina.com</param>
            </action>
        </package>
    </struts>

    Struts.properties配置文件详解:
    struts.action.extension
    用URL扩展名来确定是否这个请求是被用作Struts action,其实也就是设置 action的后缀,例如login.do的'do'字。
    struts.configuration
    org.apache.struts2.config.Configuration接口名
    struts.configuration.files
    struts自动加载的一个配置文件列表
    struts.configuration.xml.reload
    是否加载xml配置(true,false)
    struts.continuations.package
    含有actions的完整连续的package名称
    struts.custom.i18n.resources
    加载附加的国际化属性文件(不包含.properties后缀)
    struts.custom.properties
    加载附加的配置文件的位置
    struts.devMode
    是否为struts开发模式
    struts.dispatcher.parametersWorkaround
    (某些版本的weblogic专用)是否使用一个servlet请求参数工作区(PARAMETERSWORKAROUND)
    struts.enable.DynamicMethodInvocation
    允许动态方法调用
    struts.freemarker.manager.classname
    org.apache.struts2.views.freemarker.FreemarkerManager接口名
    struts.i18n.encoding
    国际化信息内码
    struts.i18n.reload
    是否国际化信息自动加载
    struts.locale
    默认的国际化地区信息
    struts.mapper.class
    org.apache.struts2.dispatcher.mapper.ActionMapper接口
    struts.multipart.maxSize
    multipart请求信息的最大尺寸(文件上传用)
    struts.multipart.parser
    专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口(文件上传用)
    struts.multipart.saveDir
    设置存储上传文件的目录夹
    struts.objectFactory
    com.opensymphony.xwork2.ObjectFactory接口(spring)
    struts.objectFactory.spring.autoWire
    是否自动绑定Spring
    struts.objectFactory.spring.useClassCache
    是否spring应该使用自身的cache
    struts.objectTypeDeterminer
    com.opensymphony.xwork2.util.ObjectTypeDeterminer接口
    struts.serve.static.browserCache
    是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中
    struts.serve.static
    是否struts过滤器应该提供静态内容
    struts.tag.altSyntax
    是否可以用替代的语法替代tags
    struts.ui.templateDir
    UI templates的目录夹
    struts.ui.theme
    默认的UI template主题
    struts.url.http.port
    设置http端口
    struts.url.https.port
    设置https端口
    struts.url.includeParams
    在url中产生 默认的includeParams
    struts.velocity.configfile
    velocity配置文件路径
    struts.velocity.contexts
    velocity的context列表
    struts.velocity.manager.classname
    org.apache.struts2.views.velocity.VelocityManager接口名
    struts.velocity.toolboxlocation
    velocity工具盒的位置
    struts.xslt.nocache
    是否XSLT模版应该被缓存

    例子:

    struts.devMode=false
    struts.enable.DynamicMethodInvocation=true
    struts.i18n.reload=true
    struts.ui.theme=simple
    
    struts.locale=zh_CN
    struts.i18n.encoding=UTF-8
    struts.objectFactory=spring
    struts.objectFactory.spring.autoWire=name
    
    struts.serve.static.browserCache=false
    
    struts.url.includeParams=none


    二、Spring2
    http://www.springframework.org/download
    1、 包:
    spring-beans.jar
    spring-context.jar
    spring-core.jar
    spring-web.jar
    2、 配置web.xml文件

    <!--webAppRootKey 属性为webApp.root 代表webApp的根目录,这样就能在properties文件中定义-->
        <!-- 这里的webApp是http://localhost:8080/webApp/ -->
        <context-param>
            <param-name>webAppRootKey</param-name>
            <param-value>webApp.root</param-value>
        </context-param>    
        <!—spring监听-->
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>
        <!-- Spring配置文件路径 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath*:/spring/applicationContext-*.xml
            </param-value>
        </context-param>

    3、 建立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: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"
    	default-autowire="byName" default-lazy-init="false">
    
    	<bean id="propertyConfigurer"
    		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    		<property name="locations">
    			<list>
    				<value>classpath:jdbc.properties</value>
    				<value>classpath:hibernate.properties</value>
    			</list>
    		</property>
    	</bean>
    	<bean id="c3p0DataSource"
    		class="com.mchange.v2.c3p0.ComboPooledDataSource"
    		destroy-method="close">
    		<property name="driverClass">
    			<value>${jdbc.driverClassName}</value>
    		</property>
    		<property name="jdbcUrl">
    			<value>${jdbc.url}</value>
    		</property>
    		<property name="user">
    			<value>${jdbc.username}</value>
    		</property>
    		<property name="password">
    			<value>${jdbc.password}</value>
    		</property>
    		<property name="initialPoolSize">
    			<value>10</value>
    		</property>
    		<property name="minPoolSize">
    			<value>5</value>
    		</property>
    		<property name="maxPoolSize">
    			<value>50</value>
    		</property>
    		<property name="acquireIncrement">
    			<value>5</value>
    		</property>
    		<property name="maxIdleTime">
    			<value>10</value>
    		</property>
    		<property name="maxStatements">
    			<value>0</value>
    		</property>
    		<property name="testConnectionOnCheckin">
    			<value>false</value>
    		</property>
    	</bean>
    	<bean id="sessionFactory"
    		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="dataSource">
    			<ref bean="c3p0DataSource" />
    		</property>
    		<property name="mappingDirectoryLocations">
    			<list>
    				<value>classpath:/com/au/demo/dto</value>
    			</list>
    		</property>
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.show_sql">
    					${hibernate.show_sql}
    				</prop>
    				<prop key="hibernate.format_sql">
    					${hibernate.format_sql}
    				</prop>
    				<prop key="hibernate.dialect">
    					${hibernate.dialect}
    				</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.query_cache_factory">
    					${hibernate.cache.query_cache_factory}
    				</prop>
    				<prop key="hibernate.query.factory_class">
    					${hibernate.query.factory_class}
    				</prop>
    				<prop key="hibernate.hbm2ddl.auto">update</prop>
    			</props>
    		</property>
    	</bean>
    	<bean id="hibernateTemplate"
    		class="org.springframework.orm.hibernate3.HibernateTemplate">
    		<property name="sessionFactory">
    			<ref bean="sessionFactory" />
    		</property>
    	</bean>
    	<bean id="hibernateInterceptor"
    		class="org.springframework.orm.hibernate3.HibernateInterceptor">
    		<property name="sessionFactory">
    			<ref bean="sessionFactory" />
    		</property>
    	</bean>
    	<!-- 定义事务管理器(声明式的事务),使用适用于Hibernte的事务管理器 -->
    	<bean id="transactionManager"
    		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory">
    			<ref local="sessionFactory" />
    		</property>
    	</bean>
    	<!-- 事务拦截器 -->
    	<bean id="transactionInterceptor"
    		class="org.springframework.transaction.interceptor.TransactionInterceptor">
    		<!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
    		<property name="transactionManager" ref="transactionManager" />
    		<!-- 下面定义事务传播属性-->
    		<property name="transactionAttributes">
    			<props>
    				<prop key="save*">PROPAGATION_REQUIRED</prop>
    				<prop key="update*">PROPAGATION_REQUIRED</prop>
    				<prop key="delete*">PROPAGATION_REQUIRED</prop>
    				<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
    			</props>
    		</property>
    	</bean>
    	<!-- BeanNameAutoProxyCreator是一个bean后处理器,无需id属性,它以事务拦截器为目标bean自动创建事务代理 -->
    	<bean
    		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    		<!-- 定义需要自动创建事务代理的bean -->
    		<property name="beanNames">
    			<list>
    				<value>*Service</value>
    			</list>
    		</property>
    		<!-- 下面定义所需的事务拦截器 -->
    		<property name="interceptorNames">
    			<list>
    				<value>transactionInterceptor</value>
    				<value>hibernateInterceptor</value>
    			</list>
    		</property>
    	</bean>
    </beans>


    三、 Hibernate3
    1、包
    antlr.jar
    cglib.jar
    asm.jar
    asm-attrs.jars
    commons-collections.jar
    hibernate3.jar
    jta.jar
    dom4j.jar
    log4j.jar
    2、在src下建立hibernate.properties

    hibernate.connection.driver_class=com.mysql.jdbc.Driver
    hibernate.connection.url=jdbc:mysql://127.0.0.1:3306/library
    hibernate.connection.username=root
    hibernate.connection.password=
    hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
    
    hibernate.show_sql=true
    hibernate.format_sql=true
    hibernate.cache.use_query_cache=true
    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
    hibernate.cache.provider_class=org.hibernate.connection.C3P0ConnectionProvider
    hibernate.cache.query_cache_factory=org.hibernate.cache.StandardQueryCacheFactory
    hibernate.query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory
    hibernate.sequence=SEQU_TOWER4J
    
    hibernate.default_schema=TEST
    hibernate.default_catalog
    hibernate.generate_statistics
    hibernate.use_sql_comments=true
    hibernate.jdbc.fetch_size
    hibernate.jdbc.batch_size=30
    hibernate.jdbc.use_streams_for_binary
    hibernate.connection.release_mode
    hibernate.cache.use_structured_entries
    hibernate.query.substitutions


    四、Log4j
    1、在src下建立log4j.properties

    log4j.rootLogger=INFO, stdout, logfile
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
    
    log4j.appender.logfile=org.apache.log4j.RollingFileAppender
    log4j.appender.logfile.File=${firstssh.root}/WEB-INF/logs/firstssh.log
    log4j.appender.logfile.MaxFileSize=512KB
    # Keep three backup files.
    log4j.appender.logfile.MaxBackupIndex=3
    # Pattern to output: date priority [category] - message
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
    # OpenSymphony Stuff
    log4j.logger.com.opensymphony=INFO
    log4j.logger.org.apache.struts2=INFO
    # Spring Stuff
    log4j.logger.org.springframework=INFO
    # Hibernate Stuff
    log4j.logger.org.hiberante=INFO

    2、配置web.xml文件

    <!-- log4j的监听 -->
    <listener>
            <listener-class>
                org.springframework.web.util.Log4jConfigListener
            </listener-class>
    </listener>
    <!--log4jConfigLocation属性设置log4j.properties文件的路径-->
    <context-param>
            <param-name>log4jConfigLocation</param-name>
            <param-value>classpath:log4j.properties</param-value>
    </context-param>


    五、Jstl标签
    http://www.apache.org/dist/jakarta/taglibs/standard/binaries/
    1、包
    jstl.jar
    standard.jar
    2、 配置web.xml文件

    <jsp-config>
    <taglib>                            
    <taglib-uri>
    http://java.sun.com/jsp/jstl/core
    </taglib-uri>
                <taglib-location>/WEB-INF/c.tld</taglib-location>
            </taglib>
    <taglib>            
    <taglib-uri>
    http://java.sun.com/jsp/jstl/xml
    </taglib-uri>
                <taglib-location>/WEB-INF/x.tld</taglib-location>
            </taglib>
    <taglib>            
    <taglib-uri>
    http://java.sun.com/jsp/jstl/fmt
    </taglib-uri>
                <taglib-location>/WEB-INF/fmt.tld</taglib-location>
            </taglib>
    <taglib>            
    <taglib-uri>
    http://java.sun.com/jsp/jstl/sql
    </taglib-uri>
                <taglib-location>/WEB-INF/sql.tld</taglib-location>
            </taglib>
            <taglib>
                <taglib-uri>
                    http://java.sun.com/jsp/jstl/functions
                </taglib-uri>
                <taglib-location>/WEB-INF/fn.tld</taglib-location>
            </taglib>
        </jsp-config>
  • 相关阅读:
    面向对象
    用JS添加和删除class类名
    偶然
    js-cookie的用法
    eleemnt-ui修改主题颜色
    router.go,router.push,router.replace的区别
    vue生产环境清除console.log
    特别关心
    echart
    20182330魏冰妍_预备作业
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3215117.html
Copyright © 2020-2023  润新知