`
tianhandigeng
  • 浏览: 368990 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

项目开发全纪录(一)

阅读更多

1、环境
开发流程中,第一天往往是确定项目的开发架构,并同时搭建好开发环境
  开发工具:MyEclipse
  数据库:  MySQL

2、添加SSH支持
  顺序:A.Spring
        B. Hibernate
        C. Struts2

3、Web应用中添加Spring支持

   第一步:导入Spring包

  第二步:在WEB-INF/下创建配置文件,这里我们以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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
</beans>

  第三步:完成Spring容器的初始化
对于Spring的初始化有两种方式,其中一种方式在这里就不讲了,因为是对于Servlet2.3以下的版本来说的。在这里利用其中的一种方法,也是最为简单的一种方法,利用
ContextLoaderListener来初始化:
注:Spring提供了一个ContextLoaderListener类,该类可以作为Web应用的Listener使用,它会在Web应用启动时自动查找WEB-INF/下的applicationContext.xml配置文件,并根据该文件来创建Spring容器。
在这里就有就出现了两种情况:
第一:如果只有一个配置文件,并且文件名为"applicationContext.xml",并将该文件放在Web应用的WEB-INF路径下了,则只需在web.xml文件中增加如下一段即可:

<!-- 根据默认配置文件来初始化Spring容器 -->
<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
</listener>

 第二:如果有多个配置文件,则应该使用<context-param>元素来确定配置文件的文件名。ContextLoaderListener加载时,会查找名为"contextConfigLocation"的参数。因此,配置context-param时指定的参数名应该是"contextConfigLocation".

<!-- 确定多个配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml
		</param-value>
	</context-param>
	<!--采用Listener完成Spring容器的初始化 -->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>

 注:如果没有contextConfigLocation制定配置文件,Spring自动查找WEB-INF路径下的“applicationContext.xml”配置文件;如果有contextConfigLocation,则利用该参数指定的配置文件来初始化Spring容器;如果无法找到合适的配置文件,Spring将无法正常初始化。

总结:
Spring应用到Web应用程序中最重要的内容:在web.xml配置信息来初始化Spring容器

 

4、Spring整合Struts 2
   第一步:导入整合Struts 2需要的jar包:



  第二步;在WEB-INF/下创建struts.xml文件

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
	"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
</struts>

 第三步:在web.xml中配置Struts 2核心过滤器

 

<!-- 定义Struts 2的核心控制器:FilterDispatcher -->
	<filter>
		<!-- 定义核心Filter的名字 -->
		<filter-name>struts2</filter-name>
		<!-- 定义核心Filter的实现类 -->
		<filter-class>
			org.apache.struts2.dispatcher.FilterDispatcher
		</filter-class>
	</filter>
	<!-- FilterDispatcher用来初始化Struts 2并且处理所有的HTTP请求 -->
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 Spring容器和Struts 2整合的关键所在是Spring容器为控制器注入业务逻辑组件,也就是在Struts 2中引用业务逻辑组件来处理时不再需要手工创建业务逻辑组件对象,业务逻辑组件对象的创建完全交给了Spring,而且我们在控制器中面向的是接口,所以可以在Spring容器中灵活地配置实现类,这种方法可以更好地降低控制器与业务实现类的耦合性。

控制器访问到Spring容器中的业务逻辑组件有以下两种策略:
● Spring管理控制器,并利用依赖注入为控制器注入业务逻辑组件
● 控制器定位Spring工厂,也就是Spring的容器,从容器中取得所需的业务逻辑组件
第一种整合流程:
正如前面所介绍的,Struts 2的核心控制器首先拦截用户的请求,然后将请求转发给对应的Action处理,这个过程是固定的(除非改写Struts 2的核心控制器)。但实际上,Action实例是由Spring容器产生的,而不是由Struts 2容器产生的。那么,如何将请求转发给Spring容器中的Action呢?
Spring插件提供了一种伪Action,当我们在struts.xml中配置Action时,通常需要指定class属性,这属性就是用于创建Action实例的实现类。但Spring插件允许我们指定class属性时,不是指向Action的实际实现类,而是指向Spring容器中的Bean ID。
通过上面的方式,我们发现了这种整合策略的关键:当Struts 2将请求转发给指定Action时,Struts 2中的该Action只是一个“傀儡”,它只是一个代号,并没有指定实际的实现类,当然不可能创建实际的Action实例,而隐藏在该Action下的是Spring容器中的Action实例----它才是真正处理用户请求的控制器。
下面是struts.xml中的配置

<action name=”login” class=”loginAction”>
</action>

下面是Spring的配置文件applicationContext.xml

<!—部署一个业务逻辑组件-->
<bean id=”myService” class=”lee.MyServiceImpl”/>
<!—配置Struts 2控制器对应的Bean实例-->
<bean id=”loginAction” class=”lee.LoginAction”>
<!—依赖注入业务逻辑组件-->
<property name=”ms” ref=”myService”/>
</bean>

 第二种整合:
在这种策略下,Action还是由Spring插件创建,Spring插件在创建Action实例时,利用Spring的自动装配策略,将对应业务逻辑组件注入到Action实例中。这种整合策略配置文件很简单,但是控制器和业务逻辑组件耦合又提升到了代码层次,耦合较高。
在这中情况下struts.xml的写法还是和单独使用的时候一样,Spring的配置文件中也不需要另外写aciton的bean,然后注入业务逻辑组件。
采用的是自动装配方式,有4中:name、type、auto、constructor。

 

无论是上面的那种方式,Struts中的Action的实例都是由Spring来创建。Struts 2整合Spring和不整合时当然存在区别,只是这个区别不是在配置文件中体现,而是在创建Action实例时体现出来的。如果不整合Spring框架,则Struts 2 框架负责创建该Action的实例,创建成功后就结束了;如果整合Spring框架,则由Spring插件负责创建该Action的实例,创建成功后,还需要将该Action所需的业务逻辑组件注入给该Action实例。

 

5、Spring整合Hibernate
  第一步:导入Hibernate包


 Spring与Hibernate整合,最重要的就是关于sessionFactory的处理,在Spring的SessionFactory配置灵活度很高,支持各种开发者的习惯,让开发者拥有充分的选择权。
有两种配置方式:
1、零过渡阻碍的配置方式
2、更具Spring风格的方式


更具Spring风格的方式:
    这种方式下,hibernate所有的配置信息都放置在Spring的配置文件中
在Spring容器中需要配置的hibernate的信息包括一下三个内容:
A、数据源(dataSource)
B、映射文件(Spring 提供了三种指定映射文件的方式)/实体类(基于annotation的配置)
C、Hibernate属性(hibernateProperties)

对于基于映射文件的方式在Spring容器中是这样配置的

<!--定义Hibernate的SessionFactory-->
	<bean id="sessionFactory"
	class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!--依赖注入数据源,注入上面的数据源-->
		<property name="dataSource" ref="dataSource" />
		<!--mappingResources属性用来列出全部映射文件 -->
		<property name="mappingResources">
			<list>
			    <value>org/.../User.hbm.xml</value>
			</list>
		</property>
		<!-- 定义Hibernate的sessionFactory 属性 -->
		<property name="hibernateProperties">
		     。。。。。。
		</property>
	</bean>

 对于基于annotation的方式在Spring容器中是这样配置的:

<!--定义Hibernate的SessionFactory-->
	<bean id="sessionFactory"
	class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<!--依赖注入数据源,注入上面的数据源-->
		<property name="dataSource" ref="dataSource" />
		<!--用annotatedClasses属性来列出全部的实体类-->
		<property name="annotatedClasses">
			<list>
			    <value>test.Person</value>
			</list>
		</property>
		<!-- 定义Hibernate的sessionFactory 属性 -->
		<property name="hibernateProperties">
		    。。。。。。。
		</property>
	</bean>

 两种配置方式的不同体现在以下几个方面:
生成bean的class不同
  注解方式是:  
org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
  映射文件方式是:
org.springframework.orm.hibernate3.LocalSessionFactoryBean
用于指定映射文件和实体类的属性不同
   注解方式是:
    <property name="annotatedClasses">
            <list>
                <value>test.Person</value>
            </list>
    </property>
   映射文件方式是:
   <property name="mappingResources">
            <list>
                <value>org/.../User.hbm.xml</value>
            </list>
  </property>
在这种配置方式中,关于映射文件的处理变得相当灵活,如果用的是书写映射文件的方式我们可以通过指定一个目录来加载目录下所有的映射文件,它允许用户指定多个映射文件目录。

<!--定义Hibernate的SessionFactory-->
	<bean id="sessionFactory"
	class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!--依赖注入数据源,注入上面的数据源-->
		<property name="dataSource" ref="dataSource" />
		<!-- mappingDirectoryLocations属性用来指定映射文件目录-->
		<property name="mappingDirectoryLocations">
			<list>
			    <value>classpath:/com/baobaotao/domain/hbm </value>
			</list>
		</property>
		<!-- 定义Hibernate的sessionFactory 属性 -->
		<property name="hibernateProperties">
		     。。。。。。
		</property>
	</bean>

 除此之外,Spring还提供了以下三种指定映射文件的方式:
    mappingJarLocations:如果映射文件位于JAR文件中,则可以通过该属性指定,如WEB-INF/lib/example.hbm.jar
    mappingLocations:通过相对于类路径的方式指定映射文件,属性类型为Resource[],既可以通过内嵌多个<value>的<list>元素指定映射文件,也可以通过逗号分隔的方式指定,如:classpath:topic.hbm.xml,classpath:post.hbml.xml
    mappingResources:通过相对于类路径的方式制定映射文件,属性类型为
String[].既可以通过内嵌多个<value>的<list>元素指定映射文件,也可以通
过逗号分隔的方式指定


零过渡阻碍的配置方式
     这种方式下hibernate的配置文件依然存在,在Spring的配置文件中指定这个配置文件:

<!--定义Hibernate的SessionFactory-->
	<bean id="sessionFactory"
	class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property 
name=”configLocation” value=”classpath:conf/hibernate.cfg.xml”/>
	</bean>

 如果有多个配置文件可以通过configLocations属性指定。

 

6、关于配置文件的读取问题
  Spring 可以将所有的配置信息统一到一个文件中,也可以放置到多个文件中,对于简单的应用来说,由于配置信息少,仅用一个配置文件就足以应付。随着应用规模的扩大,配置信息量的增多,仅仅使用一个配置文件往往难以满足要求,如果不进行仔细规划,将给配置信息的查看和团队协作带来负面影响。
在这里我们将配置文件分成了几个,并且按照JpetStore的方式将这些文件放置到了WEB-INF下,因为是Web应用程序所以需要在启动时加载这些配置文件从而初始化Spring容器,在web.xml中这样配置:

<!-- 确定多个配置文件 -->
	<context-param>
	    <param-name>contextConfigLocation</param-name>
	    <param-value>
	       /WEB-INF/zuwoba-dao.xml,/WEB-INF/zuwoba-service.xml
	    </param-value>
	</context-param>

 我们有时候也需要读取这些配置文件,按下面的方式读取:

ApplicationContext context=new 
FileSystemXmlApplicationContext("WebRoot/WEB-INF/zuwoba-dao.xml")

 7、事务
   一》事务的传播特性


 

   编程式事务(事务的开启、提交、回滚、关闭都是手工的)
   A、openSession和getCurrentSession的区别
      * openSession必须关闭,currentSession在事务结束后自动关闭
      * openSession没有和当前线程绑定,currentSession和当前线程绑定
   B、如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:
      * 如果是本地事务(jdbc事务)
        <property name="hibernate.current_session_context_class">thread</property>
       * 如果是全局事务(jta事务)
        <property name="hibernate.current_session_context_class">jta</property>

实例:保存一个User就存一下日志

   
  * 声明式事务
      通常在业务逻辑层设置事务边界
声明式事务
声明式事务(Programmatic transaction management)是对程序事务管理的方式之一。   
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。  
 Spring使用声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:   1.传播行为   2.隔离级别   3.只读提示   4.事务超时期间


    Spring中使用声明式事务
1、首先要做的就是加入aspect包



 2、要在Spring的配置文件中使用aop还必须声明Schema信息,下面是完整的声明

<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/tx 
     http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
     http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

3、大体如下:

 <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
         <property name="sessionFactory">
              <ref bean="sessionFactory"/>
         </property>
    </bean>
    
    <!-- 哪些业务类需要工作于事务环境下 -->
    <aop:config>
         <!-- 配置一个切入点,匹配com.zuwoba.service.impl包下所有以Impl结尾的类执行的所有方法 -->
         <aop:pointcut id="allServiceMethod" expression="execution(* com.zuwoba.service.impl.*Impl.*(..))"/>
         <aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice"/>
    </aop:config>
    
    
    <!-- 事务的传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
         <tx:attributes>
              <tx:method name="add*" propagation="REQUIRED"/>
              <tx:method name="del*" propagation="REQUIRED"/>
              <tx:method name="modify*" propagation="REQUIRED"/>
              <tx:method name="*" propagation="REQUIRED" read-only="true"/>
         </tx:attributes>
    </tx:advice>

 8、关于数据库字段长度的问题
MySQL数据库中整型字段长度:
   这个可选的宽度规格说明是用于在数值显示时,对某些值的宽度短于该列宽度的值进行左填补显示的,而不是为了限制在该列中存储值的宽度,也不是为了限制那些超过该列指定宽度的值可被显示的数字位数。注意,如果一个整型列中存储一个超过显示宽度的更大值时,当MySQL为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,MySQL信任地认为所有的值均适合原始的列宽度。
    在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度。
整型列的显示宽度与mysql需要用多少个字符来显示该列数值,与整型需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节。

字符串类字段长度:
   字符串类字段长度和数值类字段长度表示的意义就不同了,字符串类字段的长度就是表示了存储字符(一个汉字占一个字符)的个数,如果大于该长度,存入到数据库中的时候就会进行截断,如:varchar(4),存入字符串"hhhhh",则存入到数据库中的时候就只会存"hhhh",所以注意两种类型长度所表示的意义的不同。


浮点型字段:
   MySQL用三种浮点型数据列类型:分别是:FLOAT,DOUBLE和DECIMAL。
关于单精度浮点数和双精度浮点数:
   用4个字节(32位)来存放一个浮点数,尾数有7个有效数字左右,叫单精度浮点数,用64位来存放,尾数有效数字可以增加到15位或16位,叫双精度浮点数。
   在MySQL中浮点型数据的存储也有一个长度的问题:
 
这里Length指定了这个数有两个数字位,Decimals说明了小数占一位:
所以如果存的是"5.21",实际存的就是"5.2";
        存"50.2"存的就是"9.9".
9、Struts 2 的Action的书写
   Struts 2 的Action有三种写法:
    直接写
    实现Action接口
    继承ActionSupport类
在实际的开发过程中我们使用继承ActionSupport类的方法,它已经实现了Action接口,而且还实现了Validateable接口,提供了数据校验功能,在Validateable接口中定义了一个validate()方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fileErrors域中,然后通过OGNL表达式负责输出。
10、struts.xml文件配置信息

 <!-- 设置为开发模式 -->
	<constant name="struts.devMode" value="true" />
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<package name="account" extends="struts-default">

     struts.devMode:该常量设置Struts2应用是否使用开发模式。如果该常量为true,则可以在应用出错的时候显示更 多、更友好的出错提示。该常量只接受true和false两个值,该常量的默认值是false。通常,应用在开发阶段,将该常量设置为true,当进入产品的发布阶段后,则该常量设置为false。
    struts-default.xml:该文件是Struts 2框架的默认配置文件,Struts 2框架每次都会自动加载该文件。在上面的配置文件中,名为account的包空间,继承了名为struts-default的包空间,struts-default包空间定义在struts-default.xml文件中。可见,Struts 2框架默认会加载struts-default.xml文件。
注意:虽然在配置Struts 2的常量的时候可以在web.xml中进行配置,但是在实际的开发中,不推荐将Struts 2 常量配置在web.xml中。推荐在struts.xml中配置Struts 2常量。
    包配置
为什么需要包呢?那就看看包有什么作用了,Struts 2框架中核心组件就是Action、拦截器等,Struts 2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
配置包时,必须指定name属性,这个属性是引用这个包的key。除此之外,还可以指定一个可选的extends属性,extends属性值必须是另一个包的name属性。指定extends属性表示让该包继承其他包,子包可以继承一个或多个父包中的拦截器、拦截器栈、action等配置。
    包配置—>命名空间
考虑到在同一个Web应用中需要同名的Action,Struts 2以命名空间的方式来管理Action,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。
注意:如果某个包没有指定namespace属性,即该包使用默认的命名空间,则默认的命名空间总是“”。
      当某个包指定了命名空间后,该包下所有Action处理的URL应该是命名空间+Action名。

 

 

----未完待续-----

2
3
分享到:
评论
2 楼 hunan84229247 2010-12-19  
  
1 楼 chenhailong 2010-12-19  
努力啊 哈哈

相关推荐

Global site tag (gtag.js) - Google Analytics