<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/6273e75a8dbc4529de3cc2fc/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6273e75a8dbc4529de3cc2fc/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">St<span class="_ _0"></span>r<span class="_ _0"></span>u<span class="_ _0"></span>t<span class="_ _1"></span>s<span class="_ _0"></span> <span class="_ _2"> </span><span class="ff2 ls1">用户指南<span class="ff1"> </span></span></div><div class="t m0 x2 h3 y2 ff3 fs1 fc1 sc0 ls2 ws0">1. <span class="_ _3"> </span><span class="ff2 sc1 ls1">介绍<span class="ff1 sc0"> </span></span></div><div class="t m0 x2 h4 y3 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y4 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls4 ws1">1.1 Model-View-Contr<span class="_ _4"></span>oller (MVC) <span class="_ _3"> </span></span><span class="ff2 ls1">设计模式<span class="ff1"> </span></span></div><div class="t m0 x2 h4 y5 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y6 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls5 ws2">FIXME - <span class="_"> </span></span><span class="ff2 ls1">需要一个对该模式一<span class="_ _5"></span>般性的介绍。<span class="_ _6"></span>(译注:<span class="_ _7"></span>可以参考机械工业<span class="_ _5"></span>出版社的<span class="_ _7"></span><span class="ls6">《设</span></span></div><div class="t m0 x2 h6 y7 ff2 fs1 fc1 sc0 ls1 ws0">计模式》。)<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y8 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y9 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls8">1.2 <span class="_ _3"> </span><span class="ff2 ls1">将<span class="_ _3"> </span></span><span class="ls9">MVC<span class="_"> </span><span class="ff2 ls1">概念映射到<span class="_ _8"> </span></span><span class="lsa">Struts<span class="_"> </span><span class="ff2 ls1">组件中<span class="ff1"> </span></span></span></span></span></div><div class="t m0 x2 h4 ya ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 yb ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 lsa">Struts<span class="_ _4"></span> <span class="_ _3"> </span><span class="ff2 ls1">的体系<span class="_ _5"></span>结构实现了<span class="_ _3"> </span><span class="ff1 lsb">Model-View-Controller<span class="_"> </span></span>设计模式的概念,它<span class="_ _5"></span>将这些概念</span></span></div><div class="t m0 x2 h6 yc ff2 fs1 fc1 sc0 ls1 ws0">映射到<span class="_ _3"> </span><span class="ff1 lsc">we<span class="_ _4"></span>b<span class="_"> </span></span>应用程序的组件和概<span class="_ _5"></span>念中,如下图<span class="_ _5"></span>所示:<span class="ff1"> </span></div><div class="t m0 x3 h7 yd ff4 fs2 fc1 sc0 ls1 ws0"> </div><div class="t m0 x4 h5 ye ff4 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 yf ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">这一体系结构中每<span class="_ _5"></span>个主要的组<span class="_ _5"></span>件都将在下面做<span class="_ _5"></span>详细的讨论。<span class="ff1 ls7"> </span></span></div><div class="t m0 x2 h5 y10 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 lsd ws3">1.3 Model: <span class="_ _9"> </span></span><span class="ff2 ls1">系统状态和商业逻辑<span class="_ _3"> </span><span class="ff1 lse">JavaBeans </span></span></div><div class="t m0 x2 h4 y11 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y12 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls6">基于<span class="_ _9"> </span><span class="ff1 ls9">MVC<span class="_ _9"> </span></span><span class="ls1">的系统中的<span class="ff1 lsf ws4"> Model </span>部分可以细分<span class="_ _5"></span>为两个概念<span class="ff1 ls10 ws5"> -- </span>系统的内<span class="_ _5"></span>部状态<span class="ff1 ls11">, <span class="_ _9"> </span></span>能够</span></span></div><div class="t m0 x2 h6 y13 ff2 fs1 fc1 sc0 ls1 ws0">改变状态的行为。<span class="_ _a"></span>用语法术语来说,<span class="_ _a"></span>我们可以<span class="_ _5"></span>把状态信息当<span class="_ _5"></span>作名词<span class="_ _a"></span>(事物)<span class="_ _a"></span>,<span class="_ _5"></span>把行<span class="_ _5"></span>为当</div><div class="t m0 x2 h6 y14 ff2 fs1 fc1 sc0 ls1 ws0">作动词(事物状态的改<span class="_ _5"></span>变)。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y15 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y16 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">通常说来,你的应<span class="_ _5"></span>用程序将系<span class="_ _5"></span>统内部的状态表<span class="_ _5"></span>示为一组一个或<span class="_ _5"></span>多个的<span class="_ _3"> </span><span class="ff1 ls12">JavaBeans</span>,</span></div><div class="t m0 x2 h6 y17 ff2 fs1 fc1 sc0 ls1 ws0">使用属性<span class="_ _b"></span>(<span class="ff1 ls12">properties</span>)<span class="_ _b"></span>来表示状态的细节。<span class="_ _b"></span>依赖于<span class="_ _5"></span>你的应用程序的<span class="_ _5"></span>复杂度,<span class="_ _b"></span>这些<span class="_ _3"> </span><span class="ff1 ls8">beans</span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6273e75a8dbc4529de3cc2fc/bg2.jpg"><div class="t m0 x2 h6 y18 ff2 fs1 fc1 sc0 ls1 ws0">可以是自包含的<span class="_ _c"></span>(以某种方式知道<span class="_ _5"></span>怎样永久地保<span class="_ _5"></span>存它们的状态信息<span class="_ _5"></span>)<span class="_ _c"></span>,<span class="_ _a"></span>或者<span class="_ _5"></span>可以是正面</div><div class="t m0 x2 h6 y19 ff2 fs1 fc1 sc0 ls13 ws0">的(<span class="_ _4"></span><span class="ff1 ls14">f<span class="_ _4"></span>acades</span><span class="ls1">)<span class="_ _a"></span>,<span class="_ _5"></span>知道当<span class="_ _5"></span>被请求时怎样从外部数<span class="_ _5"></span>据源<span class="_ _a"></span>(例如数据库)<span class="_ _a"></span>中取得信息。<span class="_ _a"></span><span class="ff1 ls11">Entity<span class="_ _5"></span> </span></span></div><div class="t m0 x2 h6 y1a ff1 fs1 fc1 sc0 ls15 ws0">EJBs<span class="_"> </span><span class="ff2 ls1">通常也用<span class="_ _5"></span>来表示内<span class="_ _5"></span>部状态。<span class="ff1 ls7"> </span></span></div><div class="t m0 x2 h5 y1b ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">大型应用程序经常<span class="_ _5"></span>将系统可能<span class="_ _5"></span>的商业逻辑行为<span class="_ _5"></span>表示为可以被维<span class="_ _5"></span>护状态信息的</span></div><div class="t m0 x2 h6 y1c ff1 fs1 fc1 sc0 ls8 ws0">beans<span class="_ _3"> </span><span class="ff2 ls1">调用的方法。举个例子,你<span class="_ _5"></span>有一个为每个当<span class="_ _5"></span>前用户保存在<span class="_ _3"> </span><span class="ff1 ls16">session<span class="_ _3"> </span></span>中的购物车</span></div><div class="t m0 x2 h6 y1d ff1 fs1 fc1 sc0 ls8 ws0">bean<span class="ff2 ls1">,<span class="_ _b"></span>里面是表示当前用户决定购<span class="_ _5"></span>买物品的属性<span class="_ _5"></span>。<span class="_ _b"></span>这个<span class="_ _3"> </span><span class="ff1 ls8">bean<span class="_"> </span></span><span class="ls6">有一个<span class="_ _8"> </span><span class="ff1 ls17">checkOut()</span></span>方法用</span></div><div class="t m0 x2 h6 y1e ff2 fs1 fc1 sc0 ls1 ws0">来验证用户的信用卡<span class="_ _5"></span>,<span class="_ _d"></span>将定单发给库房以<span class="_ _5"></span>选择货品<span class="_ _5"></span>和出货。<span class="_ _d"></span>别的系统分<span class="_ _5"></span>别地表示同样的</div><div class="t m0 x2 h6 y1f ff2 fs1 fc1 sc0 ls1 ws0">行为,或许使用<span class="_ _3"> </span><span class="ff1 ls18 ws6">Session EJBs</span>。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h5 y20 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">在一些小型应用程<span class="_ _5"></span>序中,<span class="_ _7"></span>同样<span class="_ _5"></span>的行为又可能嵌<span class="_ _5"></span>入到作为<span class="_ _3"> </span><span class="ff1 ls19">Controller<span class="_"> </span></span><span class="ls6">一部分的<span class="_ _4"></span><span class="ff1 ls1a ws7"> Action </span></span></span></div><div class="t m0 x2 h6 y21 ff2 fs1 fc1 sc0 ls1 ws0">类中。这在逻辑非常简<span class="_ _5"></span>单或者并不<span class="_ _5"></span>想要在其它环境<span class="_ _5"></span>中重用这些商业<span class="_ _5"></span>逻辑时是恰当的。</div><div class="t m0 x2 h6 y22 ff1 fs1 fc1 sc0 lsa ws0">Struts<span class="_"> </span><span class="ff2 ls1">框架支持所有这些<span class="_ _5"></span>方法,但建议将<span class="_ _5"></span>商业逻辑(<span class="ff1">“</span>做什<span class="_ _5"></span>么<span class="ff1">”</span>)和<span class="ff1 lsf ws4"> Action </span>类(<span class="ff1">“</span><span class="ls6">决定做</span></span></div><div class="t m0 x2 h6 y23 ff2 fs1 fc1 sc0 ls1 ws0">什么<span class="ff1">”</span>)分离开。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h5 y24 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls1b ws8">1.4 View: JSP<span class="_ _3"> </span></span><span class="ff2 ls1">页面和表示组件<span class="ff1"> </span></span></div><div class="t m0 x2 h4 y25 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y26 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">基于<span class="_ _3"> </span><span class="ff1 ls1c">St<span class="_ _4"></span>r<span class="_ _4"></span>uts<span class="_"> </span></span>的应用程序中的<span class="ff1 ls1d ws9"> View </span>部分通常<span class="_ _5"></span>使用<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>技术来构建<span class="_ _5"></span>。<span class="ff1 ls6">JSP<span class="_"> </span></span>页面包含</span></div><div class="t m0 x2 h6 y27 ff2 fs1 fc1 sc0 ls1 ws0">称为<span class="ff1">“</span>模版文本<span class="ff1">”</span><span class="ls6">的静态<span class="_ _3"> </span><span class="ff1 ls1f">HT<span class="_ _4"></span>ML<span class="_ _5"></span><span class="ff2 ls1">(或<span class="_ _3"> </span><span class="ff1 ls20">XML</span>)<span class="_ _c"></span>文本,<span class="_ _a"></span>加上插入的基于对特殊行<span class="_ _5"></span>为标记解释<span class="_ _5"></span>的</span></span></span></div><div class="t m0 x2 h6 y28 ff2 fs1 fc1 sc0 ls1 ws0">动态内容。<span class="_ _c"></span><span class="ff1 ls1e">JSP<span class="_"> </span><span class="ff2 ls1">环<span class="_ _5"></span>境包括了其用途由<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_ _3"> </span></span>规范来描述的一<span class="_ _5"></span>套标准的行为<span class="_ _5"></span>标记,<span class="_ _c"></span>例如<span class="ff1"> <span class="_ _9"> </span></span><</span></span></div><div class="t m0 x2 h6 y29 ff1 fs1 fc1 sc0 ls16 ws0">jsp:useBean<span class="ff2 ls1">><span class="ff1"> <span class="_ _3"> </span></span>。<span class="_ _c"></span>另外,<span class="_ _c"></span>还有一个用来定义你自<span class="_ _5"></span>己标记的标准机制,<span class="_ _d"></span>这些自定义的标记</span></div><div class="t m0 x2 h6 y2a ff2 fs1 fc1 sc0 ls1 ws0">组织在<span class="ff1">“</span>定制标记库<span class="_ _5"></span><span class="ff1">”<span class="ff2">中。</span><span class="ls7"> </span></span></div><div class="t m0 x2 h4 y2b ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y2c ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 lsa">Struts<span class="_"> </span><span class="ff2 ls1">包括了一个广<span class="_ _5"></span>阔的便于创建用<span class="_ _5"></span>户界面,<span class="_ _a"></span>并且充分国际化<span class="_ _5"></span>的定制标记库,<span class="_ _c"></span>与作</span></span></div><div class="t m0 x2 h6 y2d ff2 fs1 fc1 sc0 ls1 ws0">为系统<span class="ff1 lsf ws4"> Model </span>部分一部<span class="_ _5"></span>分的<span class="_ _3"> </span><span class="ff1 ls1a wsa">ActionForm beans<span class="_ _3"> </span></span>美妙地相互配合。这些标<span class="_ _5"></span>记的使用将</div><div class="t m0 x2 h6 y2e ff2 fs1 fc1 sc0 ls1 ws0">在后面做详细讨论。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h5 y2f ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">除了<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_ _3"> </span></span>页面和其包含的行为及定<span class="_ _5"></span>制标记,<span class="_ _5"></span>商业对象经常需要能够<span class="_ _5"></span>基于它们在<span class="_ _5"></span>被</span></div><div class="t m0 x2 h6 y30 ff2 fs1 fc1 sc0 ls1 ws0">请求时的当前状态将自<span class="_ _5"></span>己处理成<span class="_ _3"> </span><span class="ff1 ls1f">HTML<span class="_ _4"></span></span>(或<span class="_ _8"> </span><span class="ff1 ls20">XM<span class="_ _5"></span>L<span class="ff2 ls1">)。从这些对象<span class="_ _5"></span>处理过的输出可以<span class="_ _5"></span>很</span></span></div><div class="t m0 x2 h6 y31 ff2 fs1 fc1 sc0 ls1 ws0">容易地使用<span class="ff1"> <span class="_ _9"> </span></span><<span class="ff1 lsd">jsp:include</span>><span class="ff1"> <span class="_ _9"> </span></span>标准行为标记包括在结果的<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_ _3"> </span></span>页面中。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h5 y32 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls4 ws1">1.5 Controller: ActionServlet<span class="_"> </span></span><span class="ff2 ls1">和<span class="_ _3"> </span><span class="ff1 ls8">ActionMapping </span></span></div><div class="t m0 x2 h4 y33 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y34 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">应用程序的<span class="ff1 ls4 wsb"> Controller </span>部分集中于<span class="_ _5"></span>从客户端<span class="_ _5"></span>接收请求(典型情况下<span class="_ _5"></span>是一个运行<span class="_ _5"></span>浏</span></div><div class="t m0 x2 h6 y35 ff2 fs1 fc1 sc0 ls1 ws0">览器的用户)<span class="_ _c"></span>,<span class="_ _c"></span>决定执行什么商业逻辑功<span class="_ _5"></span>能,<span class="_ _c"></span>然后将产生下一步用<span class="_ _5"></span>户界面的责任委派<span class="_ _5"></span>给</div><div class="t m0 x2 h6 y36 ff2 fs1 fc1 sc0 ls1 ws0">一个适当的<span class="_ _3"> </span><span class="ff1 ls1d">View<span class="_ _3"> </span></span>组件。<span class="_ _d"></span>在<span class="_ _3"> </span><span class="ff1 ls2">Struts<span class="_"> </span></span><span class="ls6">中,<span class="_ _d"></span><span class="ff1 ls21">controller<span class="_ _3"> </span><span class="ff2 ls1">的基本组件是一个</span><span class="ls22 wsc"> Ac<span class="_ _5"></span>tio<span class="_ _5"></span>nServ<span class="_ _5"></span>let <span class="ff2 ls1 ws0">类的</span></span></span></span></div><div class="t m0 x2 h6 y37 ff1 fs1 fc1 sc0 ls23 ws0">servlet<span class="ff2 ls24">。这<span class="_ _0"></span>个<span class="_ _e"> </span></span><span class="ls25">serv<span class="_ _5"></span>let<span class="_"> </span><span class="ff2 ls1">通<span class="_ _5"></span>过定义一组映射<span class="_ _d"></span>(由<span class="_ _3"> </span><span class="ff1 ls26">Java<span class="_ _3"> </span></span>接口<span class="ff1 ls16 wsd"> ActionMapping </span>描述)<span class="_ _d"></span>来<span class="_ _5"></span>配置。</span></span></div><div class="t m0 x2 h6 y38 ff2 fs1 fc1 sc0 ls1 ws0">每个映射定义一个与所<span class="_ _5"></span>请求的<span class="_ _3"> </span><span class="ff1 ls27">URI<span class="_"> </span></span>相<span class="_ _5"></span>匹配的路径和一个<span class="ff1 lsf ws4"> Ac<span class="_ _5"></span>tion <span class="ff2 ls6 ws0">类(<span class="_ _4"></span>一个实现<span class="_ _4"></span></span><span class="ls1a ws7"> Action </span></span></div><div class="t m0 x2 h6 y39 ff2 fs1 fc1 sc0 ls1 ws0">接口的类)完整的类名<span class="_ _5"></span>,这个类负<span class="_ _5"></span>责执行预期的商<span class="_ _5"></span>业逻辑,然后将<span class="_ _5"></span>控制分派给适当的</div><div class="t m0 x2 h6 y3a ff1 fs1 fc1 sc0 ls28 ws0">View<span class="_"> </span><span class="ff2 ls1">组件来创建响<span class="_ _5"></span>应。<span class="ff1 ls29"> </span></span></div><div class="t m0 x2 h4 y3b ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y3c ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 lsa">Struts<span class="_"> </span><span class="ff2 ls1">也支持使用包<span class="_ _5"></span>含有运行框架所<span class="_ _5"></span>必需的标准属性之<span class="_ _5"></span>外的附加属性的<span class="_ _5"></span><span class="ff1"> </span></span></span></div><div class="t m0 x2 h6 y3d ff1 fs1 fc1 sc0 ls16 ws0">ActionMapping <span class="_ _9"> </span><span class="ff2 ls1">类的能力。<span class="_ _b"></span>这允许你保存特定<span class="_ _5"></span>于你的应用程序的附<span class="_ _5"></span>加信息,<span class="_ _f"></span>同时仍可利</span></div><div class="t m0 x2 h6 y3e ff2 fs1 fc1 sc0 ls1 ws0">用框架其余的特性。<span class="_ _a"></span>另外,<span class="_ _a"></span><span class="ff1 ls2a">St<span class="_ _4"></span>ruts<span class="_"> </span><span class="ff2 ls1">允许你<span class="_ _5"></span>定义控制<span class="_ _5"></span>将重定向到的逻辑名<span class="_ _5"></span>,<span class="_ _5"></span>这样一个行<span class="_ _5"></span>为</span></span></div><div class="t m0 x2 h6 y3f ff2 fs1 fc1 sc0 ls1 ws0">方法可以请求<span class="ff1">“</span>主菜单<span class="_ _5"></span><span class="ff1">”<span class="ff2">页面<span class="_ _10"></span>(举例)<span class="_ _10"></span>,<span class="_ _10"></span>而不需要知道相应的<span class="_ _9"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>页面的实<span class="_ _5"></span>际名字是什么。</span></span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6273e75a8dbc4529de3cc2fc/bg3.jpg"><div class="t m0 x2 h6 y18 ff2 fs1 fc1 sc0 ls1 ws0">这个功能极大地帮助你<span class="_ _5"></span>分离控制逻<span class="_ _5"></span>辑<span class="_ _c"></span>(下一步做什么)<span class="_ _c"></span>和显示逻辑<span class="_ _c"></span>(相应的页面的名<span class="_ _5"></span>称</div><div class="t m0 x2 h6 y19 ff2 fs1 fc1 sc0 ls1 ws0">是什么)。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h5 y40 ff4 fs1 fc1 sc0 ls1 ws0"> <span class="_"> </span><span class="ff3 ls2">2. <span class="_ _9"> </span></span><span class="ff2 sc1">创建<span class="_ _8"> </span></span><span class="ff3 ls16">M<span class="_ _4"></span>odel<span class="_ _3"> </span></span><span class="ff2 sc1">组件</span><span class="ff1"> </span></div><div class="t m0 x2 h4 y41 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y42 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls8">2.1 <span class="_ _9"> </span><span class="ff2 ls1">概述<span class="ff1"> </span></span></span></div><div class="t m0 x2 h4 y43 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y44 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">你用到的应用程序<span class="_ _5"></span>的需求文档<span class="_ _5"></span>很可能集中于创<span class="_ _5"></span>建用户界面。<span class="_ _10"></span>然而你应该<span class="_ _5"></span>保证每个提</span></div><div class="t m0 x2 h6 y45 ff2 fs1 fc1 sc0 ls1 ws0">交的请求所需要的处理<span class="_ _5"></span>也要被清楚<span class="_ _5"></span>的定义。<span class="_ _10"></span>通常说来,<span class="_ _10"></span><span class="ff1 ls21">Model <span class="_ _3"> </span><span class="ff2 ls1">组件的开发者集中于创<span class="_ _5"></span>建</span></span></div><div class="t m0 x2 h6 y46 ff2 fs1 fc1 sc0 ls1 ws0">支持所有功能需求的<span class="_ _3"> </span><span class="ff1 ls8">JavaBeans<span class="_ _3"> </span></span>类。一个特殊应<span class="_ _5"></span>用要求的<span class="_ _3"> </span><span class="ff1 ls8">beans<span class="_"> </span></span>的精<span class="_ _5"></span>确特性依赖<span class="_ _5"></span>于具</div><div class="t m0 x2 h6 y47 ff2 fs1 fc1 sc0 ls1 ws0">体需求变化会非常的大,<span class="_ _11"></span>但是它们通常可以分成<span class="_ _5"></span>下面讨论的<span class="_ _5"></span>几种类型。<span class="_ _f"></span>然而,<span class="_ _11"></span>首先对<span class="ff1">“</span>范</div><div class="t m0 x2 h6 y48 ff2 fs1 fc1 sc0 ls1 ws0">围<span class="ff1">”</span>概念做一个简短的<span class="_ _5"></span>回顾是有用<span class="_ _5"></span>的,因为它与<span class="_ _3"> </span><span class="ff1 ls8">beans<span class="_ _3"> </span></span>有关。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y49 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y4a ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls8 wse">2.2 JavaBeans<span class="_ _3"> </span></span><span class="ff2 ls1">和范围<span class="ff1"> </span></span></div><div class="t m0 x2 h4 y4b ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y4c ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">在一个基于<span class="_ _3"> </span><span class="ff1 lsc">web<span class="_"> </span></span>的应用程序中,<span class="ff1 ls8">JavaBeans<span class="_ _3"> </span></span>可以被保存在(并从<span class="_ _5"></span>中访问)一<span class="_ _5"></span>些不</span></div><div class="t m0 x2 h6 y4d ff2 fs1 fc1 sc0 ls1 ws0">同<span class="ff1">“</span>属性<span class="ff1">”</span>的集合中。<span class="_ _12"></span>每一个集合都有集合<span class="_ _5"></span>生存期和<span class="_ _5"></span>所保存的<span class="_ _13"> </span><span class="ff1 ls8">beans<span class="_ _13"> </span></span>可见度的不同的规则。</div><div class="t m0 x2 h6 y4e ff2 fs1 fc1 sc0 ls1 ws0">总的说来,定义生存期<span class="_ _5"></span>和可见度的<span class="_ _5"></span>这些规则被叫做<span class="_ _5"></span>这些<span class="_ _3"> </span><span class="ff1 ls8">beans<span class="_"> </span></span>的<span class="_ _5"></span><span class="ff1"> <span class="_ _9"> </span><span class="ff2">范围</span> <span class="_ _3"> </span><span class="ff2">。</span><span class="ls6">JSP<span class="_"> </span></span><span class="ff2">规范中</span></span></div><div class="t m0 x2 h6 y4f ff2 fs1 fc1 sc0 ls1 ws0">使用以下术语定义可选<span class="_ _5"></span>的范围(在<span class="_ _5"></span>圆括号中定义<span class="_ _3"> </span><span class="ff1 ls2b wsf">servlet API<span class="_ _3"> </span></span>中的等价物):<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y50 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y51 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls8 ws10">page - <span class="_"> </span></span><span class="ff2 ls1">在一个单独<span class="_ _5"></span>的<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>页面中<span class="_ _5"></span>可见的<span class="_ _3"> </span><span class="ff1 lsf">Beans</span>,<span class="_ _10"></span>生存期限于当前<span class="_ _5"></span>请求。<span class="_ _14"></span>(<span class="ff1 ls2c">service()</span></span></div><div class="t m0 x2 h5 y52 ff2 fs1 fc1 sc0 ls1 ws0">方法中的局部变量)<span class="ff1"> <span class="_ _9"> </span><span class="ff4 ls2d"> </span><span class="ls8 ws11">request - <span class="_ _3"> </span></span></span>在一个单独的<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_ _3"> </span></span>页面中可见的<span class="_ _3"> </span><span class="ff1 lsf">Beans</span>,也包括</div><div class="t m0 x2 h6 y53 ff2 fs1 fc1 sc0 ls1 ws0">所有包含于这个页面或<span class="_ _5"></span>从这个页面<span class="_ _5"></span>重定向到的页面<span class="_ _5"></span>或<span class="_ _3"> </span><span class="ff1 ls23">servlet</span>。(<span class="ff1 ls21">Request<span class="_ _3"> </span></span>属性)<span class="ff1 ls7"> </span></div><div class="t m0 x2 h5 y54 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls25 ws12">session - <span class="_ _13"> </span></span><span class="ff2 ls1">参与一个特定的用户<span class="_ _3"> </span><span class="ff1 ls2e">session<span class="_ _3"> </span></span><span class="ls6">的所有的<span class="_ _8"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span></span>和<span class="_ _3"> </span><span class="ff1 ls25">serv<span class="_ _5"></span>let<span class="_"> </span><span class="ff2 ls1">都可<span class="_ _5"></span>见的<span class="_ _3"> </span><span class="ff1 ls12">Beans</span>,</span></span></span></div><div class="t m0 x2 h6 y55 ff2 fs1 fc1 sc0 ls1 ws0">跨越一个或多个请求。<span class="_ _5"></span><span class="ff1 ls2f">(Session<span class="_ _9"> </span><span class="ff2 ls1">属性)</span><span class="ls7"> </span></span></div><div class="t m0 x2 h5 y56 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls30 ws13">application - <span class="_ _9"> </span></span><span class="ff2 ls1">一个<span class="_ _8"> </span><span class="ff1 lsc">web<span class="_"> </span></span>应用程序的所有<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>页面和<span class="_ _3"> </span><span class="ff1 ls25">serv<span class="_ _5"></span>let<span class="_ _3"> </span><span class="ff2 ls1">都可见的<span class="_ _3"> </span></span><span class="ls12">Beans<span class="ff2 ls1">。</span></span></span></span></div><div class="t m0 x2 h6 y57 ff2 fs1 fc1 sc0 ls1 ws0">(<span class="ff1 ls16 ws14">Servlet context<span class="_ _3"> </span></span><span class="ls6">属性<span class="_ _4"></span>)<span class="ff1 ls7"> </span></span></div><div class="t m0 x2 h6 y58 ff2 fs1 fc1 sc0 ls1 ws0">记住同一个<span class="_ _3"> </span><span class="ff1 lsc">web<span class="_"> </span></span>应用程序的<span class="_ _9"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>页面<span class="_ _5"></span>和<span class="_ _3"> </span><span class="ff1 ls23">servlets<span class="_ _9"> </span></span>共享同样一组<span class="_ _3"> </span><span class="ff1 ls8">bean<span class="_ _3"> </span></span>集合是很重<span class="_ _5"></span>要的。</div><div class="t m0 x2 h6 y59 ff2 fs1 fc1 sc0 ls1 ws0">例如,一个<span class="_ _3"> </span><span class="ff1 ls8">bean<span class="_ _3"> </span></span><span class="ls6">作为<span class="_ _4"></span>一个<span class="_ _8"> </span><span class="ff1 ls8">request<span class="_ _3"> </span></span></span>属性保存在一个<span class="_ _3"> </span><span class="ff1 ls23">servlet<span class="_ _3"> </span></span>中,就象这样:<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y5a ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h4 y5b ff1 fs1 fc1 sc0 ls31 ws15">My<span class="_ _5"></span>Cart my<span class="_ _5"></span>cart =<span class="_ _5"></span> new<span class="_ _5"></span> MyCa<span class="_ _5"></span>rt(...)<span class="_ _5"></span>; </div><div class="t m0 x2 h4 y5c ff1 fs1 fc1 sc0 ls32 ws16">reques<span class="_ _5"></span>t.setA<span class="_ _5"></span>ttribu<span class="_ _5"></span>te("ca<span class="_ _5"></span>rt", my<span class="_ _5"></span>cart); </div><div class="t m0 x2 h4 y5d ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y5e ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">将立即被这个<span class="_ _3"> </span><span class="ff1 ls23">servlet<span class="_ _3"> </span></span>重定向到的<span class="_ _5"></span>一个<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>页<span class="_ _5"></span>面使用一个标准的行为<span class="_ _5"></span>标记看到<span class="_ _5"></span>,就</span></div><div class="t m0 x2 h6 y5f ff2 fs1 fc1 sc0 ls1 ws0">象这样:</div><div class="t m0 x5 h7 y60 ff4 fs2 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h6 y61 ff2 fs1 fc1 sc0 ls1 ws0"><<span class="ff1 ls14 ws17">jsp:useBean id="cart" scope="re<span class="_ _5"></span>quest" </span></div><div class="t m0 x2 h6 y62 ff1 fs1 fc1 sc0 ls30 ws0">class="com.mycompany.MyApp.MyCart"/<span class="_ _4"></span><span class="ff2 ls1">></span><span class="ls7"> </span></div><div class="t m0 x2 h5 y63 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls1a wsa">2.3 ActionForm Beans </span></div><div class="t m0 x2 h4 y64 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y65 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 lsa">Struts<span class="_"> </span><span class="ff2 ls1">框架通常假定<span class="_ _5"></span>你已经为每一个<span class="_ _5"></span>你的应用程序中请<span class="_ _5"></span>求的输入创建了<span class="_ _5"></span>一个<span class="ff1"> </span></span></span></div><div class="t m0 x2 h6 y66 ff1 fs1 fc1 sc0 ls1a wsa">ActionForm bean<span class="ff2 ls1 ws0">(即一个实现了</span><span class="ls30 ws18"> Ac<span class="_ _5"></span>tionForm <span class="ff2 ls1 ws0">接口的类)。如果<span class="_ _5"></span>你在你的<span class="ff1"> </span></span></span></div><div class="t m0 x2 h6 y67 ff1 fs1 fc1 sc0 ls16 ws0">ActionMapping <span class="_ _9"> </span><span class="ff2 ls1">配置文件中定义了这样的<span class="_ _3"> </span></span><span class="ls8">beans<span class="ff2 ls6">(见</span><span class="ls1">“<span class="ff2 ls6">创建<span class="_ _8"> </span></span><span class="ls1d">Cont<span class="_ _4"></span>roller<span class="_ _3"> </span></span><span class="ff2">组件</span>”<span class="ff2">),</span><span class="lsa">Strut<span class="_ _4"></span>s</span></span></span></div><div class="t m0 x2 h6 y68 ff2 fs1 fc1 sc0 ls1 ws0">的<span class="_ _3"> </span><span class="ff1 ls33 ws19">controlle<span class="_ _5"></span>r serv<span class="_ _5"></span>let<span class="_ _3"> </span><span class="ff2 ls1 ws0">在调用适当的</span><span class="lsf ws4"> Action <span class="ff2 ls1 ws0">方法前<span class="_ _5"></span>将自动为你执行<span class="_ _5"></span>如下的服务:<span class="ff1 ls7"> </span></span></span></span></div><div class="t m0 x2 h4 y69 ff1 fs1 fc1 sc0 ls1 ws0"> </div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6273e75a8dbc4529de3cc2fc/bg4.jpg"><div class="t m0 x2 h5 y18 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">用适当的关键字检<span class="_ _5"></span>查用户的<span class="_ _3"> </span><span class="ff1 ls16">session<span class="_ _3"> </span></span>中是否有适当的类<span class="_ _5"></span>的<span class="_ _3"> </span><span class="ff1 ls8">bean<span class="_"> </span></span><span class="ls6">的一个实例。<span class="_ _4"></span><span class="ff1 ls7"> </span></span></span></div><div class="t m0 x2 h4 y19 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y1a ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">如果没有这样的<span class="_ _3"> </span><span class="ff1 ls16">session<span class="_ _3"> </span></span>范围的<span class="_ _3"> </span><span class="ff1 ls8">bean</span>,自动建立一个新的<span class="_ _3"> </span><span class="ff1 ls8">bean<span class="_ _3"> </span></span>并添加到用户<span class="_ _5"></span>的</span></div><div class="t m0 x2 h6 y6a ff1 fs1 fc1 sc0 ls2e ws0">session<span class="_ _3"> </span><span class="ff2 ls1">中。</span><span class="ls7"> </span></div><div class="t m0 x2 h4 y6b ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y6c ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">对每个名字对应于<span class="_ _3"> </span><span class="ff1 ls8">bean<span class="_ _3"> </span></span>中的一个属性的<span class="_ _5"></span>请求参数,调用相应<span class="_ _5"></span>的<span class="_ _3"> </span><span class="ff1 ls26">set<span class="_ _3"> </span></span>方法。这个操</span></div><div class="t m0 x2 h6 y6d ff2 fs1 fc1 sc0 ls1 ws0">作类似于当你以通配符<span class="_ _5"></span><span class="ff1 ls34">“*”<span class="_ _5"></span><span class="ff2 ls1">选择所有属性使用标准<span class="_ _5"></span>的<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>行为标<span class="_ _5"></span>记<span class="ff1"> <span class="_ _9"> </span></span><<span class="ff1 ls1b">jsp:setPropert<span class="_ _4"></span>y</span></span></span></div><div class="t m0 x2 h6 y6e ff2 fs1 fc1 sc0 ls1 ws0">><span class="ff1"> <span class="_ _9"> </span></span>。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y6f ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y70 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">更新的<span class="_ _3"> </span><span class="ff1 ls1a ws1a">ActionForm bean<span class="_ _3"> </span></span>在被调用时将被传<span class="_ _5"></span>递给<span class="_ _3"> </span><span class="ff1 ls1e">Act<span class="_ _4"></span>on<span class="_ _3"> </span></span>类的<span class="_ _3"> </span><span class="ff1 ls10">perf<span class="_ _4"></span>orm()<span class="_ _4"></span></span>方法,以使</span></div><div class="t m0 x2 h6 y71 ff2 fs1 fc1 sc0 ls1 ws0">这些值能够立即生效。<span class="ff1 ls29"> </span></div><div class="t m0 x2 h6 y72 ff2 fs1 fc1 sc0 ls1 ws0">当你在写你的<span class="_ _3"> </span><span class="ff1 ls12 ws1b">ActionForm beans<span class="_ _3"> </span></span>时,记住以下的<span class="_ _5"></span>原则:<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y73 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y74 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls1a">ActionForm <span class="_ _3"> </span><span class="ff2 ls1">接口本<span class="_ _5"></span>身不需要特殊的<span class="_ _5"></span>实现方法。<span class="_ _d"></span>它是用来标识这些特定的<span class="_ _3"> </span><span class="ff1 ls8">beans<span class="_ _3"> </span></span>在</span></span></div><div class="t m0 x2 h6 y75 ff2 fs1 fc1 sc0 ls1 ws0">整个体系结构中的作用<span class="_ _5"></span>。<span class="_ _d"></span>典型情况下,<span class="_ _d"></span>一个<span class="_ _3"> </span><span class="ff1 ls1a ws1c">ActionForm bean<span class="_"> </span></span>只包括属性的<span class="_ _3"> </span><span class="ff1 ls35">ge<span class="_ _5"></span>t<span class="_ _3"> </span><span class="ff2 ls6">方法和</span></span></div><div class="t m0 x2 h6 y76 ff1 fs1 fc1 sc0 ls26 ws0">set<span class="_"> </span><span class="ff2 ls1">方法<span class="_ _5"></span>,没有商业逻<span class="_ _5"></span>辑。<span class="ff1 ls7"> </span></span></div><div class="t m0 x2 h4 y77 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y78 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">通常在一个<span class="_ _3"> </span><span class="ff1 ls12 ws1b">ActionForm bean<span class="_ _3"> </span></span>中只有很少的<span class="_ _5"></span>输入验证逻辑。<span class="_ _5"></span>这样的<span class="_ _3"> </span><span class="ff1 ls8">beans<span class="_"> </span></span>存在的</span></div><div class="t m0 x2 h6 y79 ff2 fs1 fc1 sc0 ls1 ws0">主要理由是保存用户为<span class="_ _5"></span>相关的表单<span class="_ _5"></span>所输入的大部分<span class="_ _5"></span>近期值<span class="ff1 ls36 ws1d"> -- </span>甚至在错误被<span class="_ _5"></span>检测到时<span class="ff1"> </span></div><div class="t m0 x2 h6 y7a ff1 fs1 fc1 sc0 ls36 ws0">-- <span class="_ _9"> </span><span class="ff2 ls1">这样同样的页面可以<span class="_ _5"></span>被重建,<span class="_ _11"></span>伴随有一组出错信息,<span class="_ _11"></span>这样用户仅仅需要<span class="_ _5"></span>纠正错误的字</span></div><div class="t m0 x2 h6 y7b ff2 fs1 fc1 sc0 ls1 ws0">段。用户输入的验<span class="_ _5"></span>证应该在<span class="ff1 ls1a ws7"> Action </span>类<span class="_ _5"></span>中执行(如果是很简<span class="_ _5"></span>单的话<span class="ls6">),或者</span>在适当的商</div><div class="t m0 x2 h6 y7c ff2 fs1 fc1 sc0 ls1 ws0">业逻辑<span class="_ _3"> </span><span class="ff1 ls8">beans<span class="_"> </span></span>中执行<span class="_ _5"></span>。<span class="ff1 ls29"> </span></div><div class="t m0 x2 h4 y7d ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y7e ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">为每个表单中出现<span class="_ _5"></span>的字段定义<span class="_ _5"></span>一个属性<span class="_ _a"></span>(用相关的<span class="_ _3"> </span><span class="ff1 ls37">getX<span class="_ _4"></span>xx()<span class="_ _4"></span></span>和<span class="_ _3"> </span><span class="ff1 ls6">s<span class="_ _4"></span>etX<span class="_ _4"></span>xx(<span class="_ _4"></span>)</span>方法)<span class="_ _a"></span>。<span class="_ _5"></span>字</span></div><div class="t m0 x2 h6 y7f ff2 fs1 fc1 sc0 ls1 ws0">段名和属性名必须按照<span class="_ _9"> </span><span class="ff1 ls12">JavaBeans<span class="_ _3"> </span></span>的约定相匹配。<span class="_ _a"></span>例如,<span class="_ _c"></span>一个名为<span class="ff1 ls14 ws1e"> username </span>的输入</div><div class="t m0 x2 h6 y80 ff2 fs1 fc1 sc0 ls1 ws0">字段将引起<span class="ff1 ls33 ws1f"> se<span class="_ _5"></span>tUserna<span class="_ _5"></span>me() <span class="ff2 ls1 ws0">方<span class="_ _5"></span>法被调用。<span class="ff1 ls7"> </span></span></span></div><div class="t m0 x2 h4 y81 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y82 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">你应该注意一个<span class="ff1">“<span class="_ _5"></span><span class="ff2 ls6">表单<span class="ff1 ls1">”<span class="ff2">在这里讨论时的意义<span class="_ _5"></span>并不必须对应于<span class="_ _5"></span>用户界面中的一个<span class="_ _5"></span>单独</span></span></span></span></span></div><div class="t m0 x2 h6 y83 ff2 fs1 fc1 sc0 ls1 ws0">的<span class="_ _3"> </span><span class="ff1 ls1e">JSP<span class="_"> </span></span>页面。<span class="_ _c"></span>在很多应<span class="_ _5"></span>用程序中一个<span class="ff1">“</span>表单<span class="_ _5"></span><span class="ff1">”<span class="_ _a"></span><span class="ff2">(从<span class="_ _5"></span>用户的观点)<span class="_ _c"></span>延伸至多个页面也是<span class="_ _5"></span>很平</span></span></div><div class="t m0 x2 h6 y84 ff2 fs1 fc1 sc0 ls1 ws0">常的。<span class="_ _15"></span>想想看,<span class="_ _15"></span>例如,<span class="_ _15"></span>通常<span class="_ _5"></span>在安装新的应用<span class="_ _5"></span>程序时使用的导航<span class="_ _5"></span>安装程序的用<span class="_ _5"></span>户界面。<span class="_ _15"></span><span class="ff1 ls2a">Struts</span></div><div class="t m0 x2 h6 y85 ff2 fs1 fc1 sc0 ls1 ws0">鼓励你定义一个包含所<span class="_ _5"></span>有字段属性<span class="_ _5"></span>的单独的<span class="_ _3"> </span><span class="ff1 ls1a ws1c">ActionForm bean</span>。<span class="_ _c"></span>不管字段实际上是显<span class="_ _5"></span>示</div><div class="t m0 x2 h6 y86 ff2 fs1 fc1 sc0 ls1 ws0">在哪个页面上。同样的<span class="_ _5"></span>,同一表单<span class="_ _5"></span>的不同的页面应<span class="_ _5"></span>该提交到相同的<span class="_ _3"> </span><span class="ff1 ls15">Action<span class="_ _3"> </span></span>类。如果你</div><div class="t m0 x2 h6 y87 ff2 fs1 fc1 sc0 ls1 ws0">遵照这个建议,<span class="_ _d"></span>在大<span class="_ _5"></span>多数情况下,<span class="_ _d"></span>页面<span class="_ _5"></span>设计者可以重新组织<span class="_ _5"></span>不同页面中的<span class="_ _5"></span>字段而不需要</div><div class="t m0 x2 h6 y88 ff2 fs1 fc1 sc0 ls1 ws0">改变处理逻辑。<span class="ff1 ls7"> </span></div><div class="t m0 x2 h4 y89 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y8a ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff1 ls8">2.4 <span class="_ _9"> </span><span class="ff2 ls1">系统状态<span class="_ _3"> </span></span><span class="ls12">Beans </span></span></div><div class="t m0 x2 h4 y8b ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y8c ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">系统的实际状态通<span class="_ _5"></span>常表示为一<span class="_ _5"></span>组一个或多个的<span class="_ _3"> </span><span class="ff1 ls1a">JavaBeans<span class="_ _3"> </span></span>类,其属性定义当前状</span></div><div class="t m0 x2 h6 y8d ff2 fs1 fc1 sc0 ls1 ws0">态。<span class="_ _b"></span>例如,<span class="_ _d"></span>一个购物车<span class="_ _5"></span>系统包括一个表示<span class="_ _5"></span>购物车的<span class="_ _3"> </span><span class="ff1 ls8">bean</span><span class="ls38">,这<span class="_ _16"></span>个<span class="_ _17"> </span><span class="ff1 ls8">bean<span class="_ _3"> </span></span></span>为每个单独的购物</div><div class="t m0 x2 h6 y8e ff2 fs1 fc1 sc0 ls1 ws0">者维护,这个<span class="_ _3"> </span><span class="ff1 ls8">bean<span class="_ _3"> </span></span>中包括(在其它事物<span class="_ _5"></span>之中)一组购物者<span class="_ _5"></span>当前选择购买<span class="_ _5"></span>的项目。分别</div><div class="t m0 x2 h6 y8f ff2 fs1 fc1 sc0 ls1 ws0">地,<span class="_ _a"></span>系统也包括保存用户<span class="_ _5"></span>信息<span class="_ _a"></span>(包括他们的<span class="_ _5"></span>信用卡和送货地址)<span class="_ _c"></span>、<span class="_ _a"></span>可获得项目的目录和</div><div class="t m0 x2 h6 y90 ff2 fs1 fc1 sc0 ls1 ws0">它们当前库存水平的不<span class="_ _5"></span>同的<span class="_ _3"> </span><span class="ff1 ls8">beans</span>。<span class="ff1"> </span></div><div class="t m0 x2 h4 y91 ff1 fs1 fc1 sc0 ls1 ws0"> </div><div class="t m0 x2 h5 y92 ff4 fs1 fc1 sc0 ls3 ws0"> <span class="ff2 ls1">对于小规模的系统<span class="_ _5"></span>,<span class="_ _d"></span>或者对于不需要长时间<span class="_ _5"></span>保存的状态<span class="_ _5"></span>信息,<span class="_ _d"></span>一组系统状态<span class="_ _3"> </span><span class="ff1 ls8">beans</span></span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>