1、為了解決應用中的中文亂碼問題,我們可以不用自己開發過濾器類,Spring為我們提供了一個,只需要配置一下即可:
<!-- 解決亂碼問題 -->
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
該類的繼承結構如下
該類如下
public class CharacterEncodingFilter extends OncePerRequestFilter {
private String encoding;
private boolean forceEncoding = false;
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void setForceEncoding(boolean forceEncoding) {
this.forceEncoding = forceEncoding;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null))
{
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding)
{
response.setCharacterEncoding(this.encoding);
}
}
filterChain.doFilter(request, response);
}
}
2、為了解決hibernate延遲加載的問題,使用Spring中提供的過濾器來解決,它能夠讓Session
在請求解釋完成之后再關閉,配置方式如下:
同時解決Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
問題:只讀模式下(FlushMode.NEVER/MANUAL)寫操作不被允許:把你的Session改成FlushMode.COMMIT/AUTO或者清除事務定義中的readOnly標記。
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>flushMode </param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
該過濾器並不需要如下配置--> 配置之后就會出現刪除或者修改不執行,添加,查詢能夠正常
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、因為OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設為FlushMode.NEVER。故進行insert、 update和delete操作時會產生異常:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. 因此需要采用spring的事務聲明,使方法受transaction控制:
<!-- 配置Spring的事務處理 -->
<!-- 創建事務管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置事務管理器應用的范圍 -->
<!-- 配置AOP,Spring是通過AOP來進行事務管理的 -->
<aop:config>
<!-- 設置pointCut表示哪些方法要加入事務處理 -->
<!-- 以下的事務是聲明在DAO中,但是通常都會在Service來處理多個業務對象邏輯的關系,注入刪除,更新等,此時如果在執行了一個步驟之后拋出異常
就會導致數據不完整,所以事務不應該在DAO層處理,而應該在service,這也就是Spring所提供的一個非常方便的工具,聲明式事務 -->
<aop:pointcut id="allMethods"
expression="execution(* com.zhao.user.service.*.*(..))" />
<!-- 通過advisor來確定具體要加入事務控制的方法 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
</aop:config>
<!-- 配置Advice(事務的傳播特性) 即:配置哪些方法要加入事務控制 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 讓所有的方法都加入事務管理,為了提高效率,可以把一些查詢之類的方法設置為只讀的事務 -->
<tx:method name="*" propagation="REQUIRED" read-only="true"/>
<!-- 以下方法都是可能設計修改的方法,就無法設置為只讀 -->
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
4、部署應用程序,啟動服務器,如果發現異常: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
這是由於整合時Jar包的沖突引起的。應將"Web應用程序/WEB-INF/lib/asm-2.2.3.jar"刪除即可。