﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jelver'Sky-文章分类-Spring+Tapestry/Struts+Hibernate</title><link>http://www.blogjava.net/jelver/category/7678.html</link><description>“一直很多人说我是天才，但我却相信这个世界没有天才。如果没有卓越的努力和娴熟的球性，你永远不会踢出精彩的足球。我从来不会低估努力的重要性，而这正是我对自己的要求。”
----------------------------------------------------------------------------罗纳尔迪尼奥(Ronaldinho)--------
“不要叫我神童！我不是神童！我所获得的一切成就，都是我用汗水和刻苦训练换来的！” --------------------------丁俊辉（中国斯诺克公开赛冠军）---
</description><language>zh-cn</language><lastBuildDate>Fri, 11 Apr 2008 10:26:32 GMT</lastBuildDate><pubDate>Fri, 11 Apr 2008 10:26:32 GMT</pubDate><ttl>60</ttl><item><title>Struts1.2+Spring2.0+Hibernate3.1项目框架构建中的问题及解决方法集锦</title><link>http://www.blogjava.net/jelver/articles/192091.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Fri, 11 Apr 2008 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/192091.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/192091.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/192091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/192091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/192091.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Struts1.2+Spring2.0+Hibernate3.1项目框架构建中的问题及解决方法集锦（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前天自己尝试着使用&nbsp;Eclipse3.2+Myeclipse5.5&nbsp;搭建一个自己的&nbsp;Struts1.2+Spring2.0+Hibernate3.1&nbsp;项目框架，这自己不做还不知道，一做就吓了一跳，怎搭个项目框架就这么难，经过整整一天的摸索这才成功的构建了自己想要的项目框架。现在把项目的主要配置文件清单共享如下：<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />web.xml&nbsp;&nbsp;&nbsp;项目配置<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000">&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000">&nbsp;version</span><span style="color: #0000ff">="2.4"</span><span style="color: #ff0000">&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">action</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.struts.action.ActionServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">config</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/struts-config.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">debug</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">detail</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">action</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.do</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">session-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">session-timeout</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">30</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">session-timeout</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">session-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">welcome-file-list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">welcome-file</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/index.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">welcome-file</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">welcome-file</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/modules/login.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">welcome-file</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">welcome-file-list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Struts配置&nbsp;&nbsp;&nbsp;struts-config.xml&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts-config&nbsp;PUBLIC&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;1.2//EN"&nbsp;"http://struts.apache.org/dtds/struts-config_1_2.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">data-sources&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form-beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form-bean&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="loginForm"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="com.morecans.test.struts.form.LoginForm"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form-beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">global-exceptions&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">global-forwards&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action-mappings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">attribute</span><span style="color: #0000ff">="loginForm"</span><span style="color: #ff0000">&nbsp;input</span><span style="color: #0000ff">="/modules/login.jsp"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="loginForm"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/modules/login"</span><span style="color: #ff0000">&nbsp;scope</span><span style="color: #0000ff">="request"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="org.springframework.web.struts.DelegatingActionProxy"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;（1）loginAction交给Sping&nbsp;代理<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="msg"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/modules/msg.jsp"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">forward</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="index"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/index.jsp"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">forward</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="login"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/modules/login.jsp"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">forward</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action-mappings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">message-resources<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #ff0000">parameter</span><span style="color: #0000ff">="com.morecans.test.struts.ApplicationResources"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">plug-in<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #ff0000">className</span><span style="color: #0000ff">="org.springframework.web.struts.ContextLoaderPlugIn"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">set-property&nbsp;</span><span style="color: #ff0000">property</span><span style="color: #0000ff">="contextConfigLocation"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff">="/WEB-INF/classes/applicationContext.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">plug-in</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Spring整合HIbernate&nbsp;&nbsp;&nbsp;&nbsp;applicationContext.xml<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;（2）Spring整合Hibernate&nbsp;&nbsp;&nbsp;配置&nbsp;DataSource<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="driverClassName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.mysql.jdbc.Driver</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="url"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc:mysql://localhost:3306/morecans</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">root</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（3）Spring整合Hibernate&nbsp;&nbsp;&nbsp;配置&nbsp;SessionFactory<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernateProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.dialect"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.MySQLDialect<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.show_sql"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="mappingResources"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com/morecans/test/pojo/Customer.hbm.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="CustomerDAO"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.morecans.test.pojo.CustomerDAO"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;（4）Spring整合Hibernate&nbsp;&nbsp;&nbsp;配置&nbsp;DAO<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">import&nbsp;</span><span style="color: #ff0000">resource</span><span style="color: #0000ff">="applicationContext-zxy.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Spring整合Stuts&nbsp;&nbsp;&nbsp;applicationContext-zxy.xml<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="/modules/login"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（5）Struts的Action交给Sping&nbsp;在这里处理。配置LoginAction<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;class</span><span style="color: #0000ff">="com.morecans.test.struts.action.LoginAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="customerdao"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="CustomerDAO"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<img src ="http://www.blogjava.net/jelver/aggbug/192091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2008-04-11 10:40 <a href="http://www.blogjava.net/jelver/articles/192091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH架构简单总结 (zhuan)</title><link>http://www.blogjava.net/jelver/articles/113781.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Thu, 26 Apr 2007 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/113781.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/113781.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/113781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/113781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/113781.html</trackback:ping><description><![CDATA[&nbsp;
<p align=left><strong><span><a title=永久链接：SSH架构简单总结 href="http://ltc603.javaeye.com/blog/65007">SSH<span><span>架构简单总结</span></span></a> </span></strong></p>
<p align=left><span>Struts</span><span>、<span>spring</span>、<span>Hibernate</span>在各层的作用<span> <br><span>1</span></span><span>）<span>struts </span>负责<span> web</span>层<span>. </span></span><span><br>ActionFormBean </span>接收网页中表单提交的数据，然后通过<span>Action </span>进行处理，再<span>Forward</span>到对应的网页。 在<span>struts-config.xml</span>中定义<span>&lt;action-mapping&gt;, ActionServlet</span>会加载。</span></p>
<p align=left><span>2</span><span>）<span>spring </span>负责业务层管理，即<span>Service</span>（或<span>Manager). </span></span><span><br>1</span><span>．<span> service</span>为<span>action</span>提供统计的调用接口，封装持久层的<span>DAO</span>，。<span> <br>2</span>．可以写一些自己的业务方法。<span> <br>3</span>．统一的<span>javabean</span>管理方法<span> <br>4</span>．声明式事务管理<span> <br>5.</span>集成<span>Hiberante</span></span></p>
<p align=left><span>3</span><span>）<span>Hiberante</span>，负责持久化层，完成数据库的<span>crud</span>操作</span><span> <br>hibernate </span><span>为持久层，提供<span> OR/Mapping</span>。<span> <br></span>它有一组<span> .hbm.xml</span>文件和<span> POJO,</span>是跟数据库中的表相对应的。然后定义<span>DAO</span>，这些是跟数据库打交道的类，它们会使用<span>PO</span>。</span></p>
<p><span>在<span>struts+spring+hibernate</span>的系统中，<span> <br></span>对象的调用流程是：<span>jsp-&gt; Action</span>－<span>&gt; Service -&gt;DAO -&gt;Hibernate</span>。<span> <br></span>数据的流向是<span> ActionFormBean</span>接受用户的数据，<span>Action </span>将数据从<span> ActionFromBean </span>中取出，封装成<span>VO</span>或<span>PO, </span>再调用业务层的<span>Bean</span>类，完成各种业务处理后再<span>forward</span>。而业务层<span>Bean</span>收到这个<span>PO</span>对象之后，会调用<span>DAO</span>接口方法，进行持久化操作。</span></p>
<img src ="http://www.blogjava.net/jelver/aggbug/113781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2007-04-26 15:06 <a href="http://www.blogjava.net/jelver/articles/113781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate+Spring+Struts扩展Struts （转）</title><link>http://www.blogjava.net/jelver/articles/107764.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Sun, 01 Apr 2007 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/107764.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/107764.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/107764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/107764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/107764.html</trackback:ping><description><![CDATA[我看到很多项目中，开发者实现了自己的MVC框架，并不是因为他们想做同Struts根本不同的东西，而是因为他们并没有意识到如何扩展Struts。开发自己的MVC框架可以获得全部的控制权，但是这也意味着需要很多资源来实现它（人力物力），在紧张的日程安排下，有时候这是不可能的。 
<p>　　Struts不仅仅是一个强大的框架，同时它也是可扩展的。你可以以三种方式来扩展Struts。 </p><p>　　1、PlugIn：如果你想在application startup或shutdown的时候做一些业务逻辑的话，那就创建你自己的PlugIn类。 </p><p>　　2、RequestProcessor：如果你想在请求被处理的过程中某个时刻做一些业务逻辑的话，那么创建你自己的RequestProcessor类。比如说，在每次请求执行之前，你可以扩展RequestProcessor来检查用户是否登陆了以及他是否有权限去执行某个特定的action。 </p><p>　　3、ActionServlet：如果你想在application startup和shutdown的时候以及请求被处理的时候做某些业务逻辑，你也可以扩张ActionServlet类。不过你应当在PlugIn和RequestProcessor都不能解决你的需求的时候来使用ActionServlet。 </p><p>　　在这篇文章中，我们将使用一个Struts应用的示例来示范如何使用这三种方式来扩展Struts。示例程序的代码可以从<a href="http://www.onjava.com/onjava/2004/11/10/examples/sample1.zip">http://www.onjava.com/onjava/2004/11/10/examples/sample1.zip</a>下载。两个扩展Struts成功的范例是Struts自身的Validation和Tiles框架。 </p><p>　　我们假设你已经比较熟悉Struts框架并且知道如何使用它创建一个简单的应用。如果你想知道更多关于Struts的内容，请参考官方主页。 </p><p>　　<strong>PlugIn </strong><br />　　 <br />　　PlugIn是一个接口，你可以创建一个实现该接口的类，当application startup或shutdown的时候做些事情。 </p><p>　　比方说，我创建了一个使用Hibernate作为持久层的web应用，我想当应用启动的时候就初始化Hibernate，这样子当我的web应用受到第一个请求的时候，Hibernate就已经是配置好的并且可用的。同时我们想当application关闭的时候关闭Hibernate。我们可以用一个Hibernate PlugIn来实现这个需求，通过如下的两步： </p><p>　　<strong>1、创建一个类实现了PlugIn接口：</strong></p><p>　　public class HibernatePlugIn implements PlugIn{ <br />　　private String configFile; <br />　　// This method will be called at application shutdown time <br />　　public void destroy() { <br />　　System.out.println("Entering HibernatePlugIn.destroy()"); <br />　　//Put hibernate cleanup code here <br />　　System.out.println("Exiting HibernatePlugIn.destroy()"); <br />　　} <br />　　//This method will be called at application startup time <br />　　public void init(ActionServlet actionServlet, ModuleConfig config) <br />　　throws ServletException { <br />　　　System.out.println("Entering HibernatePlugIn.init()"); <br />　　　System.out.println("value of init parameter " + <br />　　　getConfigFile()); <br />　　　System.out.println("Exiting HibernatePlugIn.init()"); <br />　　} <br />　　public String getConfigFile() { <br />　　return name; <br />　　} <br />　　public void setConfigFile(String string) { <br />　　configFile = string; <br />　　} <br />　　} </p><p>　　实现PlugIn接口的类必须完成两个方法：init()和destroy()。当application startup的时候init()方法被调用，当shutdown的时候destroy()方法被调用。Struts还允许给你的PlugIn类传递初始化参数。为了传递参数，你必须在PlugIn类中为每一个参数创建JavaBean式的setter方法。在我们的HibernatePlugIn类中，我会把configFile的name作为参数传进去，而不是硬编码到程序中。 </p><p>　<strong>　2、在struts-config.xml中添加如下的代码来通告Struts有新的PlugIn： </strong></p><p>　　＜struts-config＞ <br />　　... <br />　　＜!-- Message Resources --＞ <br />　　＜message-resources parameter= "sample1.resources.ApplicationResources"/＞ </p><p>　　＜!-- Declare your plugins --＞ <br />　　＜plug-in className="com.sample.util.HibernatePlugIn"＞ <br />　　＜set-property property="configFile" value="/hibernate.cfg.xml"/＞ <br />　　＜/plug-in＞ <br />　　＜/struts-config＞ </p><p>　　属性className是实现了PlugIn接口的类的全限定名。对于每一个初始化参数，可以使用＜set-property＞元素传递参数。在我们的例子中，我要把config文件的名字传进去，所以使用了一个带有配置文件路径的＜set-property＞。 </p><p>　　Struts的Tiles和Validator框架都使用PlugIn来读取配置文件进行初始化。另外两件PlugIn可以帮你做到的事情是： </p><p>　　·如果你的application依赖于某些配置文件，那么你可以在PlugIn类中检查它们是否可用，如果不可用的话抛出一个ServletException，这样就可以使ActionServlet变为不可用。 </p><p>　　·PlugIn接口的init()方法是你可以改变ModuleConfig的最后机会，ModuleConfig是一组静态配置信息的集合，用来描述基于Struts模块。Struts将会在所有PlugIn处理完后释放ModuleConfig。 <br />　　 Request是如何被处理的 </p><p>　　ActionServlet是Struts框架中唯一的Servlet，它负责处理所有request。无论何时接收到一个request，它都会先尝试为当前的request寻找一个sub-application。一旦一个sub-application被找到，ActionServlet就会为那个sub-application创建一个RequestProcessor对象，调用这个对象的process()方法并把HttpServletRequest和HttpServletResponse对象传入。 </p><p>　　RequestProcessor.process()就是大部分request被处理的地方。process()方法使用了Template Method模式实现，其中有很多独立的方法来执行请求处理的每一步骤，这些方法将会在process方法中依次被调用。比如，将会有一个独立的方法用来寻找当前request对应的ActionForm类，一个方法来检查当前用户是否有执行action mapping所必须的权限。这些给与我们极大的灵活性。在发布的Struts包中有一个RequestProcessor类提供了请求处理每一步骤的默认实现。这就意味着你可以仅仅重写你感兴趣的方法，其它的使用默认的实现。举例来说，默认地Struts调用request.isUserInRole()来检查用户是否有权限执行当前的ActionMapping；这时如果你想通过查询数据库来实现，你所要做的就是重写processRoles()方法，通过查询出的用户是否拥有必须的权限来返回true或false。 </p><p>　　首先我们将会看到缺省情况下，process()方法是如何实现的，然后我将会详细解释默认的RequestProcessor类中的每一个方法，这样你就可以决定哪一部分是你想要改变的。 </p><p>　　public void process(HttpServletRequest request,HttpServletResponse response) <br />　　throws IOException, ServletException { <br />　　// Wrap multipart requests with a special wrapper <br />　　request = processMultipart(request); <br />　　// Identify the path component we will <br />　　// use to select a mapping <br />　　String path = processPath(request, response); <br />　　if (path == null) { <br />　　return; <br />　　} <br />　　if (log.isDebugEnabled()) { <br />　　log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'"); <br />　　} <br />　　// Select a Locale for the current user if requested <br />　　processLocale(request, response); <br />　　// Set the content type and no-caching headers <br />　　// if requested <br />　　processContent(request, response); <br />　　processNoCache(request, response); <br />　　// General purpose preprocessing hook <br />　　if (!processPreprocess(request, response)) { <br />　　return; <br />　　} <br />　　// Identify the mapping for this request <br />　　ActionMapping mapping = <br />　　processMapping(request, response, path); <br />　　if (mapping == null) { <br />　　return; <br />　　} <br />　　// Check for any role required to perform this action <br />　　if (!processRoles(request, response, mapping)) { <br />　　return; <br />　　} <br />　　// Process any ActionForm bean related to this request <br />　　ActionForm form = processActionForm(request, response, mapping); <br />　　processPopulate(request, response, form, mapping); <br />　　if (!processValidate(request, response, form, mapping)) { <br />　　return; <br />　　} <br />　　// Process a forward or include specified by this mapping <br />　　if (!processForward(request, response, mapping)) { <br />　　return; <br />　　} <br />　　if (!processInclude(request, response, mapping)) { <br />　　return; <br />　　} <br />　　// Create or acquire the Action instance to <br />　　// process this request <br />　　Action action = <br />　　processActionCreate(request, response, mapping); <br />　　if (action == null) { <br />　　return; <br />　　} <br />　　// Call the Action instance itself <br />　　ActionForward forward = processActionPerform(request, response,action, form, mapping); <br />　　// Process the returned ActionForward instance <br />　　processForwardConfig(request, response, forward); <br />　　} </p><p>　　<strong>1、processMutipart()：</strong>在这个方法中，Struts将会读取request来检查request的contentType是否是multipart/form-data。如果是的话，将会解析request并且将之包装到HttpServletRequest中。当你创建了一个HTML FORM用来提交数据，那么request的contentType默认就是application/x-www-form-urlencoded。但是如果你的form使用了file类型的input控件允许用户上传文件的话，你就必须将contentType改为multipart/form-data。如果是这样的情况，你就不能再通过getParameter()来获取用户提交的数据；你必须将request作为一个InputStream来读取，并且自己解析它来获得参数值。 </p><p>　　<strong>2、processPath()：</strong>在这个方法中，Struts将会读取request的URI，来确定路径元素，这个元素是用来获取ActionMappint元素。 <br />　　<strong>3、processLocale()：</strong>在这个方法中，Struts将会为当前request取得Locale，如果配置过的话，还可以将这个对象作为HttpSession中org.apache.struts.action.LOCALE属性的值而保存。作为这个方法的副作用，HttpSession将会被创建，如果你不想创建的话，你可以在ControllerConfig中将locale属性设为false，在struts-config.xml中象如下这样： </p><p>　　＜controller＞ <br />　　＜set-property property="locale" value="false"/＞ <br />　　＜/controller＞ </p><p>　　<strong>4、processContent()：</strong>通过调用response.setContentType()来为response设置contentType。这个方法首先会尝试从struts-config.xml配置中得到contentType。缺省情况下使用text/html。如果想覆盖它，可以象如下这样： </p><p>　　＜controller＞ <br />　　＜set-property property="contentType" value="text/plain"/＞ <br />　　＜/controller＞ </p><p>　　<strong>5、processNoCache()：</strong>如果配置是no-cache，Struts将会为每个response设置下面三个headers： </p><p>　　requested in struts config.xml <br />　　response.setHeader("Pragma", "No-cache"); <br />　　response.setHeader("Cache-Control", "no-cache"); <br />　　response.setDateHeader("Expires", 1); </p><p>　　如果你想设置no-cache header，在struts-config.xml中加入下面信息： </p><p>　　＜controller＞ <br />　　＜set-property property="noCache" value="true"/＞ <br />　　＜/controller＞ </p><p>　　<strong>6、processPreprocess()：</strong>这个方法为预处理提供一个hook，可以在子类中覆盖它。它的缺省实现没有作任何事情，总是返回true。返回false的话将会终止当前请求的处理。 </p><p>　　<strong>7、processMapping()：</strong>这个方法将会用路径信息得到一个ActionMapping对象。也就是struts-config.xml文件中的＜action＞元素： </p><p>　　＜action path="/newcontact" type="com.sample.NewContactAction" name="newContactForm" scope="request"＞ <br />　　＜forward name="sucess" path="/sucessPage.do"/＞ <br />　　＜forward name="failure" path="/failurePage.do"/＞ <br />　　＜/action＞ </p><p>　　ActionMapping元素包含了Action类的名称和处理请求使用的ActionForm等等信息。它还包含当前ActionMapping配置的ActionForwards信息。 </p><p>　　<strong>8、processRoles()：</strong>Struts web应用提供了一个授权方案。也就是说，一旦一个用户登入了容器，struts的processRoles()方法将会通过调用request.isUserInRole()，来检查他是否有必须的角色来运行一个给定的ActionMapping。 </p><p>　　＜action path="/addUser" roles="administrator"/＞ </p><p>　　假设你有一个AddUserAction并且你只想让administrator能够增加新的user。你所要做的就是给你的AddUserAction元素增加一个role属性，这个属性的值为administrator。这样，在运行AddUserAction之前，这个方法会确保用户拥有administraotr的角色。 </p><p>　　<strong>9、processActionForm()：</strong>每一个ActionMapping都一个相应的ActionForm类。当Struts处理一个ActionMapping的时候，它将会从＜action＞元素的name属性中找出对应的ActionForm类的名称。 </p><p>　　＜form-bean name="newContactForm" type="org.apache.struts.action.DynaActionForm"＞ <br />　　＜form-property name="firstName" type="java.lang.String"/＞ <br />　　＜form-property name="lastName" type="java.lang.String"/＞ <br />　　＜/form-bean＞ </p><p>　　在我们的例子中，它会先在request scope中检查是否有一个org.apache.struts.action.DynaActionForm类的对象存在。如果有它将会使用这个对象，如果没有它将会创建一个新的对象并把它设置在request scope。 </p><p>　　<strong>10、processPopulate()：</strong>在这个方法中，Struts将会用相匹配的request参数装配ActionForm的实例变量。 </p><p>　　<strong>11、processValidate()：</strong>Struts将会调用你的ActionForm类的validate方法。如果你从validate()返回ActionErrors，它将会将user重定向到＜action＞元素的input属性指定的页面。 </p><p>　　<strong>12、processForward()和processInclude()：</strong>在这些方法中，Struts将会检查＜action＞元素的forward或include属性，如果找到了，将会把forward或include请求放置到配置的页面中。 </p><p>　　＜action forward="/Login.jsp" path="/loginInput"/＞ <br />　　＜action include="/Login.jsp" path="/loginInput"/＞ </p><p>　　你可以从这些方法的名字上猜测它们的不同：processForward()最终调用RequestDispatcher.forward()，而processInclude()调用RequestDispatcher.include()。如果你同时配置了forward和include属性，它将会总是调用forward，因为forward先被处理。 </p><p>　　<strong>13、processActionCreate()：</strong>这个方法从＜action＞元素的type属性中获取获得Action类的名字并且创建返回它的实例。在我们的例子中，它将会创建一个com.sample.NewContactAction类的实例。 </p><p>　　<strong>14、processActionPerform()：</strong>这个方法调用你的Action类的excute()方法，你的业务逻辑也就是在excute方法中。 </p><p>　　<strong>15、processForwardConfig()：</strong>你的Action类的excute()方法将会返回一个ActionForward对象，这个对象将指出哪个页面是显示给用户的页面。因此，Struts将会为那个页面创建一个RequestDispatcher，并且调用RequestDispatcher.forward()。 </p><p>　　上面的列表说明了默认的RequestProcessor实现在处理请求时每一步作的工作，以及执行的顺序。正如你所看到的，RequestProcessor是非常灵活的，允许你通过设置＜controller＞元素的属性来配置它。举例来说，如果你的应用准备生成XML内容来代替HTML，你就可以通过设置controller元素的属性来通知Struts这些情况。 <br />　　 <br />　　<strong>创建你自己的RequestProcessor</strong></p><p>　　通过上面，我们了解到了RequestProcessor的默认实现是如何工作的。现在我们要演示一个例子来说明如何定制你自己的RequestProcessor。为了展示创建用户定制的RequestProcessor，我们将会让我们的示例实现下面两个业务需求： </p><p>　　·我们想创建一个ContactImageAction类，它将生成图片而不是平常的HTML页面。 </p><p>　　·在每个请求处理之前，我们都想通过检查session中的userName属性来确定用户是否已经登陆。如果那个属性没有找到，我们会把用户重定向到登陆页面。 </p><p>　　我们将分两步实现这些业务需求。 </p><p>　　<strong>1、创建你的CustomRequestProcessor类，它将继承自RequestProcessor类，如下：</strong></p><p>　　public class CustomRequestProcessor <br />　　extends RequestProcessor { <br />　　protected boolean processPreprocess ( <br />　　HttpServletRequest request,HttpServletResponse response) { <br />　　　HttpSession session = request.getSession(false); <br />　　　//If user is trying to access login page <br />　　　// then don't check <br />　　　if( request.getServletPath().equals("/loginInput.do") <br />　　|| request.getServletPath().equals("/login.do") ) <br />　　　　return true; <br />　　　//Check if userName attribute is there is session. <br />　　　//If so, it means user has allready logged in <br />　　　if( session != null &amp;&amp; session.getAttribute("userName") != null) <br />　　　　return true; <br />　　　else{ <br />　　　　try{ <br />　　　　　//If no redirect user to login Page <br />　　　　　request.getRequestDispatcher("/Login.jsp").forward(request,response); <br />　　　　}catch(Exception ex){ <br />　　　　} <br />　　　} <br />　　　return false; <br />　　} </p><p>　　protected void processContent(HttpServletRequest request, <br />　　HttpServletResponse response) { <br />　　//Check if user is requesting ContactImageAction <br />　　// if yes then set image/gif as content type <br />　　if( request.getServletPath().equals("/contactimage.do")){ <br />　　　response.setContentType("image/gif"); <br />　　　return; <br />　　} <br />　　　super.processContent(request, response); <br />　　}　 <br />　　} </p><p>　　在CustomRequestProcessor类的processPreprocess方法中，我们检查session的userName属性，如果没有找到，就将用户重定向到登陆页面。 </p><p>　　对于生成图片作为输出的需求，我们必须覆盖processContent方法，首先检查请求是否是/contactimage路径。如果是的话，我们就会将contentType设置为image/gif；否则设置为text/html。 </p><p>　　<strong>2、在你的struts-config.xml文件的＜action-mappint＞元素之后加入下面的文字，告诉Struts CustomRequestProcessor应当被用作RequestProcessor类：</strong></p><p>　　＜controller＞ <br />　　＜set-property property="processorClass"value="com.sample.util.CustomRequestProcessor"/＞ <br />　　＜/controller＞ </p><p>　　请注意，当你只有很少的action类需要生成非text/html类型的输出时，你覆写processContent()方法是OK的。如果不是这样子的话，你应该创建一个Struts的子应用来处理请求生成图片的Action，并为它们将contentType设置为image/gif。 </p><p>　　Struts的Tiles框架就是使用它自己的RequestProcessor来装饰Struts的输出。 </p><p>　　<strong>ActionServlet </strong></p><p>　　如果你查看你的Struts web应用的web.xml，你会看到这样的文字： </p><p>　　＜web-app ＞ <br />　　＜servlet＞ <br />　　＜servlet-name＞action=＜/servlet-name＞ <br />　　＜servlet-class＞org.apache.struts.action.ActionServlet＜/servlet-class＞ <br />　　＜!-- All your init-params go here--＞ <br />　　＜/servlet＞ <br />　　＜servlet-mapping＞ <br />　　＜servlet-name＞action＜/servlet-name＞ <br />　　＜url-pattern＞*.do＜/url-pattern＞ <br />　　＜/servlet-mapping＞ <br />　　＜/web-app ＞ </p><p>　　这意味着ActionServlet负责处理你所有Struts的请求。你可以创建一个ActionServlet的子类，当应用启动，关闭，每个请求的时候做一些特定的事情。但是在继承ActionServlet类之前，你应该尽量创建一个PlugIn或RequestProcessor去解决你的问题。在Servlet1.1之前，Tiles框架是基于ActionServlet来修饰生成的响应。但是从1.1之后，它开始使用TilesRequestProcessor类。 </p><p>　　<strong>总结</strong></p><p>　　决定开发你自己的MVC框架是一个非常大的决定，你必须要考虑开发和维护框架代码所花费的时间和资源。Struts是一个非常强大和稳定的框架，你可以修改它来满足你绝大多数的业务需求。 </p><p>　　但另一方面，也不要草率地做出扩展Struts的决定。如果你在RequestProcessor中写了一些性能比较低的代码，它将会在每次请求时执行，因而降低你整个应用的效率。而且还是有一些情况，开发自己的MVC框架要比扩展Struts好。</p><img src ="http://www.blogjava.net/jelver/aggbug/107764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2007-04-01 15:43 <a href="http://www.blogjava.net/jelver/articles/107764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Hibernate模板开发笔记 (zhuan)</title><link>http://www.blogjava.net/jelver/articles/106959.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Wed, 28 Mar 2007 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/106959.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/106959.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/106959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/106959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/106959.html</trackback:ping><description><![CDATA[
		<h3 class="entry-header">Struts+Hibernate模板开发笔记</h3>
		<div class="entry-content">
				<div class="entry-body">
						<p>一、建立数据库联结池</p>
						<p>二、建立测试数据库</p>
						<p>三、建立Hibernate配置</p>
						<p>四、把数据库的表映射为类</p>
						<p>五、模板中的包定义</p>
						<p>六、设计模式:单例</p>
						<p>七、设计模式:门面</p>
						<p>八、设计模式:DAO</p>
						<p>九、设计模式:MVC</p>
						<p>十、自定义标签</p>
						<p>十一、解决汉字编码问题</p>
				</div>
				<div class="entry-more" id="more">
						<p>一、建立数据库联结池</p>
						<p>1.把数据库驱动程序拷入Tomcat5.0的common\lib目录下. </p>
						<p>如:oracle9i拷贝ojdbc14.jar </p>
						<p>2.修改TOMCAT配置文件conf\server.xml.在&lt;/host&gt;之前加入如下代码:</p>
						<p>&lt;Context path="/demo" docBase="F:\j_work\working\demo\demo" debug="5" reloadable="true" crossContext="true"&gt; <br />&lt;Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_DBTest_log." suffix=".txt" timestamp="true"/&gt; <br />&lt;Resource name="jdbc/demo" auth="Container" type="javax.sql.DataSource"/&gt; <br />&lt;ResourceParams name="jdbc/demo"&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;factory&lt;/name&gt; <br />&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;driverClassName&lt;/name&gt; <br />&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;url&lt;/name&gt; <br />&lt;value&gt;jdbc:oracle:thin:@192.168.3.200:1521:demo&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;username&lt;/name&gt; <br />&lt;value&gt;demo&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;password&lt;/name&gt; <br />&lt;value&gt;demo&lt;/value&gt;<br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;maxActive&lt;/name&gt;<br />&lt;value&gt;20&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;maxIdle&lt;/name&gt; <br />&lt;value&gt;10&lt;/value&gt;<br />&lt;/parameter&gt;<br />&lt;parameter&gt; <br />&lt;name&gt;maxWait&lt;/name&gt; <br />&lt;value&gt;-1&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;/ResourceParams&gt; <br />&lt;/Context&gt;</p>
						<p>二、建立测试数据库</p>
						<p>1.建立数据库用户名 demo 密码 demo </p>
						<p>2.建立测试表 </p>
						<p>建立测试表 demo </p>
						<p>字段说明 <br />id char(100) 　　　　　主键 <br />name varchar2(50) 　　 名字 <br />image_id number(10) 　 图片id <br />system_date date　 　　系统日期 <br />user_date date　　　　 录入日期 </p>
						<p>建立图片索引表 image </p>
						<p>字段说明 <br />id char(100) 　　　　　　　　　　　主键 <br />title varchar2(50) 　　　　　　　　图片标题 <br />message varchar2(2000) 　　　　　　图片信息 <br />original_image_path varchar(200)　 原始图片保存路径 <br />small _image_path varchar(200)　　 小图片保存路径 <br />image_id number(10) 　 　　　　　　图片id <br />system_date date　 　　 　　　　　 系统日期 </p>
						<p>id索引表 Singleton_Id </p>
						<p>字段说明 <br />id char(100) 　 　　主键 <br />name varchar2(50) 　索引名(需要为此字段建索引) <br />value number(10) 　 索引id</p>
						<p>三、建立Hibernate配置</p>
						<p>1.拷贝Oracle9i数据库驱动程序ojdbc14.jar到JBUILDER9安装目录的LIB目录下.用JBUILDER9.0建立PROJECT工程. </p>
						<p>2.把如下hibernate-2.0.3必须的库文件包含在工程中.</p>
						<p>hibernate2.jar </p>
						<p>commons-beanutils.jar </p>
						<p>commons-collections.jar </p>
						<p>commons-dbcp.jar </p>
						<p>commons-lang.jar </p>
						<p>commons-logging.jar </p>
						<p>commons-pool.jar </p>
						<p>dom4j.jar </p>
						<p>cglib-asm.jar </p>
						<p>connector.jar <br /></p>
						<p>3.建立 hibernate.cfg.xml文件,并拷到SRC目录 </p>
						<p>&lt;?xml version='1.0' encoding='utf-8'?&gt; <br />&lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"&gt; <br />&lt;hibernate-configuration&gt; <br />&lt;session-factory&gt; <br />&lt;property name="connection.datasource"&gt;java:comp/env/jdbc/demo&lt;/property&gt; <br />&lt;property name="show_sql"&gt;true&lt;/property&gt; <br />&lt;property name="use_outer_join"&gt;true&lt;/property&gt; <br />&lt;property name="dialect"&gt;net.sf.hibernate.dialect.Oracle9Dialect&lt;/property&gt; <br />&lt;!-- Mapping files --&gt; <br />&lt;!--mapping resource="com\kmtava\qtmis\jdo\TCzy.hbm.xml"/--&gt; <br />&lt;/session-factory&gt; <br />&lt;/hibernate-configuration&gt;</p>
						<p>四、把数据库的表映射为类</p>
						<p>下载 hibernate-extensions 压缩包. 修改 setenv.bat文件中的环境变量.主要修改Hibernate的目录和数据库驱动程序文件名.</p>
						<p>例如:</p>
						<p>@echo off <br />rem -------------------------------------------------------------------<br />rem Setup environment for hibernate tools<br />rem -------------------------------------------------------------------</p>
						<p>set JDBC_DRIVER=..\..\..\lib\ojdbc14.jar<br />set HIBERNATE_HOME=..\..\..\hibernate-2.0.3</p>
						<p>set CORELIB=%HIBERNATE_HOME%\lib<br />set LIB=..\lib<br />set PROPS=%HIBERNATE_HOME%\src<br />set CP=%JDBC_DRIVER%;%PROPS%;%HIBERNATE_HOME%\hibernate2.jar;%CORELIB%\commons-logging.jar;%CORELIB%\commons-collections.jar;<br />%CORELIB%\commons-lang.jar;%CORELIB%\cglib.jar;%CORELIB%\dom4j.jar;%CORELIB%\odmg.jar;%CORELIB%\xml-apis.jar;%CORELIB%\xerces.jar;<br />%CORELIB%\xalan.jar;%LIB%\jdom.jar;%LIB%\..\hibernate-tools.jar</p>
						<p>运行ddl2hbm.bat, 设置参数如下:</p>
						<p>[ CONNECTION ] <br />DRIVER CLASS : oracle.jdbc.driver.OracleDriver 　　　　　　　　(org.gjt.mm.mysql.Driver)<br />CONNECTION URL: jdbc:oracle:thin:@192.168.3.200:1521:demo 　 　(jdbc:mysql://localhost/authority)<br />USER: demo<br />PASSWORD: demo</p>
						<p>[ MAPPING ]<br />KEY FIELD : id<br />SCHEMAEXPORT : uuid.hex</p>
						<p>[ CODE ]<br />PACKAGE NAME: com.company.demo.jdo</p>
						<p>[ OUTPUT ]<br />F:\j_work\working\demo\src <br /></p>
						<p>其它的用默认值，点[TABLES]的tables..选择表，程序生成类和xml</p>
						<p>生成的文件如下：</p>
						<p>(1)image.java</p>
						<p>package com.company.demo.jdo; <br />import java.io.Serializable;<br />import java.util.Date;<br />import org.apache.commons.lang.builder.EqualsBuilder;<br />import org.apache.commons.lang.builder.HashCodeBuilder;<br />import org.apache.commons.lang.builder.ToStringBuilder;</p>
						<p>/** @author Hibernate CodeGenerator */<br />public class Image implements Serializable {</p>
						<p>/** identifier field */<br />private String id;</p>
						<p>/** nullable persistent field */<br />private String title;</p>
						<p>/** nullable persistent field */<br />private String message;</p>
						<p>/** nullable persistent field */<br />private String originalImagePath;</p>
						<p>/** nullable persistent field */<br />private String smallImagePath;</p>
						<p>/** nullable persistent field */<br />private long imageId;</p>
						<p>/** nullable persistent field */<br />private Date systemDate;</p>
						<p>/** full constructor */<br />public Image(String title, String message, String originalImagePath, String smallImagePath, long imageId, Date systemDate) {<br />this.title = title;<br />this.message = message;<br />this.originalImagePath = originalImagePath;<br />this.smallImagePath = smallImagePath;<br />this.imageId = imageId;<br />this.systemDate = systemDate;<br />}</p>
						<p>/** default constructor */<br />public Image() {<br />}</p>
						<p>public String getId() {<br />return this.id;<br />}</p>
						<p>public void setId(String id) {<br />this.id = id;<br />}</p>
						<p>public String getTitle() {<br />return this.title;<br />}</p>
						<p>public void setTitle(String title) {<br />this.title = title;<br />}</p>
						<p>public String getMessage() {<br />return this.message;<br />}</p>
						<p>public void setMessage(String message) {<br />this.message = message;<br />}</p>
						<p>public String getOriginalImagePath() {<br />return this.originalImagePath;<br />}</p>
						<p>public void setOriginalImagePath(String originalImagePath) {<br />this.originalImagePath = originalImagePath;<br />}</p>
						<p>public String getSmallImagePath() {<br />return this.smallImagePath;<br />}</p>
						<p>public void setSmallImagePath(String smallImagePath) {<br />this.smallImagePath = smallImagePath;<br />}</p>
						<p>public long getImageId() {<br />return this.imageId;<br />}</p>
						<p>public void setImageId(long imageId) {<br />this.imageId = imageId;<br />}</p>
						<p>public Date getSystemDate() {<br />return this.systemDate;<br />}</p>
						<p>public void setSystemDate(Date systemDate) {<br />this.systemDate = systemDate;<br />}</p>
						<p>public String toString() {<br />return new ToStringBuilder(this)<br />.append("id", getId())<br />.toString();<br />}</p>
						<p>public boolean equals(Object other) {<br />if ( !(other instanceof Image) ) return false;<br />Image castOther = (Image) other;<br />return new EqualsBuilder()<br />.append(this.getId(), castOther.getId())<br />.isEquals();<br />}</p>
						<p>public int hashCode() {<br />return new HashCodeBuilder()<br />.append(getId())<br />.toHashCode();<br />}</p>
						<p>}<br /></p>
						<p>(2)Image.hbm.xml<br /></p>
						<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"&gt;<br />&lt;hibernate-mapping&gt;<br />&lt;class name="com.company.demo.jdo.Image" schema="DEMO" table="IMAGE"&gt;<br />&lt;id column="ID" name="id" type="string"&gt;<br />&lt;generator class="uuid.hex"/&gt;<br />&lt;/id&gt;<br />&lt;property column="TITLE" length="50" name="title" type="string"/&gt;<br />&lt;property column="MESSAGE" length="2000" name="message" type="string"/&gt;<br />&lt;property column="ORIGINAL_IMAGE_PATH" length="200" name="originalImagePath" type="string"/&gt;<br />&lt;property column="SMALL_IMAGE_PATH" length="200" name="smallImagePath" type="string"/&gt;<br />&lt;property column="IMAGE_ID" length="10" name="imageId" type="long"/&gt;<br />&lt;property column="SYSTEM_DATE" length="7" name="systemDate" type="timestamp"/&gt;<br />&lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br /></p>
						<p>其它生成的文件略！</p>
						<p>五、模板中的包定义</p>
						<p>com.company.demo.dataModule 　　数据模型<br />com.company.demo.dao 　　　 　　DAO模型<br />com.company.demo.exception 　　 异常<br />com.company.demo.jdo　　　　　　hibernate类映射　<br />com.company.demo.start 　　　　 启动JSP服务时加载的类<br />com.company.demo.tags 　　　　　自定义标签类<br />com.company.demo.thread 　　　　线程类<br />com.company.demo.util 　　　　　工具类<br />com.company.demo.web　　　　　　Struts类 <br />com.company.demo.facade 　　　　Facade调用的类</p>
						<p>六、设计模式:单例</p>
						<p>1.数据模型</p>
						<p>接口(Datamodule.java)<br /></p>
						<p>package com.company.demo.datamodule; <br />package com.company.demo.datamodule;</p>
						<p>import net.sf.hibernate.Session;<br />import net.sf.hibernate.Transaction;<br />import net.sf.hibernate.HibernateException;</p>
						<p>import net.sf.hibernate.SessionFactory;<br />import net.sf.hibernate.cfg.Configuration;</p>
						<p>/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public interface DataModule {<br />public SessionFactory getSessionFactory();<br />}<br /></p>
						<p>数据模型 (DatamoduleImpl.java)<br /></p>
						<p>package com.company.demo.datamodule;</p>
						<p>/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>import net.sf.hibernate.Session;<br />import net.sf.hibernate.Transaction;<br />import net.sf.hibernate.HibernateException;</p>
						<p>import net.sf.hibernate.SessionFactory;<br />import net.sf.hibernate.cfg.Configuration;</p>
						<p>/**<br />* 建立 SessionFactory<br />*/</p>
						<p>public class DataModuleImpl implements DataModule {</p>
						<p>private SessionFactory sessionFactory;</p>
						<p>public DataModuleImpl() throws HibernateException {<br />sessionFactory=new Configuration().configure().buildSessionFactory();<br />}<br />/**<br />* 从dataModule中取得 SessionFactory<br />*/</p>
						<p>public SessionFactory getSessionFactory(){<br />return this.sessionFactory;<br />}<br />}</p>
						<p>2.产生唯一ID的父类</p>
						<p>接口 (SingletonIdDAO.java)</p>
						<p>package com.company.demo.dao; <br />/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public interface SingletonIdDAO {<br />}</p>
						<p>ID父类 (SingletonIdDAOImpl.java) </p>
						<p>package com.company.demo.dao;</p>
						<p>import java.util.List;<br />import com.company.demo.datamodule.*;<br />import com.company.demo.jdo.SingletonId;</p>
						<p>import net.sf.hibernate.SessionFactory;<br />import net.sf.hibernate.HibernateException;<br />import net.sf.hibernate.Session;<br />import net.sf.hibernate.Transaction;<br />import net.sf.hibernate.Query;</p>
						<p>/**<br />* 产生唯一的ID<br />*<br />* 数据库结构(ORACLE9i):<br />* 表名 SINGLETON_ID<br />* 字段 id(char) name varchar2(50) value number(10.0)<br />*<br />*<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*<br />*<br />*/</p>
						<p>public class SingletonIdDAOImpl implements SingletonIdDAO{</p>
						<p>private SessionFactory sessionFactory;<br />private DataModule dataModule;</p>
						<p>/**<br />* 设数据模型<br />*/</p>
						<p>public void setDataModule(DataModule dataModule){<br />this.dataModule=dataModule;<br />this.sessionFactory=dataModule.getSessionFactory();<br />}</p>
						<p>////////////////以下是业务逻辑////////////////////<br />private SingletonId findByName(String name) throws HibernateException,Exception {<br />Transaction transaction = null;<br />SingletonId singletonId=new SingletonId();<br />Session session=sessionFactory.openSession();<br />String queryString = "select g from SingletonId as g where g.name = :name order by g.value desc";<br />try{<br />transaction = session.beginTransaction();<br />Query query = session.createQuery(queryString);<br />query.setString("name",name);<br />// q.setFirstResult(20000);<br />//q.setMaxResults(100);<br />query.setMaxResults(1);<br />List list=query.list();<br />singletonId=(SingletonId)list.get(0);<br />transaction.commit();<br />}<br />catch(Exception ex){<br />if ( transaction!=null ){<br />transaction.rollback();<br />}<br />//throw ex;<br />}finally{<br />session.close();<br />}<br />return singletonId;<br />}<br /></p>
						<p>/** 取得value<br />* @param name 产唯一ID的类型名称<br />* @return value<br />* @throws HibernateException<br />*/</p>
						<p>protected long getValue(String name) throws HibernateException,Exception {<br />SingletonId singletonId=findByName(name);<br />return singletonId.getValue();<br />}<br />/** 设置value<br />* @param name 产唯一ID的类型名称<br />* @throws HibernateException<br />*/</p>
						<p>protected void setValue(String name) throws HibernateException,Exception {<br />Session session=sessionFactory.openSession();<br />SingletonId singletonId=findByName(name);<br />singletonId.setName(name);<br />singletonId.setValue(singletonId.getValue()+1);<br />Transaction transaction = null;<br />try{<br />transaction = session.beginTransaction();<br />session.saveOrUpdate(singletonId);<br />transaction.commit();<br />}catch(HibernateException he){<br />if ( transaction!=null ){<br />transaction.rollback();<br />}<br />throw he;<br />}finally{<br />session.close();<br />}<br />}<br />}</p>
						<p>3.单例图片ID类(ImageSingletonId.java)<br /></p>
						<p>package com.company.demo.dao.count; <br />import net.sf.hibernate.HibernateException;<br />import com.company.demo.dao.SingletonIdDAOImpl;<br />import com.company.demo.datamodule.DataModule;</p>
						<p>/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public class ImageSingletonId extends SingletonIdDAOImpl{</p>
						<p>private static ImageSingletonId imageSingletonId = null;</p>
						<p>/**<br />* 构造函数私有<br />*/<br />private ImageSingletonId(){<br />}<br />/**<br />* 静态工厂模式,取得ImageSingletonId实例<br />*/<br />public static synchronized ImageSingletonId getInstance() {<br />if (imageSingletonId==null)<br />{<br />imageSingletonId=new ImageSingletonId();<br />}<br />return imageSingletonId;<br />}</p>
						<p>/**<br />* 取图形唯一ID<br />*/<br />public synchronized long getImageValue() throws HibernateException,Exception {<br />long value;<br />setValue("image");<br />value=getValue("image");<br />return value;<br />}</p>
						<p>}</p>
						<p>4.图片ID测试文件(TestImageSingletonId.jsp)</p>
						<p>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="net.sf.hibernate.*" %&gt;<br />&lt;%@ page import="net.sf.hibernate.cfg.*" %&gt;<br />&lt;%@ page import="com.company.demo.datamodule.*" %&gt;<br />&lt;%@ page import="com.company.demo.dao.count.*" %&gt;<br />&lt;%!<br />DataModule dataModule;<br />ImageSingletonId imageSingletonId;<br />%&gt;<br />&lt;%<br />try{<br />imageSingletonId=ImageSingletonId.getInstance();<br />imageSingletonId.setDataModule(new DataModuleImpl());<br />}<br />catch(Exception ex)<br />{<br />ex.toString();<br />} <br />for(int i=0;i&lt;100;i++){<br />out.print("测试..........&lt;BR&gt;");<br />out.print(imageSingletonId.getImageValue());<br />out.print("----------------&lt;BR&gt;");<br />}<br />%&gt;<br /></p>
						<p>5.单例记数器ID类(MainPageSingletonId.java)</p>
						<p>package com.company.demo.dao.count; <br />import net.sf.hibernate.HibernateException;<br />import com.company.demo.dao.SingletonIdDAOImpl;<br />import com.company.demo.datamodule.DataModule;</p>
						<p>/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public class MainPageSingletonId extends SingletonIdDAOImpl{</p>
						<p>private static MainPageSingletonId mainPageSingletonId = null;</p>
						<p>/**<br />* 构造函数私有<br />*/<br />private MainPageSingletonId(){<br />}<br />/**<br />* 静态工厂模式,取得MainPageSingletonId实例<br />*/<br />public static synchronized MainPageSingletonId getInstance() {<br />if (mainPageSingletonId==null)<br />{<br />mainPageSingletonId=new MainPageSingletonId();<br />}<br />return mainPageSingletonId;<br />}<br /></p>
						<p>/**<br />* 取唯一ID<br />*/<br />public synchronized long getMainPageValue() throws HibernateException,Exception {<br />long value;<br />setValue("mainPage");<br />value=getValue("mainPage");<br />return value;<br />}</p>
						<p>}</p>
						<p>6.记数ID测试文件(TestMainPageSingletonId.jsp)</p>
						<p>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="net.sf.hibernate.*" %&gt;<br />&lt;%@ page import="net.sf.hibernate.cfg.*" %&gt;<br />&lt;%@ page import="com.company.demo.datamodule.*" %&gt;<br />&lt;%@ page import="com.company.demo.dao.count.MainPageSingletonId" %&gt;<br />&lt;%!<br />DataModule dataModule;<br />MainPageSingletonId mainPageSingletonId;<br />%&gt;<br />&lt;%<br />try{<br />mainPageSingletonId=MainPageSingletonId.getInstance();<br />mainPageSingletonId.setDataModule(new DataModuleImpl());<br />}<br />catch(Exception ex)<br />{<br />ex.toString();<br />} <br />for(int i=0;i&lt;100;i++){<br />out.print("测试..........&lt;BR&gt;");<br />out.print(mainPageSingletonId.getMainPageValue());<br />out.print("----------------&lt;BR&gt;");<br />}<br />%&gt;</p>
						<p>7.综合单例测试(略)</p>
						<p>七、设计模式:门面</p>
						<p>1.在JSP中调"Session Facade"类</p>
						<p>在JSP文件中插入下列标签:</p>
						<p>&lt;jsp:useBean id="sessionBean" scope="session" class="com.company.demo.web.SessionBean" /&gt;</p>
						<p>2.SessionBean类</p>
						<p>package com.company.demo.web;</p>
						<p>import com.company.demo.datamodule.*;<br />import com.company.demo.thread.*;<br />import com.company.demo.facade.*;<br />/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public class SessionBean {<br />private DataModule dataModule;//数据模型<br />private Auth auth; //登录的用户信息<br />private Business business; //系统中的业务逻辑主线<br />private Line line; //保存模块中的关联状态<br />/**<br />* 构函数,初始化业务逻辑中的类(单例)<br />*/<br />public SessionBean(){<br />try {<br />dataModule=SessionBeanSingletonFactory.getDataModule();<br />auth=SessionBeanSingletonFactory.getAuth();<br />business=SessionBeanSingletonFactory.getBusiness();<br />line=SessionBeanSingletonFactory.getLine();<br />}<br />catch (Exception ex) {<br />ex.printStackTrace();<br />}<br />}<br />/**<br />* 门面模式调用的公共应用模块<br />* @return Utility<br />*/<br />public Utility getUtility() {<br />return SessionBeanFactory.getUtility();<br />}<br />}</p>
						<p>3.SessionBeanFactory类</p>
						<p>package com.company.demo.web; import com.company.demo.datamodule.*;<br />import com.company.demo.thread.*;<br />import com.company.demo.facade.*;<br />import net.sf.hibernate.HibernateException;<br />/**<br />* SessionBean门面模式的抽象工厂类<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public class SessionBeanFactory {<br />/**<br />* 生成业务逻辑状态实例(facade)<br />* @return LineImpl<br />* @throws HibernateException<br />*/<br />private SessionBeanFactory(){}<br />public final static Utility getUtility(){<br />return new UtilityImpl();<br />}</p>
						<p>}</p>
						<p>4.SessionBeanSingletonFactory类</p>
						<p>package com.company.demo.web; import com.company.demo.datamodule.*;<br />import com.company.demo.thread.*;<br />import com.company.demo.facade.*;<br />import net.sf.hibernate.HibernateException;</p>
						<p>/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public class SessionBeanSingletonFactory {<br />/**<br />* 生成用户认证实例(单例)<br />* @return AuthImpl<br />* @throws HibernateException<br />*/</p>
						<p>private SessionBeanSingletonFactory(){}</p>
						<p>public final static Auth getAuth() throws HibernateException{<br />return new AuthImpl();<br />}<br />/**<br />* 生成商务逻辑实例(单例)<br />* @return BusinessImpl<br />* @throws HibernateException<br />*/<br />public final static Business getBusiness() throws HibernateException{<br />return new BusinessImpl();<br />}<br />/**<br />* 生成数据模型实例(单例)<br />* @return DataModuleImpl<br />* @throws HibernateException<br />*/</p>
						<p>public final static DataModule getDataModule() throws HibernateException{<br />return new DataModuleImpl();<br />}<br />/**<br />* 生成业务逻辑状态实例(单例)<br />* @return LineImpl<br />* @throws HibernateException<br />*/</p>
						<p>public final static Line getLine() throws HibernateException{<br />return new LineImpl();<br />}</p>
						<p>}</p>
						<p>八、设计模式:DAO</p>
						<p>使用数据访问对象(DAO)使我们可以将底层数据访问逻辑与业务逻辑分离开。我们构建了为每一个数据源提供 GRUD (创建、读取、更新、删除)操作的 DAO 类。</p>
						<p>下面是一个数据源GRUD(创建)操作的DAO实例.</p>
						<p>1.接口(DemoDAO.java)</p>
						<p>package com.company.demo.dao; </p>
						<p>import net.sf.hibernate.HibernateException;<br />import com.company.demo.jdo.Demo;<br />import com.company.demo.datamodule.*;<br />/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public interface DemoDAO {</p>
						<p>/**设置数据模型**/<br />public void setDataModule(DataModule dataModule);<br />/** 建立对象 **/<br />public void createDemo(Demo demo) throws HibernateException,Exception;</p>
						<p>}</p>
						<p>2.抽象工厂(DemoDAOFactory.java)</p>
						<p>package com.company.demo.dao; <br />/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public class DemoDAOFactory {</p>
						<p>private DemoDAOFactory()<br />{ }<br />public final static DemoDAO getDemoDAO(){<br />return new DemoDAOImpl();<br />}<br />}</p>
						<p>3.DAO类(DemoDAOImpl.java)</p>
						<p>package com.company.demo.dao; <br />import java.util.List;<br />import com.company.demo.datamodule.*;<br />import com.company.demo.jdo.Demo;</p>
						<p>import net.sf.hibernate.SessionFactory;<br />import net.sf.hibernate.HibernateException;<br />import net.sf.hibernate.Session;<br />import net.sf.hibernate.Transaction;<br />import net.sf.hibernate.Query;</p>
						<p>/**<br />* &lt;p&gt;Title: Struts+Hibernate开发模板&lt;/p&gt;<br />* &lt;p&gt;Description: 通用开发模板&lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: 优势科技&lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />*/</p>
						<p>public class DemoDAOImpl implements DemoDAO {</p>
						<p>private SessionFactory sessionFactory;<br />private DataModule dataModule;</p>
						<p>/**<br />* 设数据模型<br />* @param dataModule<br />*/<br />public void setDataModule(DataModule dataModule){<br />this.dataModule=dataModule;<br />this.sessionFactory=dataModule.getSessionFactory();<br />}</p>
						<p>/**<br />* 建立DEMO<br />* @param demo<br />* @throws HibernateException<br />* @throws java.lang.Exception<br />*/<br />public void createDemo(Demo demo) throws HibernateException,Exception {<br />Transaction transaction = null;<br />Session session=sessionFactory.openSession();<br />try{<br />transaction = session.beginTransaction();<br />session.save(demo);<br />transaction.commit();<br />}catch(HibernateException he){<br />if ( transaction!=null ){<br />transaction.rollback();<br />}<br />throw he;<br />}finally{<br />session.close();<br />}</p>
						<p>}<br />}<br /></p>
						<p>九、设计模式:MVC</p>
						<p>1.表示层(应用了template)</p>
						<p>JSP文件(template/Basictemplate.jsp)<br /></p>
						<p>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ taglib uri='/WEB-INF/struts-template.tld' prefix='template' %&gt; <br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;template:get name='title'/&gt;&lt;/title&gt;<br />&lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=gb2312"&gt;<br />&lt;META HTTP-EQUIV="Content-Language" CONTENT="zh-CN"&gt;<br />&lt;META name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"&gt;<br />&lt;META name="keywords" content="extreme programming, extreme projects, design pattern, J2EE, forum, chinese"&gt;<br />&lt;LINK href="default.css" type="text/css" rel="stylesheet"&gt;<br />&lt;/head&gt;<br />&lt;body topmargin='0'&gt;<br />&lt;table width="95%" border="0" align="center"&gt;<br />&lt;tr&gt;<br />&lt;td width="17%" rowspan="3"&gt;<br />&lt;!-- START OF NAVBAR --&gt;<br />&lt;template:get name='navbar'/&gt;<br />&lt;!-- END OF NAVBAR --&gt;<br />&lt;/td&gt;<br />&lt;td width="83%" valign="top"&gt;<br />&lt;!-- START OF HEADER --&gt;<br />&lt;template:get name='header'/&gt;<br />&lt;!-- END OF HEADER --&gt;<br />&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td valign="top"&gt;<br />&lt;!-- START OF CONTENT --&gt;<br />&lt;template:get name='content'/&gt;<br />&lt;!--END OF CONTENT --&gt;<br />&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td valign="top"&gt;<br />&lt;!-- START OF FOOTER --&gt;<br />&lt;template:get name='footer'/&gt;<br />&lt;!-- END OF FOOTER --&gt;<br />&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;/body&gt;&lt;/html&gt;</p>
						<p>JSP文件(addDemo.jsp)</p>
						<p>&lt;%<br />/**<br />* &lt;p&gt;Title: Struts开发测试1.0&lt;/p&gt;<br />* &lt;p&gt;Description:项目说明 &lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003-2008 &lt;/p&gt;<br />* &lt;p&gt;Company:优势科技 &lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />* @time [2003年10月22日 14时50分]<br />**/ <br />%&gt;</p>
						<p>&lt;%@page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@taglib uri='/WEB-INF/struts-template.tld' prefix='template' %&gt;<br />&lt;template:insert template='/template/basicTemplate.jsp'&gt;<br />&lt;template:put name='title' content='Struts开发测试1.0' direct='true'/&gt;<br />&lt;template:put name='navbar' content='/content/navbar.jsp' /&gt;<br />&lt;template:put name='header' content='/content/header.jsp' /&gt;<br />&lt;template:put name='content' content='/content/addDemo.jsp'/&gt;<br />&lt;template:put name='footer' content='/content/footer.jsp' /&gt;<br />&lt;/template:insert&gt;<br /></p>
						<p>JSP文件(content/addDemo.jsp)</p>
						<p>&lt;%<br />/**<br />* &lt;p&gt;Title: Struts开发测试1.0&lt;/p&gt;<br />* &lt;p&gt;Description:项目说明 &lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003-2008 &lt;/p&gt;<br />* &lt;p&gt;Company:优势科技 &lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />* @time [2003年10月22日 14时50分]<br />**/ <br />%&gt;</p>
						<p>&lt;%@page contentType = "text/html; charset=GB2312" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;<br />&lt;%@taglib uri="/WEB-INF/ImageTag.tld" prefix="image" %&gt;<br />&lt;%@taglib uri="/WEB-INF/DateTag.tld" prefix="date" %&gt;<br />&lt;jsp:useBean id="sessionBean" scope="session" class="com.company.demo.web.SessionBean" /&gt;</p>
						<p>&lt;html:errors/&gt;<br />&lt;FORM METHOD="post" ACTION="addDemoAction.do" &gt;<br />&lt;p&gt;名字(name) :<br />&lt;input name="name" type="text"&gt;<br />&lt;/p&gt;</p>
						<p>&lt;p&gt;日期(date) :<br />&lt;date:inputButton type="date" name="userDate"/&gt;<br />&lt;/p&gt;</p>
						<p>&lt;p&gt;日期(date) :<br />&lt;date:inputButton type="datetime" name="userDateTime"/&gt;<br />&lt;/p&gt;<br />&lt;p&gt;<br />&lt;image:uploadButton savePath="saveimagepath"/&gt;<br />&lt;/p&gt;<br />&lt;p&gt;<br />&lt;input type="submit" name="Submit" value="提交"&gt;<br />&lt;input type="reset" name="Submit2" value="重置"&gt;<br />&lt;/p&gt;<br />&lt;/FORM&gt;<br /></p>
						<p>控制层(struts-config.xml)<br /></p>
						<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"&gt;<br />&lt;struts-config&gt;<br />&lt;form-beans&gt;<br />&lt;form-bean name="demoActionForm" type="com.company.demo.web.DemoActionForm" /&gt;<br />&lt;form-bean name="imageUploadActionForm" type="com.company.demo.web.ImageUploadActionForm" /&gt;<br />&lt;/form-beans&gt;<br />&lt;global-forwards&gt;<br />&lt;forward name="unknown-error" path="/error.jsp" /&gt;<br />&lt;forward name="success" path="/success.jsp" /&gt;<br />&lt;/global-forwards&gt;<br />&lt;action-mappings&gt;<br />&lt;action name="demoActionForm" type="com.company.demo.web.AddDemoAction" input="/addDemo.jsp" scope="request" path="/addDemoAction" /&gt;<br />&lt;action name="imageUploadActionForm" type="com.company.demo.web.ImageUploadAction" input="/content/imageUpload.jsp" scope="request" path="/imageUploadAction" /&gt;<br />&lt;/action-mappings&gt;<br />&lt;/struts-config&gt;<br /></p>
						<p>文件(DemoActionForm.java)<br /></p>
						<p>package com.company.demo.web; <br />import org.apache.struts.action.*;<br />import javax.servlet.http.*;</p>
						<p>public class DemoActionForm extends ActionForm {<br />private String name;<br />private String userDate;<br />private String userDateTime;<br />public String getName() {<br />return name;<br />}<br />public void setName(String name) {<br />this.name = name;<br />}<br />public String getUserDate() {<br />return userDate;<br />}<br />public void setUserDate(String userDate) {<br />this.userDate = userDate;<br />}</p>
						<p>public String getUserDateTime() {<br />return userDateTime;<br />}<br />public void setUserDateTime(String userDateTime) {<br />this.userDateTime = userDateTime;<br />}</p>
						<p>public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {<br />/**@todo: finish this method, this is just the skeleton.*/<br />return null;<br />}<br />public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {<br />}<br />}</p>
						<p>应用逻辑层(AddDemoAction.java)</p>
						<p>package com.company.demo.web; <br />import org.apache.struts.action.*;<br />import javax.servlet.http.*;<br />import java.util.Date;<br />import java.text.DateFormat;<br />import java.text.SimpleDateFormat;</p>
						<p>import com.company.demo.jdo.Demo;<br />import com.company.demo.dao.DemoDAO;<br />import com.company.demo.dao.DemoDAOFactory;<br />import com.company.demo.dao.DemoDAOImpl;</p>
						<p>public class AddDemoAction extends Action {<br />public ActionForward perform(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {<br />/**@todo: complete the business logic here, this is just a skeleton.*/<br />DemoActionForm demoActionForm = (DemoActionForm) actionForm;<br />SessionBean sessionBean = (SessionBean) httpServletRequest.getSession().getAttribute("sessionBean");<br />if (sessionBean == null) {<br />httpServletRequest.setAttribute("message", "系统超时,请重新登录!!!");<br />return actionMapping.findForward("unknown-error");<br />}<br />else {<br />try {<br />Demo demo = new Demo();<br />demo.setName(demoActionForm.getName());<br />DateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd hh:ss:mm");<br />Date userDateTime = dateTimeFormat.parse(demoActionForm.getUserDateTime());<br />demo.setSystemDate(userDateTime);<br />DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");<br />Date userDate = dateFormat.parse(demoActionForm.getUserDate());<br />demo.setUserDate(userDate);<br />DemoDAO demoDAO = DemoDAOFactory.getDemoDAO();<br />demoDAO.setDataModule(sessionBean.getDataModule());<br />demoDAO.createDemo(demo);<br />}<br />catch (Exception ex) {<br />httpServletRequest.setAttribute("message",ex.toString());<br />return (actionMapping.findForward("unknown-error"));<br />}<br />httpServletRequest.setAttribute("message", "成功!");<br />return (actionMapping.findForward("success"));<br />}<br />}<br />}</p>
						<p>十、自定义标签</p>
						<p>1.自定义标签库(DateTag.tld)<br /></p>
						<p>&lt;?xml version="1.0" encoding="GB2312" ?&gt; &lt;!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd"&gt;<br />&lt;taglib&gt;<br />&lt;tlibversion&gt;1.0&lt;/tlibversion&gt;<br />&lt;jspversion&gt;1.2&lt;/jspversion&gt;<br />&lt;shortname&gt;Date Tag Library&lt;/shortname&gt;<br />&lt;info&gt;日期录入标签库&lt;/info&gt;<br />&lt;tag&gt;<br />&lt;name&gt;inputButton&lt;/name&gt;<br />&lt;tagclass&gt;com.company.demo.tags.DateTag&lt;/tagclass&gt;<br />&lt;bodycontent&gt;empty&lt;/bodycontent&gt;<br />&lt;attribute&gt;<br />&lt;name&gt;name&lt;/name&gt;<br />&lt;required&gt;true&lt;/required&gt;<br />&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br />&lt;/attribute&gt;<br />&lt;attribute&gt;<br />&lt;name&gt;type&lt;/name&gt;<br />&lt;required&gt;true&lt;/required&gt;<br />&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br />&lt;/attribute&gt;<br />&lt;/tag&gt;<br />&lt;/taglib&gt;</p>
						<p>2.Tag类(DateTag.java)</p>
						<p>package com.company.demo.tags; import javax.servlet.jsp.*;<br />import javax.servlet.jsp.tagext.*;</p>
						<p>import javax.servlet.*;</p>
						<p>/**<br />* &lt;p&gt;Title: &lt;/p&gt;<br />* &lt;p&gt;Description: &lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<br />* &lt;p&gt;Company: &lt;/p&gt;<br />* @author 段洪杰<br />* @version 1.0<br />* 生成日期录框<br />*/</p>
						<p>public class DateTag extends TagSupport{<br />String type,name; //类型和参数名</p>
						<p>public void setType(String type)throws JspException {<br />this.type=type;<br />}</p>
						<p>public void setName(String name)throws JspException {<br />this.name=name;<br />}</p>
						<p>public int doStartTag() throws JspException {<br />String string,dialogHeight,dialogWidth,size;<br />if(type=="date") {<br />dialogHeight="290";<br />dialogWidth="240";<br />size="10";<br />}<br />else if(type=="datetime") {<br />dialogHeight="315";<br />dialogWidth="240";<br />size="18";<br />}<br />else {<br />throw new JspTagException("类型参数错误,只能选择date或datetime!");<br />}</p>
						<p>string="&lt;SCRIPT language=javascript&gt;"+<br />"function selectDate"+name+"(oSource){"+<br />"window.showModalDialog('content/dtpicker.jsp?rn='+Math.random(),oSource,'dialogHeight:"+dialogHeight+"px; dialogWidth: "+dialogWidth+"px;center: Yes; help: No; resizable: No;scroll:No;status: No;')"+<br />"}"+<br />"&lt;/script&gt;"+<br />"&lt;INPUT readOnly size="+size+" name="+name+<br />" DataType=\"date\" comparer=\"compareToLastUsedOn\" dateTimeType="+type+"&gt;"+<br />"&lt;IMG src=\"images/select.gif\" width=\"23\" height=\"23\" align=absMiddle"+<br />" onclick=selectDate"+name+"(document.all(this.sourceIndex-1))&gt; ";</p>
						<p>try{<br />JspWriter out=pageContext.getOut();<br />out.println(string);<br />}<br />catch(Exception ex)<br />{<br />throw new JspTagException("程序调用标签时出错: "+ex.getMessage());<br />}<br />return SKIP_BODY;<br />}<br />public int doEndTag() throws JspException {<br />return EVAL_PAGE;<br />}<br />}<br /></p>
						<p>十一、解决汉字编码问题</p>
						<p>1.修改web.xml文件,在&lt;web-app&gt;标签后增加如下内容.<br /></p>
						<p>&lt;filter&gt;<br />&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />&lt;filter-class&gt;com.company.demo.util.SetEncodingFilter&lt;/filter-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;encoding&lt;/param-name&gt;<br />&lt;param-value&gt;gb2312&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />&lt;servlet&gt;<br /></p>
						<p>2.创建类文件(SetEncodingFilter.java)<br /></p>
						<p>package com.company.demo.util; <br />import java.io.IOException;<br />import javax.servlet.Filter;<br />import javax.servlet.FilterChain;<br />import javax.servlet.FilterConfig;<br />import javax.servlet.ServletException;<br />import javax.servlet.ServletRequest;<br />import javax.servlet.ServletResponse;<br />import javax.servlet.UnavailableException;</p>
						<p>/**<br />* Set All HttpRequest Encoding</p>
						<p>*/<br />public class SetEncodingFilter<br />implements Filter {<br />/**<br />* The default character encoding to set for requests that pass through<br />* this filter.<br />*/<br />protected String encoding = null;</p>
						<p>/**<br />* The filter configuration object we are associated with. If this value<br />* is null, this filter instance is not currently configured.<br />*/<br />protected FilterConfig filterConfig = null;</p>
						<p>/**<br />* Should a character encoding specified by the client be ignored?<br />*/<br />protected boolean ignore = true;</p>
						<p>/**<br />* Take this filter out of service.<br />*/<br />public void destroy() {<br />this.encoding = null;<br />this.filterConfig = null;<br />}</p>
						<p>/**<br />* Select and set (if specified) the character encoding to be used to<br />* interpret request parameters for this request.<br />*<br />* @param request The servlet request we are processing<br />* @param result The servlet response we are creating<br />* @param chain The filter chain we are processing<br />*<br />* @exception IOException if an input/output error occurs<br />* @exception ServletException if a servlet error occurs<br />*/<br />public void doFilter(<br />ServletRequest request,<br />ServletResponse response,<br />FilterChain chain) throws IOException, ServletException {<br />if (ignore || (request.getCharacterEncoding() == null)) {<br />request.setCharacterEncoding(selectEncoding(request));<br />}<br />chain.doFilter(request, response);<br />}</p>
						<p>/**<br />* Place this filter into service.<br />* @param filterConfig The filter configuration object<br />*/<br />public void init(FilterConfig filterConfig) throws ServletException {</p>
						<p>this.filterConfig = filterConfig;<br />this.encoding = filterConfig.getInitParameter("encoding");<br />String value = filterConfig.getInitParameter("ignore");<br />if (value == null)<br />this.ignore = true;<br />else if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes"))<br />this.ignore = true;<br />else<br />this.ignore = false;<br />}</p>
						<p>/**<br />* Select an appropriate character encoding to be used, based on the<br />* characteristics of the current request and/or filter initialization<br />* parameters. If no character encoding should be set, return<br />* &lt;code&gt;null&lt;/code&gt;.<br />* &lt;p&gt;<br />* The default implementation unconditionally returns the value configured<br />* by the &lt;strong&gt;encoding&lt;/strong&gt; initialization parameter for this<br />* filter.<br />*<br />* @param request The servlet request we are processing<br />*/<br />protected String selectEncoding(ServletRequest request) {<br />return (this.encoding);<br />}</p>
						<p>/**<br />* Returns the filterConfig.<br />* @return FilterConfig<br />*/<br />public FilterConfig getFilterConfig() {<br />return filterConfig;<br />}</p>
						<p>/**<br />* Sets the filterConfig.<br />* @param filterConfig The filterConfig to set<br />*/<br />public void setFilterConfig(FilterConfig filterConfig) {<br />this.filterConfig = filterConfig;<br />}</p>
						<p>}</p>
						<p>作者：快刀浪子(段洪杰)</p>
				</div>
		</div>
<img src ="http://www.blogjava.net/jelver/aggbug/106959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2007-03-28 14:41 <a href="http://www.blogjava.net/jelver/articles/106959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于struts+spring+ibatis的轻量级J2EE开发</title><link>http://www.blogjava.net/jelver/articles/97616.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Fri, 02 Feb 2007 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/97616.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/97616.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/97616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/97616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/97616.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://www.ibm.com/developerworks/cn/java/j-s-s-i/index.html#author">
						<font color="#996699">吴高峰</font>
				</a> (<a href="mailto:shuwgf@21cn.com?subject=基于struts+spring+ibatis的轻量级J2EE开发"><font color="#5c81a7">shuwgf@21cn.com</font></a>)常德卷烟厂信息技术部<br /></p>
		<p>2005 年 2 月 01 日</p>
		<blockquote>大多数IT 组织都必须解决三个主要问题：1．帮助组织减少成本 2．增加并且保持客户 3．加快业务效率。完成这些问题一般都需要实现对多个业务系统的数据和业务逻辑的无缝访问，也就是说，要实施系统集成工程，以便联结业务流程、实现数据的访问与共享。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>JpetStore 4.0是ibatis的最新示例程序，基于Struts MVC框架（注：非传统Struts开发模式），以ibatis作为持久化层。该示例程序设计优雅，层次清晰，可以学习以及作为一个高效率的编程模型参考。本文是在其基础上，采用Spring对其中间层（业务层）进行改造。使开发量进一步减少，同时又拥有了Spring的一些好处…</p>
		<p>
				<a name="N1003E">
						<span class="atitle">1. 前言</span>
				</a>
		</p>
		<p>JpetStore 4.0是ibatis的最新示例程序。ibatis是开源的持久层产品，包含SQL Maps 2.0 和 Data Access Objects 2.0 框架。JpetStore示例程序很好的展示了如何利用ibatis来开发一个典型的J2EE web应用程序。JpetStore有如下特点：</p>
		<ul>
				<li>ibatis数据层 
</li>
				<li>POJO业务层 
</li>
				<li>POJO领域类 
</li>
				<li>Struts MVC 
</li>
				<li>JSP 表示层 </li>
		</ul>
		<p>以下是本文用到的关键技术介绍，本文假设您已经对Struts，SpringFramewok，ibatis有一定的了解，如果不是，请首先查阅附录中的参考资料。</p>
		<ul>
				<li>Struts 是目前Java Web MVC框架中不争的王者。经过长达五年的发展，Struts已经逐渐成长为一个稳定、成熟的框架，并且占有了MVC框架中最大的市场份额。但是Struts某些技术特性上已经落后于新兴的MVC框架。面对Spring MVC、Webwork2 这些设计更精密，扩展性更强的框架，Struts受到了前所未有的挑战。但站在产品开发的角度而言，Struts仍然是最稳妥的选择。本文的原型例子JpetStore 4.0就是基于Struts开发的，但是不拘泥于Struts的传统固定用法，例如只用了一个自定义Action类，并且在form bean类的定义上也是开创性的，令人耳目一新，稍后将具体剖析一下。 
</li>
				<li>Spring Framework 实际上是Expert One-on-One J2EE Design and Development 一书中所阐述的设计思想的具体实现。Spring Framework的功能非常多。包含AOP、ORM、DAO、Context、Web、MVC等几个部分组成。Web、MVC暂不用考虑，JpetStore 4.0用的是更成熟的Struts和JSP；DAO由于目前Hibernate、JDO、ibatis的流行，也不考虑，JpetStore 4.0用的就是ibatis。因此最需要用的是AOP、ORM、Context。Context中，最重要的是Beanfactory，它能将接口与实现分开，非常强大。目前AOP应用最成熟的还是在事务管理上。 
</li>
				<li>ibatis 是一个功能强大实用的SQL Map工具，不同于其他ORM工具（如hibernate），它是将SQL语句映射成Java对象，而对于ORM工具，它的SQL语句是根据映射定义生成的。ibatis 以SQL开发的工作量和数据库移植性上的让步，为系统设计提供了更大的自由空间。有ibatis代码生成的工具，可以根据DDL自动生成ibatis代码，能减少很多工作量。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-s-s-i/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10068">
						<span class="atitle">2. JpetStore简述</span>
				</a>
		</p>
		<p>
				<a name="N1006E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.1. 背景</font>
								</strong>
						</span>
				</a>
		</p>
		<p>最初是Sun公司的J2EE petstore，其最主要目的是用于学习J2EE，但是其缺点也很明显，就是过度设计了。接着Oracle用J2EE petstore来比较各应用服务器的性能。微软推出了基于.Net平台的 Pet shop，用于竞争J2EE petstore。而JpetStore则是经过改良的基于struts的轻便框架J2EE web应用程序，相比来说，JpetStore设计和架构更优良，各层定义清晰，使用了很多最佳实践和模式，避免了很多"反模式"，如使用存储过程，在java代码中嵌入SQL语句，把HTML存储在数据库中等等。最新版本是JpetStore 4.0。</p>
		<p>
				<a name="N10077">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.2. JpetStore开发运行环境的建立</font>
								</strong>
						</span>
				</a>
		</p>
		<p>1、开发环境</p>
		<ul>
				<li>Java SDK 1.4.2 
</li>
				<li>Apache Tomcat 4.1.31 
</li>
				<li>Eclipse-SDK-3.0.1-win32 
</li>
				<li>HSQLDB 1.7.2 </li>
		</ul>
		<p>2、Eclipse插件</p>
		<ul>
				<li>EMF SDK 2.0.1：Eclipse建模框架，lomboz插件需要，可以使用runtime版本。 
</li>
				<li>lomboz 3.0：J2EE插件，用来在Eclipse中开发J2EE应用程序 
</li>
				<li>Spring IDE 1.0.3：Spring Bean配置管理插件 
</li>
				<li>xmlbuddy_2.0.10：编辑XML，用免费版功能即可 
</li>
				<li>tomcatPluginV3：tomcat管理插件 
</li>
				<li>Properties Editor：编辑java的属性文件,并可以预览以及自动存盘为Unicode格式。免去了手工或者ANT调用native2ascii的麻烦。 </li>
		</ul>
		<p>3、示例源程序</p>
		<ul>
				<li>ibatis示例程序JpetStore 4.0 http://www.ibatis.com/jpetstore/jpetstore.html 
</li>
				<li>改造后的源程序（+spring）（源码链接） </li>
		</ul>
		<p>
				<a name="N100B3">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.3. 架构</font>
								</strong>
						</span>
				</a>
		</p>
		<br />
		<br />
		<a name="N100BB">
				<strong>图1 JpetStore架构图</strong>
		</a>
		<br />
		<img height="279" alt="图1 JpetStore架构图" src="http://www.ibm.com/developerworks/cn/java/j-s-s-i/images/image002.jpg" width="553" border="0" />
		<br />
		<p>图1 是JPetStore架构图，更详细的内容请参见JPetStore的白皮书。参照这个架构图，让我们稍微剖析一下源代码，得出JpetStore 4.0的具体实现图（见图2），思路一下子就豁然开朗了。前言中提到的非传统的struts开发模式，关键就在struts Action类和form bean类上。</p>
		<p>struts Action类只有一个：BeanAction。没错，确实是一个！与传统的struts编程方式很不同。再仔细研究BeanAction类，发现它其实是一个通用类，利用反射原理，根据URL来决定调用formbean的哪个方法。BeanAction大大简化了struts的编程模式，降低了对struts的依赖（与struts以及WEB容器有关的几个类都放在com.ibatis.struts包下，其它的类都可以直接复用）。利用这种模式，我们会很容易的把它移植到新的框架如JSF，spring。</p>
		<p>这样重心就转移到form bean上了，它已经不是普通意义上的form bean了。查看源代码，可以看到它不仅仅有数据和校验/重置方法，而且已经具有了行为，从这个意义上来说，它更像一个BO(Business Object)。这就是前文讲到的，BeanAction类利用反射原理，根据URL来决定调用form bean的哪个方法（行为）。form bean的这些方法的签名很简单，例如：</p>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode"> public String myActionMethod() {
   //..work
   return "success";
 }
 </pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>方法的返回值直接就是字符串，对应的是forward的名称，而不再是ActionForward对象，创建ActionForward对象的任务已经由BeanAction类代劳了。</p>
		<p>另外，程序还提供了ActionContext工具类，该工具类封装了request 、response、form parameters、request attributes、session attributes和 application attributes中的数据存取操作，简单而线程安全，form bean类使用该工具类可以进一步从表现层框架解耦。</p>
		<p>在这里需要特别指出的是，BeanAction类是对struts扩展的一个有益尝试，虽然提供了非常好的应用开发模式，但是它还非常新，一直在发展中。</p>
		<br />
		<br />
		<a name="N100E8">
				<b>图2 JpetStore 4.0具体实现</b>
		</a>
		<br />
		<img height="588" alt="图2 JpetStore 4.0具体实现" src="http://www.ibm.com/developerworks/cn/java/j-s-s-i/images/image004.gif" width="582" border="0" />
		<br />
		<p>
				<a name="N100F8">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.4. 代码剖析</font>
								</strong>
						</span>
				</a>
		</p>
		<p>下面就让我们开始进一步分析JpetStore4.0的源代码，为下面的改造铺路。</p>
		<ul>
				<li>BeanAction.java是唯一一个Struts action类，位于com.ibatis.struts包下。正如上文所言，它是一个通用的控制类，利用反射机制，把控制转移到form bean的某个方法来处理。详细处理过程参考其源代码，简单明晰。 
</li>
				<li>
						<p>Form bean类位于com.ibatis.jpetstore.presentation包下，命名规则为***Bean。Form bean类全部继承于BaseBean类，而BaseBean类实际继承于ActionForm，因此，Form bean类就是Struts的 ActionForm，Form bean类的属性数据就由struts框架自动填充。而实际上，JpetStore4.0扩展了struts中ActionForm的应用： Form bean类还具有行为，更像一个BO,其行为（方法）由BeanAction根据配置（struts-config.xml）的URL来调用。虽然如此，我们还是把Form bean类定位于表现层。</p>
						<p>Struts-config.xml的配置里有3种映射方式，来告诉BeanAction把控制转到哪个form bean对象的哪个方法来处理。</p>
						<p>以这个请求连接为例http://localhost/jpetstore4/shop/viewOrder.do</p>
						<p>1. URL Pattern</p>
						<table cellspacing="0" cellpadding="0" width="100%" border="0">
								<tbody>
										<tr>
												<td class="code-outline">
														<pre class="displaycode">    &lt;action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
    name="orderBean" scope="session"
    validate="false"&gt;
    &lt;forward name="success" path="/order/ViewOrder.jsp"/&gt;
  &lt;/action&gt;
  </pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<p>此种方式表示，控制将被转发到"orderBean"这个form bean对象 的"viewOrder"方法（行为）来处理。方法名取"path"参数的以"/"分隔的最后一部分。</p>
						<p>2. Method Parameter</p>
						<table cellspacing="0" cellpadding="0" width="100%" border="0">
								<tbody>
										<tr>
												<td class="code-outline">
														<pre class="displaycode">    &lt;action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
    name="orderBean" parameter="viewOrder" scope="session"
    validate="false"&gt;
    &lt;forward name="success" path="/order/ViewOrder.jsp"/&gt;
  &lt;/action&gt;
  </pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<p>此种方式表示，控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法（行为）来处理。配置中的"parameter"参数表示form bean类上的方法。"parameter"参数优先于"path"参数。</p>
						<p>3. No Method call</p>
						<table cellspacing="0" cellpadding="0" width="100%" border="0">
								<tbody>
										<tr>
												<td class="code-outline">
														<pre class="displaycode">    &lt;action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
    name="orderBean" parameter="*" scope="session"
    validate="false"&gt;
    &lt;forward name="success" path="/order/ViewOrder.jsp"/&gt;
  &lt;/action&gt;
  </pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<p>此种方式表示，form bean上没有任何方法被调用。如果存在"name"属性，则struts把表单参数等数据填充到form bean对象后，把控制转发到"success"。否则，如果name为空，则直接转发控制到"success"。</p>
						<p>这就相当于struts内置的org.apache.struts.actions.ForwardAction的功能</p>
						<table cellspacing="0" cellpadding="0" width="100%" border="0">
								<tbody>
										<tr>
												<td class="code-outline">
														<pre class="displaycode"> &lt;action path="/shop/viewOrder" type="org.apache.struts.actions.ForwardAction"
    