﻿<?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-&lt;font color='blue'&gt;好·色之徒&lt;/font&gt;--&lt;a href="http://www.hao-se.cn/" target="_blank"&gt;好·色之徒&lt;/a&gt;-随笔分类-Spring</title><link>http://www.blogjava.net/iask/category/2341.html</link><description>&lt;font color='blue'&gt;菩提本无树，明镜亦非台,本来无一物，何处惹尘埃&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 13 Nov 2007 10:54:48 GMT</lastBuildDate><pubDate>Tue, 13 Nov 2007 10:54:48 GMT</pubDate><ttl>60</ttl><item><title>struts spring hibernate开发的一个web系统（8）--数据库介绍</title><link>http://www.blogjava.net/iask/archive/2007/06/08/122855.html</link><dc:creator>城市劣人</dc:creator><author>城市劣人</author><pubDate>Fri, 08 Jun 2007 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/iask/archive/2007/06/08/122855.html</guid><wfw:comment>http://www.blogjava.net/iask/comments/122855.html</wfw:comment><comments>http://www.blogjava.net/iask/archive/2007/06/08/122855.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/iask/comments/commentRss/122855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iask/services/trackbacks/122855.html</trackback:ping><description><![CDATA[
		<p>已经转移到 <a href="http://www.hao-se.cn" target="_blank">好·色之徒--我的博客、我的生活</a></p>
		<p>有关内置数据库的表的一些说明：</p>
		<p>每个表中都有一个叫<font color="#ff0099">GUID</font>的字段，它是唯一的ID</p>
		<p>
				<font color="#0066ff">ROLE</font>(GUID,ROLENAME)</p>
		<p>一个非常简单的权限表，ROLENAME是它的权限名称，内置了user、admin，不用去变动它</p>
		<p>
				<font color="#0066ff">USER</font>(GUID,ROLEID,USERID,PASSWORD,USERNAME,FLG)</p>
		<p>用户列表，ROLEID关联至ROLE表的GUID，其中的USERNAME只是一个用于显示的用户名称，真正登录需要的是USERID，FLG是个标志位</p>
		<p>USER表中的信息是有管理员分配的，如果需要删除，只是逻辑删除，所以通过FLG来设置，AREA表中也是类似的</p>
		<p>
				<font color="#0066ff">AREA</font>(GUID,AREANAME,TIMENUM,USERID,FLG)</p>
		<p>区域信息表，订单管理中要涉及到各个不同的地区，比如：上海、华南地区等等，USERID关联至USER表的GUID（一个用户关联几个地区）</p>
		<p>FLG用于逻辑删除</p>
		<p>
				<font color="#6600cc">以上三个表相对基础，是有admin来统一管理的。在系统的管理者画面可以创建新用户、新地区、分配用户对应的地区</font>
		</p>
		<p>
				<font color="#0066ff">CUSTOMER</font>(GUID,AREAID,USERID,CUSTOMERNAME,。。。)</p>
		<p>客户信息表，需要关联的表有AREA（AREAID）、USER（USERID）</p>
		<p>
				<font color="#0066ff">WAREHOUSE</font>(GUID,WAREHOUSEID,WAREHOUSENAME ,。。。 )</p>
		<p>发货仓库表，记录商品发货的仓库信息，没有特别的关联</p>
		<p>
				<font color="#0066ff">SALESPERSONS</font>(GUID,PERSONNAME ,。。。 )</p>
		<p>销售人员，很简单，就一个人员的名称</p>
		<p>
				<font color="#0066ff">ORDERINFO</font>(GUID,AREAID ,USERID ,ORDERNO ,ORDERDATE ,CUSTOMERNAME ,ADDRESS ,WAREHOUSEID INPUTDATE ,EFFECTIVEINFO ,PRINTINGDATE ,HANDMADE ,HANDMADEFLG ,REMARK ,SHORTING ,AMOUNT ,TRACK SALESPERSONS ,OK ,CREATETIME ,UPDATETIME )</p>
		<p>订单信息，比较复杂：需要关联的表有AREA（AREAID）、USER（USERID），ORDERNO--订单号，ORDERDATE--订单日期</p>
		<p>CUSTOMERNAME ,ADDRESS是客户的名称和地址，为了简单化，就没有和CUSTOMER表关联起来</p>
		<p>WAREHOUSEID是WAREHOUSE表中的一个对应字段，为了简单化，也没有采用关联（用GUID）</p>
		<p>INPUTDATE--输单日期，EFFECTIVEINFO--生效信息，PRINTINGDATE--打印装箱单时间，</p>
		<p>HANDMADE--手工单，HANDMADEFLG--判断是否手工单的标志</p>
		<p>SHORTING--缺货情况，AMOUNT--缺货数量，TRACK--追踪，SALESPERSONS--对应销售人员，没有和SALESPERSONS表关联</p>
		<p>OK--一个标志位，用于表示订单是否处理完毕，CREATETIME--创建时间，UPDATETIME--更新时间</p>
		<p>
				<font color="#0066ff">PAYMENT</font>(GUID,USERID ,PAYDATE ,CUSTOMERNAME ,CASH ,REMARK ,CREATETIME ,UPDATETIME )</p>
		<p>货款的管理信息，USERID--需要和USER关联（对应它的GUID），PAYDATE--付款时间，CUSTOMERNAME--客户</p>
		<p>这是所有表的信息，由于系统比较小，所以表的设计上趋向于简单化</p>
<img src ="http://www.blogjava.net/iask/aggbug/122855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iask/" target="_blank">城市劣人</a> 2007-06-08 14:50 <a href="http://www.blogjava.net/iask/archive/2007/06/08/122855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整合Struts 与Spring</title><link>http://www.blogjava.net/iask/archive/2006/09/29/72747.html</link><dc:creator>城市劣人</dc:creator><author>城市劣人</author><pubDate>Fri, 29 Sep 2006 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/iask/archive/2006/09/29/72747.html</guid><wfw:comment>http://www.blogjava.net/iask/comments/72747.html</wfw:comment><comments>http://www.blogjava.net/iask/archive/2006/09/29/72747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iask/comments/commentRss/72747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iask/services/trackbacks/72747.html</trackback:ping><description><![CDATA[已经转移到 <a href="http://www.hao-se.cn" target="_blank">好·色之徒--我的博客、我的生活</a><br /><br />1、使用 Spring 的 ActionSupport 类整合 Structs 2、使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor 3、将 Struts Action 管理委托给 Spring 框架 首先要建立"装载应用程序环境" 无论您使用哪种技术，都需要使用 Spring 的 ContextLoaderPlugin 为 Struts 的 ActionServlet 装载 Spring 应用程序环境。就像添加任何其他插件一样，简单地向您的struts-config.xml 文件添加该插件，如下所示： <plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn"><set-property property="contextConfigLocation" value="/WEB-INF/beans.xml" /></plug-in>窍门 1. 使用 Spring 的 ActionSupport 手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。为了使它变得更简单，Spring 提供了一些帮助。为了方便地获得 Spring 环境，org.springframework.web.struts.ActionSupport 类提供了一个 getWebApplicationContext() 方法。您所做的只是从 Spring 的 ActionSupport 而不是 Struts Action 类扩展您的动作，如清单 1 所示： 清单 1. 使用 ActionSupport 整合 Struts package ca.nexcel.books.actions; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import org.springframework.context.ApplicationContext; import org.springframework.web.struts.ActionSupport; import ca.nexcel.books.beans.Book; import ca.nexcel.books.business.BookService; public class SearchSubmit extends ActionSupport { |(1) public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { DynaActionForm searchForm = (DynaActionForm) form; String isbn = (String) searchForm.get("isbn"); //the old fashion way //BookService bookService = new BookServiceImpl(); ApplicationContext ctx = getWebApplicationContext(); |(2) BookService bookService = (BookService) ctx.getBean("bookService"); |(3) Book book = bookService.read(isbn.trim()); if (null == book) { ActionErrors errors = new ActionErrors(); errors.add(ActionErrors.GLOBAL_ERROR,new ActionError ("message.notfound")); saveErrors(request, errors); return mapping.findForward("failure") ; } request.setAttribute("book", book); return mapping.findForward("success"); } } 让我们快速思考一下这里到底发生了什么。在 (1) 处，我通过从 Spring 的 ActionSupport 类而不是 Struts 的 Action 类进行扩展，创建了一个新的 Action。在 (2) 处，我使用 getWebApplicationContext() 方法获得一个 ApplicationContext。为了获得业务服务，我使用在 (2) 处获得的环境在 (3) 处查找一个 Spring bean。 这种技术很简单并且易于理解。不幸的是，它将 Struts 动作与 Spring 框架耦合在一起。如果您想替换掉 Spring，那么您必须重写代码。并且，由于 Struts 动作不在 Spring 的控制之下，所以它不能获得 Spring AOP 的优势。当使用多重独立的 Spring 环境时，这种技术可能有用，但是在大多数情况下，这种方法不如另外两种方法合适。 窍门 2. 覆盖 RequestProcessor 将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。分离的一种方法是使用 org.springframework.web.struts.DelegatingRequestProcessor 类来覆盖 Struts 的 RequestProcessor 处理程序，如清单 2 所示： 清单 2. 通过 Spring 的 DelegatingRequestProcessor 进行整合 <html><struts-config><form-beans><form-bean name="searchForm" type="org.apache.struts.validator.DynaValidatorForm"><form-property name="isbn" type="java.lang.String" /></form-bean></form-beans><global-forwards type="org.apache.struts.action.ActionForward"><forward name="welcome" path="/welcome.do" /><forward name="searchEntry" path="/searchEntry.do" /><forward name="searchSubmit" path="/searchSubmit.do" /></global-forwards><action-mappings><action path="/welcome" forward="/WEB-INF/pages/welcome.htm" /><action path="/searchEntry" forward="/WEB-INF/pages/search.jsp" /><action name="searchForm" type="ca.nexcel.books.actions.SearchSubmit" path="/searchSubmit" validate="true" input="/searchEntry.do"><forward name="success" path="/WEB-INF/pages/detail.jsp" /><forward name="failure" path="/WEB-INF/pages/search.jsp" /></action></action-mappings><message-resources parameter="ApplicationResources" /><controller processorclass="org.springframework.web.struts. &#xD;&#xA;DelegatingRequestProcessor" />|(1) <plug-in classname="org.apache.struts.validator.ValidatorPlugIn"><set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /></plug-in><plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn"><set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml" /></plug-in></struts-config>我利用了 <controller>标记来用 DelegatingRequestProcessor 覆盖默认的 Struts RequestProcessor。下一步是在我的 Spring 配置文件中注册该动作，如清单 3 所示： 清单 3. 在 Spring 配置文件中注册一个动作 <controller><beans><bean class="ca.nexcel.books.business.BookServiceImpl" id="bookService" /><bean class="ca.nexcel.books.actions.SearchSubmit" name="/searchSubmit">|(1) <property name="bookService"><ref bean="bookService" /></property></bean></beans>注意：在 (1) 处，我使用名称属性注册了一个 bean，以匹配 struts-config 动作映射名称。SearchSubmit 动作揭示了一个 JavaBean 属性，允许 Spring 在运行时填充属性，如清单 4 所示： 清单 4. 具有 JavaBean 属性的 Struts 动作 package ca.nexcel.books.actions; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import ca.nexcel.books.beans.Book; import ca.nexcel.books.business.BookService; public class SearchSubmit extends Action { private BookService bookService; public BookService getBookService() { return bookService; } public void setBookService(BookService bookService) { | (1) this.bookService = bookService; } public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { DynaActionForm searchForm = (DynaActionForm) form; String isbn = (String) searchForm.get("isbn"); Book book = getBookService().read(isbn.trim()); |(2) if (null == book) { ActionErrors errors = new ActionErrors(); errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("message.notfound")); saveErrors(request, errors); return mapping.findForward("failure") ; } request.setAttribute("book", book); return mapping.findForward("success"); } } 在清单 4 中，您可以了解到如何创建 Struts 动作。在 (1) 处，我创建了一个 JavaBean 属性。DelegatingRequestProcessor自动地配置这种属性。这种设计使 Struts 动作并不知道它正被 Spring 管理，并且使您能够利用 Sping 的动作管理框架的所有优点。由于您的 Struts 动作注意不到 Spring 的存在，所以您不需要重写您的 Struts 代码就可以使用其他控制反转容器来替换掉 Spring。 DelegatingRequestProcessor 方法的确比第一种方法好，但是仍然存在一些问题。如果您使用一个不同的 RequestProcessor，则需要手动整合 Spring 的 DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外，还有过一些使用一系列命令来代­替 Struts RequestProcessor 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。 窍门 3. 将动作管理委托给 Spring 一个更好的解决方法是将 Strut 动作管理委托给 Spring。您可以通过在 struts-config 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下，所以它可以填充动作的 JavaBean 属性，并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。 清单 5 中的 Action 类与清单 4 中的相同。但是 struts-config 有一些不同： 清单 5. Spring 整合的委托方法 <controller><struts-config><form-beans><form-bean name="searchForm" type="org.apache.struts.validator.DynaValidatorForm"><form-property name="isbn" type="java.lang.String" /></form-bean></form-beans><global-forwards type="org.apache.struts.action.ActionForward"><forward name="welcome" path="/welcome.do" /><forward name="searchEntry" path="/searchEntry.do" /><forward name="searchSubmit" path="/searchSubmit.do" /></global-forwards><action-mappings><action path="/welcome" forward="/WEB-INF/pages/welcome.htm" /><action path="/searchEntry" forward="/WEB-INF/pages/search.jsp" /><action name="searchForm" type="org.springframework.web.struts.DelegatingActionProxy" path="/searchSubmit" validate="true" input="/searchEntry.do" |(1)=""><forward name="success" path="/WEB-INF/pages/detail.jsp" /><forward name="failure" path="/WEB-INF/pages/search.jsp" /></action></action-mappings><message-resources parameter="ApplicationResources" /><plug-in classname="org.apache.struts.validator.ValidatorPlugIn"><set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /></plug-in><plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn"><set-property property="contextConfigLocation" value="/WEB-INF/beans.xml" /></plug-in></struts-config>清单 5 是一个典型的 struts-config.xml 文件，只有一个小小的差别。它注册 Spring 代理类的名称，而不是声明动作的类名，如（1）处所示。DelegatingActionProxy 类使用动作映射名称查找 Spring 环境中的动作。这就是我们使用 ContextLoaderPlugIn 声明的环境。 将一个 Struts 动作注册为一个 Spring bean 是非常直观的，如清单 6 所示。我利用动作映射使用 <bean>标记的名称属性（在这个例子中是 "/searchSubmit"）简单地创建了一个 bean。这个动作的 JavaBean 属性像任何 Spring bean 一样被填充： 清单 6. 在 Spring 环境中注册一个 Struts 动作 <bean><beans><bean class="ca.nexcel.books.business.BookServiceImpl" id="bookService" /><bean class="ca.nexcel.books.actions.SearchSubmit" name="/searchSubmit"><property name="bookService"><ref bean="bookService" /></property></bean></beans>动作委托的优点 动作委托解决方法是这三种方法中最好的。Struts 动作不了解 Spring，不对代码作任何改变就可用于非 Spring 应用程序中。RequestProcessor 的改变不会影响它，并且它可以利用 Spring AOP 特性的优点。 动作委托的优点不止如此。一旦让 Spring 控制您的 Struts 动作，您就可以使用 Spring 给动作补充更强的活力。例如，没有 Spring 的话，所有的 Struts 动作都必须是线程安全的。如果您设置 <bean>标记的 singleton 属性为"false"，那么不管用何种方法，您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性，但是把它放在您的工具箱中也很好。­您也可以利用 Spring 的生命周期方法。例如，当实例化 Struts 动作时，<bean> 标记的 init-method 属性被用于运行一个方法。类似地，在从容器中删除 bean 之前，destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法，它们以一种与 Servlet 生命周期相同的方式进行管理。 在本文中，您已经学习了将 Struts 动作整合到 Spring 框架中的三种窍门。使用 Spring 的 ActionSupport 来整合 Struts（第一种窍门中就是这样做的）简单而快捷，但是会将 Struts 动作与 Spring 框架耦合在一起。如果您需要将应用程序移植到一个不同的框架，则需要重写代码。第二种解决方法通过委托 RequestProcessor 巧妙地解开代码的耦合，但是它的可扩展性不强，并且当 Struts 的 RequestProcessor 变成一系列命令时，这种方法就持续不了很长时间。第三种方法是这三种方法中最好的：将 Struts 动作委托给 Spring 框架可以使代码解耦，从而使您可以在您的 Struts 应用程序中利用 Spring 的特性（比如日志记录拦截器）。 综上所述，也会采用第三种方式来整合。 <br /><br />已经转移到 <a href="http://www.hao-se.cn" target="_blank">好·色之徒--我的博客、我的生活</a></bean></bean></bean></bean></controller></controller></controller></html><img src ="http://www.blogjava.net/iask/aggbug/72747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iask/" target="_blank">城市劣人</a> 2006-09-29 11:08 <a href="http://www.blogjava.net/iask/archive/2006/09/29/72747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>