java SSH + extj 项目过程中遇到的问题及注意点(一)

项目中遇到的大点的问题基本都会转载别人的或记在文章里,这里是小注意点的集中记录

1.struts配置文件里使用通配符用*,{1},记得下标是从1开始,例<action name="card_*_*" class="AgencyMemberCard" method="{1}_{2}" >
            <result type="json">
                <param name="root">map</param>
            </result>
        </action>

2.spring事务配置:在applicationContext.xml文件中开头加入
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                         http://www.springframework.org/schema/beans/spring-beans.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 "
>

<!-- 定义事务管理器 -->
     <bean id="myHibTransactionManager"
          class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          <property name="sessionFactory" ref="sessionFactory" />
     </bean>
 
         <!-- 事务通知 -->
     <tx:advice id="txAdvice" transaction-manager="myHibTransactionManager">
             <!-- 事务语义属性 -->
          <tx:attributes>
               <tx:method name="get*" read-only="true"/>
               <tx:method name="find*" read-only="true"/>
               <tx:method name="*" propagation="REQUIRED" />
          </tx:attributes>
     </tx:advice>
 
         <!-- 添加事务切面和通知器 -->
   <aop:config>
        <aop:pointcut id="allMethods" expression="(execution(* com.logisticpark.services.*.*.*(..))) OR(execution(* com.logisticpark.*.service.*.*.*(..)))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>        
    </aop:config>
 这是配置多个切面的情况,一般使用通配符一个就够了,services后面三个*分别是包、类、方法名,括号里是代指参数。

为了表达清楚,expression表达式还是加上括号为好。

我遇到一个问题是:虽然hibernate和spring集成后dao层统一extends HibernateDaoSupport,用 this.getHibernateTemplate()来获得session,但组里有个人用的是Session session = this.sessionFactory.getCurrentSession();来获取session的,后来该程序中发现切面表达式设为两个后,他的页面打不开了,报错:org.hibernate.HibernateException: No Hibernate Session bound to thread 郁闷了好一阵,后来改成一个表达式就好了,可是我有两个地方都需要配置事务啊,又仔细找了<aop:pointcut>表达式语法问题,后来尝试后,发现,用||,or就可以,用 &&,and就不可以,不知道为什么,留待以后再研究。无奈,我就定义了两个<aop:pointcut>

这是大神贴的配置多个切面表达式的资料地址http://www.jboss.org/file-access/default/members/jbossaop/freezone/docs/2.0.0.GA/docs/aspect-framework/reference/en/html/annotated.html

http://www.jboss.org/file-access/default/members/jbossaop/freezone/docs/2.0.0.GA/docs/aspect-framework/reference/en/html/pointcuts.html

3.配置事务后service中的方法最后一定不要try catch,不然出错了就不回滚了。

4.Hibernate ORM 对象映射文件,可以用配置文件和注解方式(hibernate3.2版本后支持),这个项目是其他人用的配置文件,我做另一个项目用注解方式,后来因为需求增加,需要这个项目一些功能添加到另一个项目中,大家都不想改代码,我就在想两个可以同时支持吗。查看了一些相关的文档,基本的配置如下:

配置文件形式:

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.sql.SqlServer2008Dialect
</prop>
</props>
</property>

<property name="mappingDirectoryLocations">
<list>
<value>WEB-INF/classes/com/logisticpark/beans</value>
<value>WEB-INF/classes/com/rokinmember/entity</value>
<value>WEB-INF/classes/com/logisticpark/common/model</value>

   </list>
 </property>
</bean>

注解方式形式:

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.sql.SqlServer2008Dialect
</prop>
</props>
</property>

<property name="mappingDirectoryLocations">
<list>
<value>WEB-INF/classes/com/logisticpark/beans</value>
<value>WEB-INF/classes/com/rokinmember/entity</value>
<value>WEB-INF/classes/com/logisticpark/common/model</value>

   </list>
 </property>
</bean>


唯一不同的是使用了同一路径下的不同类来创建sessionFactory,org.springframework.orm.hibernate3.LocalSessionFactoryBean和org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean。  我想可不可以创建两个sessionFactory,当然不同名,搜了一下,网上说:

hibernate文档中说一个数据库对应一个sessionfactory,如果你打算使用singleton模式来实现hibernate对应多个数据库,可以通过不同的配置创建不同的SessionFactory,然后缓存这些SessionFactory(可以简单放在HashMap里)来实现。 

对每一个不同配置的SessionFactory都只创建一次,然后就缓存起来。这样做的原因是:对于SessionFactory来说,创建的时候需要做O/R的映射和验证,比较耗时。对于这类创建比较昂贵的对象,我们当然需要缓存起来。
一个系统中不可能有太多的不相同的数据连接,不用担心过多占用内存的问题。

后来觉得可能会比较耗内存,干脆同意改成配置文件形式的了,毕竟我那部分要改的下。以后有机会再试试可不可以。


5.写sql语句做查询时遇到and 和or混合使用时要注意了,例select rm.membNo as membNo,  om.country as country, om.code as code  from RokinMember  rm,OnlineMember om    where  rm.MembGUID = om.MembGUID and rm.MembSourceNo = 2  and (om.phone like '%4%' or  om.membName like '%及%')  和 

select rm.membNo as membNo,  om.country as country, om.code as code   from RokinMember  rm,OnlineMember om    where  rm.MembGUID = om.MembGUID and rm.MembSourceNo = 2  and om.phone like '%4%' or  om.membName like '%及%' ,二者查询出来相差很大,因为sql默认and的优先级比or高,所以第二种查出来更多的记录,在and 和or等操作符混合使用时,记得用括号及时消除歧义。


6.更改tomcat服务器的编码方式.tomcat的默认编码是:iso8859-1       

修改tomcat下的conf/server.xml文件,找到如下代码:    
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />   改成:(添加一个属性)
<Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />


7.前台界面更改万后,调试时发送一个请求,好半天不能回应,最后好不容易回应了却什么都没做,后台既没报错,前台也没错误,后来用谷歌浏览器调试面板看了下,发现action请求的status为“canceled”,这个状态一般是200,表示成功响应了,500,一般是服务器出错,后台代码有问题了,这个“canceled”就一头雾水了,后来找了些资料,明白是后台js的跨域问题导致的,参照 http://www.cnblogs.com/SanMaoSpace/p/3144851.html 。后来又仔细检查了下前台界面,不知道改了点什么地方或者没改什么,只是刷新下,反正就莫名其妙的好了,没有深入研究,仅此记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值