您的位置:首页 > 编程语言 > Java开发

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

2014-12-14 10:31 621 查看
项目中遇到的大点的问题基本都会转载别人的或记在文章里,这里是小注意点的集中记录

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 。后来又仔细检查了下前台界面,不知道改了点什么地方或者没改什么,只是刷新下,反正就莫名其妙的好了,没有深入研究,仅此记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐