??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩亚洲精品一区二区三区,99只有精品,av男人天堂一区http://www.aygfsteel.com/hayun/category/16894.htmlwelcome to my online log ! open java new world! Taste java charm........zh-cnFri, 02 Mar 2007 06:35:46 GMTFri, 02 Mar 2007 06:35:46 GMT60Eclipse 开发Struts+Hibernate3http://www.aygfsteel.com/hayun/articles/struts5.html?/dc:creator>?/author>Sun, 12 Nov 2006 14:38:00 GMThttp://www.aygfsteel.com/hayun/articles/struts5.htmlhttp://www.aygfsteel.com/hayun/comments/80762.htmlhttp://www.aygfsteel.com/hayun/articles/struts5.html#Feedback0http://www.aygfsteel.com/hayun/comments/commentRss/80762.htmlhttp://www.aygfsteel.com/hayun/services/trackbacks/80762.html
创徏Hibernate框架:



Struts框架程:


hibernate个包与类之间的Path:



]]>
Struts 用户指南Q?Q?/title><link>http://www.aygfsteel.com/hayun/articles/struts3.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sun, 05 Nov 2006 13:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/hayun/articles/struts3.html</guid><description><![CDATA[现在我们理解了怎样构造你的应用程序的Model和ViewlgQ现在是集中?Controller lg的时候了。Struts包括一个实现映一个请求URIC个行为类的主要功能的servlet。因此你的与Controller有关的主要责LQ?<br /><br />为每一个可能接收的逻辑h写一?Action c(也就是,一?Action 接口的实玎ͼ <br /><br />写一个定义类名和与每个可能的映射相关的其它信息的 ActionMapping c(也就是,一?ActionMapping 接口的实玎ͼ <br /><br />写行为映配|文Ӟ用XMLQ用来配|controller servlet?<br /><br />Z的应用程序更新web应用E序展开描述W文Ӟ用XMLQ用来包括必需的Strutslg?<br /><br />l你的应用程序添加适当的Strutslg?<br /><br />4.2 Actionc?<br /><br />Action 接口定义一个单一的必ȝ一?Action cd现的Ҏ(gu)Q就象下面这P(x) <br /><br /><table cellspacing="0"><tbody><tr><td class="code">public ActionForward perform(ActionServlet servlet,<br />ActionMapping mapping,<br />ActionForm form,<br />HttpServletRequest request,<br />HttpServletResponse response)<br />throws IOException, ServletException;</td></tr></tbody></table><br /><br />一?Action cȝ目标是处理这个请求,然后q回一个标识JSP面?ActionForward 对象Q控制应该重定向q个JSP面以生成相应的响应。在 Model 2 设计模式中,一个典型的 Action cd在它?perform() Ҏ(gu)中实C面的逻辑Q?<br /><br />验证用户session的当前状态(例如Q检查用户已l成功地注册Q。如?Action cd现没有注册存在,h应该重定向到昄用户名和口o(h)用于注册的JSP面。应该这样做是因为用户可能试图从“中间”(也就是,从一个书{)q入你的应用E序Q或者因为session已经时q且servlet容器创徏了一个新的session?<br /><br />如果验证q没有发生(׃使用一个实?ValidatingActionForm 接口的form beanQ,验证q个 form bean 的属性是必须的。如果发C个问题,当作一个请求属性保存合适的出错信息关键字,然后控刉定向回输入表单这样错误可以被U正?<br /><br />执行要求的处理来处理q个hQ例如在数据库里保存一行)。这可以用嵌?Action cLw的代码来完成,但是通常应该调用一个商业逻辑bean的一个合适的Ҏ(gu)来执行?<br /><br />更新用来创Z一个用L(fng)面页面的服务器端对象Q典型情况下是request范围或session范围beansQ定义你需要在多长旉内保持这些项目可获得Q?<br /><br />q回一个标识生成响应的JSP面的适当?ActionForward 对象Q基于新q更新的beans。典型情况下Q你通过在你接收到的 ActionMapping 对象Q如果你使用一个局部于与这个映上的逻辑名)或者在controller servlet 本nQ如果你使用一个全局于应用程序的逻辑名)上调?findForward() 得到一个对q样一个对象的引用?<br /><br />当ؓ(f) Action cȝE时要记住的设计要点包括以下q些Q?<br /><br />controller servlet仅仅创徏一个你?Action cȝ实例Q用于所有的h。这样你需要编写你?Action cM其能够在一个多U程环境中正运行,p你必d全地~写一个servlet?service() Ҏ(gu)一栗?<br /><br />帮助U程安全~程的最重要的原则就是在你的 Action cM仅仅使用局部变量而不是实例变量。局部变量创Z一个分配给Q由你的JVMQ每个请求线E的栈中Q所以没有必要担心会(x)׃n它们?<br /><br />管不应该,代表你的pȝ中Model部分的的beans仍有可能抛出q例。你应该在你?perform() Ҏ(gu)的逻辑中捕捉所有这L(fng)q例Qƈ且通过执行以下语句它们记录在应用E序的日志文件中Q包括相应的栈跟t信息)Q?<br /><br />servlet.log("Error message text", exception); <br /><br />作ؓ(f)一个通用的规则,分配很少的资源ƈ在来自同一个用P在用L(fng)session中)的请求间保持它们?x)导致可伸羃性的问题。你应该在将控制重定向到适当的Viewlg前努力释放这L(fng)资源Q例如数据库联接Q?-- 甚至在你调用的一个bean抛出了一个违例时?<br /><br />另外Q你会(x)惌防止出现非常大的 Action cR最单的实现途径是将你的功能逻辑嵌入?Action cLw,而不是将其写在独立的商业逻辑beans中。除了 Action c难于理解和l护外,q种Ҏ(gu)也得难于重用这些商业逻辑代码Q因Z码被嵌入C个组ӞAction c)中ƈ被捆l运行于web应用E序环境中?<br /><br />包括在Struts中的例子E序某种E度上g怺q个设计原则Q因为商业逻辑本n是嵌入到 Action cM的。这应该被看作是在这个样本应用程序设计中的一个bugQ而不是一个Struts体系l构中的固有Ҏ(gu),或者是一个值得仿效的方法?<br /><br />4.3 ActionMapping实现 <br /><br />Z成功地运行,Struts的controller servlet需要知道关于每个URI该怎样映射C个适当?Action cȝ几g事。需要了解的知识装在一个叫?ActionMapping 的Java接口中,它有以下属性:(x) <br /><br />actionClass - 用于q个映射?Action cd整的Javacd。第一ơ一个特定的映射被用,一个这个类的实例将被创建ƈZ后重用而保存?<br /><br />formAttribute - session范围的bean的名字,当前的这个映的 ActionForm 被保存在q个bean之下。如果这个属性没有被定义Q没?ActionForm 被用?<br /><br />formClass - 用于q个映射?ActionForm cd整的Javacd。如果你在用对form beans的支持,q个cȝ一个实例将被创建ƈ保存Q在当前的用户会(x)话中Q?<br /><br />path - 匚w选择q个映射的请求的URI路径。看下面如何匚w的例子?<br /><br />Struts在一个叫?ActionMappingBase 的类中包括了一?ActionMapping 接口的方便的实现。如果你不需要ؓ(f)你自q映射定义M附加的属性,管把这个类作ؓ(f)你的 ActionMapping cd了,向下面部分描述的那样配|。然而,定义一?ActionMapping 实现Q多半是扩展 ActionMappingBase c)来包含附加的属性也是可能的。controller servlet知道怎样自动配置q些定制属性,因ؓ(f)它用Struts的Digester模块来读配置文g?<br /><br />包括在Struts的例子程序中Q这个特性用来定义两个附加的属性:(x) <br /><br />failure - 如果ActioncL到它接收的输入字段的一些问题,控制应该被重定向到的上下文相关的URI。典型情况下是请求发向的JSP面名,它将引v表单被重新显C(包含Actionc设|的出错消息和大部分最q的来自ActionForm bean的输入|?<br /><br />success - 如果ActioncL功执行请求的功能Q控制应该被重定向到的上下文相关的URI。典型情况下是准备这个应用程序的?x)话的下一个页面的JSP面名?<br /><br />使用q两个额外的属性,例子E序中的 Action cd乎完全独立于面设计者用的实际的JSP面名。这个页面可以在重新设计时被重命名,然而几乎不?x)媄响?Action cLw。如果“下一个”JSP面的名字被编码到 Action cMQ所有的q些cM需要被修改?<br /><br />4.4 Action映射配置文g <br /><br />controller servlet怎样知道你想要得到的映射Q写一个简单地初始化新?ActionMapping 实例q且调用所有适当的setҎ(gu)的小的JavacL可能的(但是很麻烦)。ؓ(f)了ɘq个处理单些QStruts包括一个Digester模块能够处理一个想得到的映的ZXML的描qͼ同时创徏适当的对象。看 API 文档 以获得关于Digester更多的信息?<br /><br />开发者的责Q是创Z个叫?action.xml 的XML文gQƈ且把它放在你的应用程序的WEB-INF目录中。(注意q个文gq不需?DTDQ因为实际用的属性对于不同的用户可以是不同的Q最外面的XML元素必须?Q在q个元素之中是嵌入的0个或更多?元素 -- 每一个对应于你希望定义的一个映?<br /><br />来自例子E序?action.xml 文g包括“注册”功能的以下映射条目Q我们用来说明这个需求:(x) <br /><br /><table cellspacing="0"><tbody><tr><td class="code"><action-mappings><br /><forward name="logon" path="/logon.jsp"/><br /><action path="/logon"<br />actionClass="org.apache.struts.example.LogonAction"<br />formAttribute="logonForm"<br />formClass="org.apache.struts.example.LogonForm"<br />inputForm="/logon.jsp"><br /><forward name="success" path="/mainMenu.jsp"/><br /></action><br /></action-mappings></td></tr></tbody></table><br /><br />p你所看到的,q个映射匚w路径 /logon Q实际上Q因Z子程序用扩展匹配,你在一个JSP面指定的请求的URIl束?logon.doQ。当接收C个匹配这个\径的hӞ一?LogonAction cȝ实例被创徏Q仅仅在W一ơ)q被使用。controller servlet在关键?logonForm 下查找一个session范围的beanQ如果需要就为指定的cd建ƈ保存一个bean?<br /><br />q个 action 元素也定义了一个逻辑名“success”,它在 LogonAction cM被用来标识当一个用h功注册时使用的页面。象q样使用一个逻辑名允许将 action c隔MM׃重新设计位置而可能发生的面名改变?<br /><br />q是W二个在M action 之外宣告?forward 元素Q这样它?yu)可以被所有的action全局地获得。在q个情况下,它ؓ(f)注册面定义了一个逻辑名。当你调?mapping.findForward() 时在你的 action 代码中,Struts首先查找q个action本地定义的逻辑名。如果没有找刎ͼStruts?x)自动?f)你查扑օ局定义的逻辑名?<br /><br />4.5 Web应用E序展开描述W?<br /><br />讄应用E序最后的步骤是配|应用程序展开描述W(保存在文件WEB-INF/web.xml中)以包括所有必需的Strutslg。作Z个指南用例子程序的展开描述W,我们看到下面的条目需要被创徏或修攏V?<br /><br />4.5.1 配置Action Servlet实例 <br /><br />d一个条目定义action servlet本nQ同时包括适当的初始化参数。这样一个条目看h象是q样Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><servlet><br /><servlet-name>action</servlet-name><br /><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><br /><init-p<br />aram><br /><param-name>application</param-name><br /><param-value>org.apache.struts.example.ApplicationResources</param-value><br /></init-param><br /><init-param><br /><param-name>config</param-name><br /><param-value>/WEB-INF/action.xml</param-value><br /></init-param><br /><init-param><br /><param-name>debug</param-name><br /><param-value>2</param-value><br /></init-param><br /><init-param><br /><param-name>mapping</param-name><br /><param-value>org.apache.struts.example.ApplicationMapping</param-value><br /></init-param><br /><load-on-startup>2</load-on-startup><br /></servlet></td></tr></tbody></table><br /><br />controller servlet支持的初始化参数在下面描qͼ拯?ActionServlet cȝ Javadocs 。方括号描述如果你没有ؓ(f)那个初始化参数提供一个值时假设的缺省倹{?<br /><br />application - 应用E序资源包基cȝJavacd。[NONE]. <br /><br />config - 包含配置信息的XML资源的上下文相关的\径。[/WEB-INF/action.xml] <br /><br />debug - q个servlet的调试别,它控制记录多信息到日志中。[0] <br /><br />digester - 我们?initMapping() 中利用的Digester的调试别,它记录到System.out而不是servlet的日志中。[0] <br /><br />forward - 使用的ActionForward实现的Javacd。[org.apache.struts.action.ActionForward] <br /><br />mapping - 使用的ActionMapping实现的Javacd。[org.apache.struts.action.ActionMappingBase] <br /><br />nocache - 如果讄?trueQ增加HTTP头信息到所有响应中使浏览器对于生成或重定向到的M响应不做~冲。[false] <br /><br />null - 如果讄?trueQ设|应用程序资源得如果未知的消息关键字被使用则返?null。否则,一个包括不Ƣ迎的消息关键字的出错消息将被返回。[true] <br /><br />4.5.2 配置Action Servlet映射 <br /><br />有两U通常的方法来定义被controller servlet处理的URL -- 前缀匚w和扩展匹配。每U方法的一个适当的映条目将在下面被描述?<br /><br />前缀匚w意思是你想让所有以一个特D值开_(d)在上下文路径部分之后Q的URL传递给q个servlet。这样一个条目看h可以象是q样Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><servlet-mapping><br /><servlet-name>action</servlet-name><br /><url-pattern>/execute/*</url-pattern><br /></servlet-mapping></td></tr></tbody></table><br /><br />它意味着一个匹配前面描q的 /logon 路径的请求的URL看v来象是这P(x) <br /><br />http://www.mycompany.com/myapplication/execute/logon <br /><br />q里 /myapplicationis 是你的应用程序展开所在的上下文\径?<br /><br />另一斚wQ扩展映基于URL以一个跟着定义的一l字W的句点l束的事实而将URL匚w到action servlet 。例如,JSP处理servlet映射?*.jsp 模式q样它在每个JSP面h时被调用。ؓ(f)了?*.do 扩展Q它意味着“做某g事”)映射条目看v来应该象是这P(x) <br /><br /><table cellspacing="0"><tbody><tr><td class="code"><servlet-mapping><br /><servlet-name>action</servlet-name><br /><url-pattern>*.do</url-pattern><br /></servlet-mapping></td></tr></tbody></table><br /><br />q且一个匹配以前描q的 /logon 路径的请求的URI可以看v来象是这P(x) <br /><br />http://www.mycompany.com/myapplication/logon.do <br /><br />4.5.3 配置Struts标记?<br /><br />下一步,你必L加一个定义Struts标记库的条目。这个条目看h应该象是q样Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><taglib><br /><taglib-uri>/WEB-INF/struts.tld</taglib-uri><br /><taglib-location>/WEB-INF/struts.tld</taglib-location><br /></taglib></td></tr></tbody></table><br /><br />它告诉JSPpȝ到哪里去找这个库的标记库描述W(在你的应用程序的WEB-INF目录Q而不是在外部互联|上的某个地方)?<br /><br />4.5.4 dStrutslgC的应用程序中 <br /><br />Z在你的应用程序运行时使用StrutsQ你必须?struts.tld 文g拯C?WEB-INF 目录Q将 struts.jar 文g拯C?WEB-INF/lib ?<img src ="http://www.aygfsteel.com/hayun/aggbug/79266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/hayun/" target="_blank">?/a> 2006-11-05 21:48 <a href="http://www.aygfsteel.com/hayun/articles/struts3.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 用户指南Q?Q?/title><link>http://www.aygfsteel.com/hayun/articles/struts2.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sun, 05 Nov 2006 13:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/hayun/articles/struts2.html</guid><description><![CDATA[q一章集中于创徏应用E序中的 View lg的Q务,主要使用JSP技术徏立。特别的QStruts除了提供了与输入表单的交互外q提供了建立国际化应用程序的支持。几个其它的与View相关的主题也被简单地讨论?<br /><br />3.2 国际化消?<br /><br />几年之前Q应用程序开发者能够考虑C仅支持他们本国的只用一U语aQ或者有时候是两种Q和通常只有一U数量表现方式(例如日期、数字、货币|的居民。然而,Zweb技术的应用E序的爆炸性增长,以及(qing)这些应用程序展开在Internet或其它被q泛讉K的网l之上,已经在很多情况下使得国家的边界E化到不可见。这U情况{变成ZU对于应用程序支持国际化Q经常被U做“i18n”,因ؓ(f)18是字母“i”和字母“n”之间的字母个数Q和本地化的需求?<br /><br />Struts建立于Javaq_之上为徏立国际化和本地化的应用程序提供帮助。需要熟(zhn)的关键概念是:(x) <br /><br />Locale - 基础的支持国际化的JavacL java.util.Locale 。每?Locale 代表一个特别的国家和语a选择Q加上一个可选的语言变量Q,以及(qing)一套格式假定,例如数字和日期等{?<br /><br />ResourceBundle - java.util.ResourceBundle cL供支持多U语a消息的基本工兗查看文档中关于ResourceBundle cM?qing)你的JDK版本的文档包中关于国际化的更多内宏V?<br /><br />PropertyResourceBundle - 一?ResourceBundle cȝ标准实现允许你用与初始化properties文g同样的“name=value”语法来定义资源。这对于使用为用于一个web应用E序的消息准备资源包是非常方便的Q因些消息通常都是面向文本的?<br /><br />MessageFormat - java.text.MessageFormat cd怽使用q行时指定的参数替换一个消息字W串中的一部分Q在q种情况下,是一个从一个资源包得到的消息)。这在你创徏一个句子的场合中是有用的,但是词会(x)以不同的语言按照不同的顺序出现。消息中的占位符字符串{0}用第一个运行时参数替换Q{1}用第二个q行时参数替换,以此cL?<br /><br />MessageResources - Struts的类 org.apache.struts.util.MessageResources 使你能够一套资源包视做一个数据库Qƈ且允怽Z个特定的LocaleQ通常是与当前用户相对应)h一个特定的消息Q而不是ؓ(f)服务器运行在其中的缺省的Localeh消息?<br /><br />对于一个国际化的应用程序,늅JDK文档包中国际化文档所描述的步骤来创徏一个包含每U语a的消息的属性文件。下面D一个例子说明?<br /><br />假设你的源代码徏立在?com.mycompany.mypackage 中,因此它保存于一个叫做(相对于你的源目录Qcom/mycompany/mypackage 的目录中。ؓ(f)创徏一个叫?com.mycompany.mypackage.MyResources 的资源包Q你应该在目?com/mycompany/mypackage 中创Z列文Ӟ(x) <br /><br />MyResources.properties - 包含你的服务器的~省语言的消息。如果你的缺省语a是英语,你可能有一个这L(fng)条目Q?<br /><br />prompt.hello=Hello <br /><br />MyResources_xx.properties - 包含I(xin)SO语言~程为“xx”(查看ResourceBundle的Java文档面得到一个当前列表的联接Q的同样的消息。对于上面的消息的法语版Q你可以有这个条目:(x) <br /><br />prompt.hello=Bonjour <br /><br />你可以有你需要的L多的语言的资源包文g?<br /><br />当你在web应用E序展开描述W中配置controller servletӞ你需要在一个初始化参数中定义的一件事是应用程序的资源包的基础名。在上述的情况中Q这应该?com.mycompany.mypackage.MyResources ?<br /><br />3.3 表单和FormBean的交?<br /><br />大部分web开发者曾l用HTML的标准性能来徏立表单,例如使用 标记。用户希望交互程序具有一定的行ؓ(f)Q这些期待中的一个与错误处理有关 -- 如果用户出现一个错误,应用E序应该允许他们仅仅修改需要修改的部分 -- 而不需要重新敲入当前页面或表单中的M其它信息?<br /><br />使用标准的HTML和JSP~程来完全实现这个期望是单调而繁重的。D例来_(d)一个用户名字段的输入元素看h可以象是q样Q在JSP中) <br /><br /><table cellspacing="0"><tbody><tr><td class="code"><input type="text" name="username"<br />value="<%= loginBean.getUsername() %>"></td></tr></tbody></table><br /><br />q很难敲对,?x)把没有~程概念的HTML开发者搞p涂Qƈ且会(x)在HTML~辑器中造成问题。取而代之的是,Struts提供了一U全面的ZJSP 1.1的定制标记库功能的机制来建立表单。上面的情况使用Struts处理后将象是q样Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><struts:text name="username"/> </td></tr></tbody></table><br /><br />没有必要再显式地涉及(qing)C中获得初始值的JavaBean。这由框架自动处理?<br /><br />3.3.1 使用Struts建立表单 <br /><br />一个完整的注册表单演CStruts相对于直接用HTML和标准的JSP功能怎样极大地减M处理表单的痛苦。考虑以下UCؓ(f)logon.jsp的页面(来自Struts的例子程序)Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><%@ page language="java" %><br /><%@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %><br /><html><br /><head><br /><title><struts:message key="logon.title"/></title><br /><body bgcolor="white"><br /><struts:errors/><br /><struts:form action="logon.do" name="logonForm"<br />type="org.apache.struts.example.LogonForm"/><br /><table border="0" width="100%"><br /><tr><br /><th align="right"><br /><struts:message key="prompt.username"/><br /></th><br /><td align="left"><br /><struts:text name="username" size="16"/><br /></td><br /></tr><br /><tr><br /><th align="right"><br /><struts:message key="prompt.password"/><br /></th><br /><td align="left"><br /><struts:password name="password" size="16"/><br /></td><br /></tr><br /><tr><br /><td align="right"><br /><struts:submit><br /><struts:message key="button.submit"/><br /></struts:submit><br /></td><br /><td align="right"><br /><struts:reset><br /><struts:message key="button.reset"/><br /></struts:reset><br /></td><br /></tr><br /></table><br /></struts:form><br /></body><br /></html></td></tr></tbody></table><br /><br />下面的条目基于这个例子演C在Struts中处理表单的关键的特性:(x) <br /><br />taglib指o(h)告诉JSP面~译器从哪里扑ֈStruts标记库的 标记库描q符 。在q种情况下,我们使用struts作ؓ(f)前缀来标识来自这个库中的标记Q但是可以用Q何你想用的前~?<br /><br />q个面使用了几?message 标记来从一个包含有q个应用E序所有资源的 MessageResources 对象中查扑֛际化的消息字W串。ؓ(f)了让q个面能够工作Q以下的消息关键字必dq些资源中被定义Q?<br /><br />logon.title - 注册面的标?<br /><br />prompt.username - 一?“Username:?提示字符?<br /><br />prompt.password - 一?“Password:?提示字符?<br /><br />button.submit - “Submit”按钮的标签 <br /><br />button.reset - “Reset”按钮的标签 <br /><br />当用h册时Q应用程序可以在用户的session中保存一?Locale 对象。这?Locale 用来选择适当语言的消息。这使得l用户一个切换语a的可选项实现h变的Ҏ(gu)?-- 仅仅改变保存?Locale 对象Q所有的消息׃(x)自动切换?<br /><br />errors 标记昄׃个商业逻辑lg保存的Q何出错消息,或者如果没有出错消息保存就什么都没有。这个标记将在下面做深入的描q?<br /><br />form 标记Z指定的属性对一个HTML 元素q行处理。它也将所有在q个表单中的字段与一个保存在关键?logonForm 下的session范围的FormBean相关联。这个bean用来为所有的h与bean中的属性名匚w的名字的输入字段提供初始倹{如果适当的bean没有扑ֈQ一个新的bean会(x)被自动徏立,使用指定的Javacd?<br /><br />text 标记对一个类型ؓ(f)“text”的HTML 元素q行处理。在q种情况下,占据览器屏q的字符位置的数字也被指定。当面被执行时Q是相对应的bean?username 属性的当前|也就?getUsername() 的返回|?<br /><br />password 标记使用Ҏ(gu)cM。不同之处是当用h入他们的口o(h)时浏览器回应星号字W,而不是输入倹{?<br /><br />submit ?reset 标记在表单低部生成相应的按钮。每个按钮的文本标签使用 message 标记建立Q同时带有提C,q样q些值就是国际化的?<br /><br />3.3.2 输入字段cd支持 <br /><br />Struts为所有以下类型的输入字段定义了标讎ͼ带有与其相应的参考信息的联接?<br /><br />checkboxes <br /><br />hidden 字段 <br /><br />password 输入字段 <br /><br />radio 按钮 <br /><br />reset 按钮 <br /><br />select 列表和嵌入的 <br /><br />options <br /><br />submit 按钮 <br /><br />text 输入字段 <br /><br />textareas <br /><br />在所有情况下Q一个字D|记都必须嵌套在一?form 标记中,q样字段才知道用哪个bean来初始化昄的倹{?<br /><br />3.3.3 其它有用的表C标?<br /><br />在Struts的标记库中有几个其它的标记对于徏立用L(fng)面是有帮助的Q?<br /><br />enumerate Z个指定集合的每个元素重复一ơ标CQ可以是一个EnumerationQ一个HashtableQ一个Vector或一个对象数l)?<br /><br />getProperty 从指定的bean中得到指定的属性,q且在本面的其余部分作Z个page范围的bean存在。这是访问一个被 enumerate 使用的集合的方便的方法?<br /><br />ifAttributeExists 只有在一个指定的属性存在于一个指定的范围中时才对标记体求倹{?<br /><br />ifAttributeMissing 只有在一个指定的属性不存在于一个指定的范围中时才对标记体求倹{?<br /><br />ifParameterEquals 只有在一个指定的h参数h一个指定的值时才对标记体求倹{?<br /><br />ifParameterNotEquals 只有在一个指定的h参数不具有一个指定的值或者不存在时才Ҏ(gu)C求倹{?<br /><br />ifParameterNotNull 只有在一个指定的h参数包含在这个请求中q且长度大于0时才Ҏ(gu)C求倹{?<br /><br />ifParameterNull 只有在一个指定的h参数不包含在q个h中或者长度等?时才Ҏ(gu)C求倹{?<br /><br />iterate Z个指定集合中的每个元素重复一ơ标CQ可以是一个CollectionQ一个IteratorQ一个MapQ或者一个对象数l)。这个标记在Java2环境中代替了 enumerate 标记?<br /><br />link 生成一个超联接Q当没有cookie支持时自动应用URL~程来维护session状态?<br /><br />parameter 处理指定h参数的|适当地过滤HTML中有Ҏ(gu)含义的字W?<br /><br />property 昄一个表单中命名的bean属?-- 在属性应该是只读时用这个标记而不?text 标记?<br /><br />3.3.4 自动表单验证 <br /><br />除了上面描述的表单和bean的交互外Q如果你的bean知道怎样验证它接收的输入字段QStrutsq提供一U附加的机制。ؓ(f)了利用这个特性,使你的beancd?ValidatingActionForm 接口Q而不?ActionForm 接口。一?ValidatingActionForm 增加了一个附加的Ҏ(gu){֐Q?<br /><br />public String[] validate() <br /><br />对于一个被controller servlet在bean属性已l组装但是在相应的行为类?perform() Ҏ(gu)被调用之前调用的Ҏ(gu)Qvalidate() Ҏ(gu)有以下可选项Q?<br /><br />执行适当的验证发现没有错?-- q回 null 或者一个非0长度字符串数l,q且controller servletl调用适当?Action cȝ perform() Ҏ(gu)?<br /><br />执行适当的验证发现有错误 -- q回一个内容ؓ(f)应该被显C的出错消息关键字(q入应用E序的MessageResources 包)的字W串数组。controller servlet作为适合?标记使用的请求属性保存这个数l,q且控刉定向回输入表单(p?ActionMapping ?inputForm 属性标识)?<br /><br />正如以前提到的,q个Ҏ(gu)完全是可选的。如果你的form bean 仅仅实现?ActionForm 接口Qcontroller servlet假设Q何请求的验证由actioncd成?<br /><br />3.4 其它的表C技?<br /><br />管你的应用E序的外表和感觉可以完全Z标准的JSP能力和Struts的定制标记库构徏Q你也应该考虑展开其它改进lg重用、减管理负担或者减出错的技术。在下面的部分讨论几个可选的技术?<br /><br />3.4.1 特定于应用程序的定制标记 <br /><br />在用Struts库提供的定制标记之外Q很Ҏ(gu)建立特定于你创徏的应用程序的标记来帮助徏立用L(fng)面。Struts包括的例子程序用建立以下仅用于实现这个应用程序的标记演示了这个原则:(x) <br /><br />checkLogon - 查一个特D的?x)话对象的存在,如果不存在将控制重定向到注册面。这是用来捕捉这L(fng)情况Q用户在你的应用E序执行的中间把一个页面做成书{ƈ且试图蟩q注册,或者用L(fng)?x)话时?<br /><br />linkSubscription - Z个详l的定单面生成一个超联接Q它?yu)需要的d键字gZ个请求属性传递。这在列Z一个用L(fng)关的定单q提供编辑或删除定单的联接时使用?<br /><br />linkUser - Z个用L(fng)一个具体的面生成一个超联接Q它?yu)它(yu)需要的d键字gZ个请求属性传递?<br /><br />q些标记的源代码?src/example 目录中,在包 org.apache.struts.example 里,q带有一些其它的用在q个应用E序中的JavacR?<br /><br />3.4.2 有包含文件的面lg <br /><br />在一个JSP文gQ包含定制标记和beans用来讉Kh的动态数据)中创建完整的表示是一U非常普通的设计Ҏ(gu)Q在Struts包括的例子程序中被采用。然而很多应用程序要求在单独一个页面中昄你的应用E序的多个逻辑上独立的部分?<br /><br />举例来说Q一个入口应用程序可以在入口的主面上有一些或者全部以下的功能Q?<br /><br />讉Kq个入口的一个搜索引擎?<br /><br />一个或更多的“提供新闠Z的昄Q含有按照用L(fng)注册信息定制的感兴趣的标题?<br /><br />讉K与这个入口相关的讨论的主题?<br /><br />如果你的入口提供免费邮g帐号Q还要有一个“邮件等待”的提示?<br /><br />如果你能够将工作划分开Q分配不同的开发者去做不同的片段Q那么这个站点不同片D늚开发就?x)更加简单。然后,你可以用JSP技术的 include 能力来将q些片段l合q一个单独的面。有两种 include 可用Q依赖于你希望输出的l合发生在什么时_(d)(x) <br /><br />include 指o(h) Q?Q在JSP面被编译时处理。它用于包括不需要在h时改变的HTML代码。它把包括进来的文本当作静态文本,很象C或C++中的 #include 指o(h)?<br /><br />include 行ؓ(f) Q?Q在h时处理,q且是由服务器透明处理。这意味着你可以通过把它嵌套在一个类似ifParameterEquals的标C有条件地执行include ?<br /><br />3.4.3 囄处理lg <br /><br />一些应用程序要求动态生成图片,p一个股市报告站点的h图一栗通常使用两种不同的方法来实现q个需求:(x) <br /><br />处理一个执行一个servleth的URL的超联接。这个servlet用一个图象库来生成图片,讄适当的contentcdQ例?image/gifQ,q且图片的字节发送回览器。浏览器׃(x)象从一个静态文件中接收到的一hC图片?<br /><br />处理HTML代码需要下载一个创求的图象的Java applet。你可以通过为在处理的代码中的这个applet讄适当的初始化参数配置q个图象Q或者你可以让这个applet与服务器建立自己联接来接收这些参数?<br /><img src ="http://www.aygfsteel.com/hayun/aggbug/79264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/hayun/" target="_blank">?/a> 2006-11-05 21:46 <a href="http://www.aygfsteel.com/hayun/articles/struts2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts用户指南(1)http://www.aygfsteel.com/hayun/articles/struts1.html?/dc:creator>?/author>Sun, 05 Nov 2006 13:44:00 GMThttp://www.aygfsteel.com/hayun/articles/struts1.htmlhttp://www.aygfsteel.com/hayun/comments/79263.htmlhttp://www.aygfsteel.com/hayun/articles/struts1.html#Feedback0http://www.aygfsteel.com/hayun/comments/commentRss/79263.htmlhttp://www.aygfsteel.com/hayun/services/trackbacks/79263.html
Struts 的体pȝ构实CModel-View-Controller设计模式的概念,它将q些概念映射到web应用E序的组件和概念中?

1.3 Model: pȝ状态和商业逻辑JavaBeans

ZMVC的系l中?Model 部分可以l分Z个概?-- pȝ的内部状? 能够改变状态的行ؓ(f)。用语法术语来说Q我们可以把状态信息当作名词(事物Q,把行为当作动词(事物状态的改变Q?

通常说来Q你的应用程序将pȝ内部的状态表CZؓ(f)一l一个或多个的JavaBeansQ用属性(propertiesQ来表示状态的l节。依赖于你的应用E序的复杂度Q这些beans可以是自包含的(以某U方式知道怎样怹C存它们的状态信息)Q或者可以是正面的(facadesQ,知道当被h时怎样从外部数据源Q例如数据库Q中取得信息。Entity EJBs通常也用来表C内部状态?

大型应用E序l常系l可能的商业逻辑行ؓ(f)表示为可以被l护状态信息的beans调用的方法。D个例子,你有一个ؓ(f)每个当前用户保存在session中的购物车beanQ里面是表示当前用户军_购买物品的属性。这个bean有一个checkOut()Ҏ(gu)用来验证用户的信用卡Q将定单发给库房以选择货品和出货。别的系l分别地表示同样的行为,或许使用Session EJBs?

在一些小型应用程序中Q同L(fng)行ؓ(f)又可能嵌入到作ؓ(f)Controller一部分?Action cM。这在逻辑非常单或者ƈ不想要在其它环境中重用这些商业逻辑时是恰当的。Struts框架支持所有这些方法,但徏议将商业逻辑Q“做什么”)?Action c(“决定做什么”)分离开?

1.4 View: JSP面和表C组?

ZStruts的应用程序中?View 部分通常使用JSP技术来构徏。JSP面包含UCؓ(f)“模版文本”的静态HTMLQ或XMLQ文本,加上插入的基于对Ҏ(gu)行ؓ(f)标记解释的动态内宏VJSP环境包括了其用途由JSP规范来描q的一套标准的行ؓ(f)标记Q例?。另外,q有一个用来定义你自己标记的标准机Ӟq些自定义的标记l织在“定制标记库”中?

Struts包括了一个广阔的便于创徏用户界面Qƈ且充分国际化的定制标记库Q与作ؓ(f)pȝ Model 部分一部分的ActionForm beans妙地相互配合。这些标记的使用在后面做详l讨论?

除了JSP面和其包含的行为及(qing)定制标记Q商业对象经帔R要能够基于它们在被请求时的当前状态将自己处理成HTMLQ或XMLQ。从q些对象处理q的输出可以很容易地使用 标准行ؓ(f)标记包括在结果的JSP面中?

1.5 Controller: ActionServlet和ActionMapping

应用E序?Controller 部分集中于从客户端接收请求(典型情况下是一个运行浏览器的用PQ决定执行什么商业逻辑功能Q然后将产生下一步用L(fng)面的责Q委派l一个适当的Viewlg。在Struts中,controller的基本组件是一?ActionServlet cȝservlet。这个servlet通过定义一l映(由Java接口 ActionMapping 描述Q来配置。每个映定义一个与所h的URI相匹配的路径和一?Action c(一个实?Action 接口的类Q完整的cdQ这个类负责执行预期的商业逻辑Q然后将控制分派l适当的Viewlg来创建响应?

Struts也支持用包含有q行框架所必需的标准属性之外的附加属性的 ActionMapping cȝ能力。这允许你保存特定于你的应用E序的附加信息,同时仍可利用框架其余的特性。另外,Struts允许你定义控制将重定向到的逻辑名,q样一个行为方法可以请求“主菜单”页面(举例Q,而不需要知道相应的JSP面的实际名字是什么。这个功能极大地帮助你分L刉辑Q下一步做什么)和显C逻辑Q相应的面的名U是什么)?

2. 创徏Modellg你用到的应用E序的需求文档很可能集中于创建用L(fng)面。然而你应该保证每个提交的请求所需要的处理也要被清楚的定义。通常说来QModel lg的开发者集中于创徏支持所有功能需求的JavaBeanscR一个特D应用要求的beans的精特性依赖于具体需求变化会(x)非常的大Q但是它们通常可以分成下面讨论的几U类型。然而,首先对“范围”概念做一个简短的回顾是有用的Q因为它与beans有关?

2.2 JavaBeans和范?

在一个基于web的应用程序中QJavaBeans可以被保存在Qƈ从中讉KQ一些不同“属性”的集合中。每一个集合都有集合生存期和所保存的beans可见度的不同的规则。ȝ说来Q定义生存期和可见度的这些规则被叫做q些beans?范围 。JSP规范中用以下术语定义可选的范围Q在圆括号中定义servlet API中的{h(hun)物)Q?

page - 在一个单独的JSP面中可见的BeansQ生存期限于当前h。(service()Ҏ(gu)中的局部变量) request - 在一个单独的JSP面中可见的BeansQ也包括所有包含于q个面或从q个面重定向到的页面或servlet。(Request属性)

session - 参与一个特定的用户session的所有的JSP和servlet都可见的BeansQ跨一个或多个h?Session属性)

application - 一个web应用E序的所有JSP面和servlet都可见的Beans。(Servlet context属性)

C同一个web应用E序的JSP面和servlets׃n同样一lbean集合是很重要的。例如,一个bean作ؓ(f)一个request属性保存在一个servlet中,pq样Q?

MyCart mycart = new MyCart(...);

request.setAttribute("cart", mycart);

立卌q个servlet重定向到的一个JSP面使用一个标准的行ؓ(f)标记看到Q就象这P(x)

<jsp:useBean id="cart" scope="request"
class="com.mycompany.MyApp.MyCart"/>


2.3 ActionForm Beans

Struts框架通常假定你已lؓ(f)每一个你的应用程序中h的输入创Z一?ActionForm beanQ即一个实C ActionForm 接口的类Q。如果你在你?ActionMapping 配置文g中定义了q样的beansQ见“创建Controllerlg”)QStruts的controller servlet在调用适当?Action Ҏ(gu)前将自动Z执行如下的服务:(x)

用适当的关键字查用L(fng)session中是否有适当的类的bean的一个实例?

如果没有q样的session范围的beanQ自动徏立一个新的beanq添加到用户的session中?

Ҏ(gu)个名字对应于bean中的一个属性的h参数Q调用相应的setҎ(gu)。这个操作类g当你以通配W?”选择所有属性用标准的JSP行ؓ(f)标记 ?

更新的ActionForm bean在被调用时将被传递给Actoncȝperform()Ҏ(gu)Q以使这些D够立即生效?

当你在写你的ActionForm beansӞC以下的原则:(x)

ActionForm 接口本n不需要特D的实现Ҏ(gu)。它是用来标识这些特定的beans在整个体pȝ构中的作用。典型情况下Q一个ActionForm bean只包括属性的getҎ(gu)和setҎ(gu)Q没有商业逻辑?

通常在一个ActionForm bean中只有很的输入验证逻辑。这L(fng)beans存在的主要理由是保存用户为相关的表单所输入的大部分q期?-- 甚至在错误被到?-- q样同样的页面可以被重徏Q伴随有一l出错信息,q样用户仅仅需要纠正错误的字段。用戯入的验证应该?Action cM执行Q如果是很简单的话)Q或者在适当的商业逻辑beans中执行?

为每个表单中出现的字D定义一个属性(用相关的getXxx()和setXxx()Ҏ(gu)Q。字D名和属性名必须按照JavaBeans的约定相匚w。例如,一个名?username 的输入字D将引v setUsername() Ҏ(gu)被调用?

你应该注意一个“表单”在q里讨论时的意义q不必须对应于用L(fng)面中的一个单独的JSP面。在很多应用E序中一个“表单”(从用L(fng)观点Qg伸至多个面也是很^常的。想想看Q例如,通常在安装新的应用程序时使用的导航安装程序的用户界面。Struts鼓励你定义一个包含所有字D属性的单独的ActionForm bean。不字D实际上是显C在哪个面上。同L(fng)Q同一表单的不同的面应该提交到相同的ActioncR如果你늅q个Q在大多数情况下Q页面设计者可以重新组l不同页面中的字D而不需要改变处理逻辑?

2.4 pȝ状态Beans

pȝ的实际状态通常表示Zl一个或多个的JavaBeansc,其属性定义当前状态。例如,一个购物Rpȝ包括一个表C物R的beanQ这个bean为每个单独的购物者维护,q个bean中包括(在其它事物之中)一l购物者当前选择购买的项目。分别地Q系l也包括保存用户信息Q包括他们的信用卡和送货地址Q、可获得目的目录和它们当前库存水^的不同的beans?

对于规模的pȝQ或者对于不需要长旉保存的状态信息,一l系l状态beans可以包含所有系l曾l经历的特定l节的信息。或者经常是Q系l状态beans表示怹保存在一些外部数据库中的信息Q例如CustomerBean对象对应于表 CUSTOMERS 中的特定的一行)Q在需要时从服务器的内存中创徏或清除。在大规模应用程序中QEntity EJBs也用于这U用途?

2.5 商业逻辑B(ti)eans

你应该把你的应用E序中的功能逻辑装成对为此目的设计的JavaBeans的方法调用。这些方法可以是用于pȝ状态beans的相同的cȝ一部分Q或者可以是在专门执行商业逻辑的独立的cM。在后一U情况下Q你通常需要将pȝ状态beans传递给q些Ҏ(gu)作ؓ(f)参数处理?

Z代码最大的可重用性,商业逻辑beans应该被设计和实现为它们不知道自己被执行于web应用环境中。如果你发现在你的bean中你必须import一?javax.servlet.* c,你就把这个商业逻辑捆绑在了web应用环境中。考虑重新l织事物使你?Action c(Controllerd的一部分Q在下面描述Q翻译所有从HTTPh中请求被处理为对你的商业逻辑beans属性setҎ(gu)调用的信息,然后可以发出一个对 execute() 的调用。这L(fng)一个商业逻辑cd以被重用在除它们最初被构造的web应用E序以外的环境中?

依赖于你的应用程序的复杂度和范围Q商业逻辑beans可以是与作ؓ(f)参数传递的pȝ状态beans交互作用的普通的JavaBeansQ或者用JDBC调用讉K数据库的普通的JavaBeans。而对于较大的应用E序Q这些beansl常是有状态或无状态的EJBs?

2.6 题外? 讉K关系数据?

很多web应用E序利用一个关pL据库Q通过一个JDBC driver讉KQ来保存应用E序相关的永久数据。其它应用程序则使用Entity EJBs来实现这个目的,他们委派EJBs自己来决定怎样l护怹状态。如果你是用EJBs来实现这个目的,늅EJB规范中描q的客户端设计模式?

对于Z直接数据库访问的web应用E序Q一个普通的设计问题是当需要访问低层数据库时怎样产生一个适当的JDBCq接对象。解册个问题有几种Ҏ(gu) -- 以下原则描述了推荐的一U方法:(x)

创徏或得C个允怸l数据库q接被多个用户共享的ConnectionPoolcRStrutsQ当前)没有包括q样的一个类Q但是有很多q样的类可以得到?

当应用程序初始化Ӟ在应用程序展开QdeploymentQ描q符中定义一个有一个“启动时加蝲”值的servlet。我们将把这个servlet叫做 启动 servlet。在大多数情况下Q这个servlet不需要处理Q何的hQ所以没有一??x)指向它?

在启动servlet?init() Ҏ(gu)中,配置q初始化一个ConnectionPoolcȝ实例Q将其保存ؓ(f)一个servlet context属性(从JSP的观点看{同于一个application范围的beanQ。通常Z传递给启动servlet初始化参数来配置联接~冲池是很方便的?

在启动servlet?destroy() Ҏ(gu)中,包含了释放联接缓冲池所打开的联接的逻辑。这个方法将在servlet容器l束q个应用E序的时候被调用?

?Action c需要调用一个需要数据库联接的商业逻辑bean中的Ҏ(gu)Q例如“insert a new customer”)Ӟ执行下面的步骤Q?

个web应用E序从servelt context属性中得到一个联接缓冲池对象?

调用联接~冲池对象的 open() Ҏ(gu)来得C个在 Action c调用中使用的联接?

调用商业逻辑bean中合适的Ҏ(gu)Q将数据库联接对象作Z个参C递给它?

调用分配的联接中?close() Ҏ(gu)Q这引赯个联接ؓ(f)了以后其它请求的重用被返回到~冲池中?

一个通常的编E错误是忘记了把数据库联接返回给~冲池,q将最l导致用完所有的联接。一定要信 Action cȝ逻辑Lq回联接Q甚臛_商业逻辑bean抛出一个违例时?

늅上面推荐的设计模式意味着你能够编写你的商业逻辑c而不需要担心它们怎样得到一个JDBC联接来?- 单地在Q何需要访问数据库的方法中包含一个Connection参数。当你的商业逻辑cd一个web应用E序中被利用Ӟ分配和释N当的联接是 Action cȝ责Q。当你用相同的商业逻辑cLQ例如,在一个批处理工作中,提供一个适当的联接是那个应用E序的责任(q不需要从~冲池中获得Q因为大多数批处理工作运行于一个单U程环境中)?


]]>
վ֩ģ壺 ν| | ʲ| | | | ɣֲ| ̨| Ѱ| | | | | | ˿| ƽ| ɳ| | | ¡| ԫ| ޳| | | | ƽң| ij| ƽ| | | ƽ| ̨| | Ӣɳ| ޶| | | | | | ָ|