项目中遇到的大点的问题基本都会转载别人的或记在文章里,这里是小注意点的集中记录
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 。后来又仔细检查了下前台界面,不知道改了点什么地方或者没改什么,只是刷新下,反正就莫名其妙的好了,没有深入研究,仅此记录。