⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 struts,mvc 的一种开放源码实现.htm

📁 介绍了MVC的很多内容(基于MVC模式Struts框架研究与应用详解—JSP教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
              <LI><B>Client browser(客户浏览器)</B> <BR>来自客户浏览器的每个 HTTP 请求创建一个事件。Web 
              容器将用一个 HTTP 响应作出响应。 
              <LI><B>Controller(控制器)</B> <BR>控制器接收来自浏览器的请求,并决定将这个请求发往何处。就 Struts 
              而言,控制器是以 servlet 实现的一个命令设计模式。 <CODE>struts-config.xml</CODE> 
              文件配置控制器。 <BR>
              <LI><B>业务逻辑</B> <BR>业务逻辑更新模型的状态,并帮助控制应用程序的流程。就 Struts 
              而言,这是通过作为实际业务逻辑“瘦”包装的 <CODE>Action</CODE> 类完成的。 <BR>
              <LI><B>Model(模型)的状态</B> <BR>模型表示应用程序的状态。业务对象更新应用程序的状态。ActionForm 
              bean 在会话级或请求级表示模型的状态,而不是在持久级。JSP 文件使用 JSP 标记读取来自 ActionForm bean 
              的信息。 
              <LI><B>View(视图)</B> <BR>视图就是一个 JSP 文件。其中没有流程逻辑,没有业务逻辑,也没有模型信息 -- 
              只有标记。标记是使 Struts 有别于其他框架(如 Velocity)的因素之一。 </LI></UL><BR>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD><IMG height=1 alt="" 
                  src="Struts,MVC 的一种开放源码实现.files/blue_rule.gif" 
                  width="100%"><BR><IMG height=6 alt="" 
                  src="Struts,MVC 的一种开放源码实现.files/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="Struts,MVC 的一种开放源码实现.files/c.gif" width="100%"><BR>
                  <TABLE cellSpacing=0 cellPadding=0 border=0>
                    <TBODY>
                    <TR>
                      <TD vAlign=center><IMG height=16 alt="" 
                        src="Struts,MVC 的一种开放源码实现.files/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-struts/#main"><B>回页首</B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
            <P><A name=7><SPAN class=atitle>详细分析 Struts</SPAN></A></P>
            <P>图 6 显示的是 <CODE>org.apache.struts.action</CODE> 包的一个最简 UML 图。图 6 
            显示了 <CODE>ActionServlet</CODE> (Controller)、 <CODE>ActionForm</CODE> 
            (Form State) 和 <CODE>Action</CODE> (Model Wrapper) 之间的最简关系。 
            </P><BR><A name=N10273><B>图 6. Command (ActionServlet) 与 Model 
            (Action &amp; ActionForm) 之间的关系的 UML 图</B></A><BR><IMG height=228 
            alt="Relationship of ActionServlet to Action and ActionForm" 
            src="Struts,MVC 的一种开放源码实现.files/action_servlet.jpg" width=600> <BR>
            <P><A name=N10280><SPAN class=smalltitle>ActionServlet 类 
            </SPAN></A></P>
            <P>您还记得函数映射的日子吗?在那时,您会将某些输入事件映射到一个函数指针上。如果您对此比较熟悉,您会将配置信息放入一个文件,并在运行时加载这个文件。函数指针数组曾经是用 
            C 语言进行结构化编程的很好方法。</P>
            <P>现在好多了,我们有了 Java 技术、XML、J2EE,等等。Struts 的控制器是将事件(事件通常是 HTTP 
            post)映射到类的一个 servlet。正如您所料 -- 
控制器使用配置文件以使您不必对这些值进行硬编码。时代变了,但方法依旧。</P>
            <P><CODE>ActionServlet</CODE> 是该 MVC 实现的 Command 部分,它是这一框架的核心。 
            <CODE>ActionServlet</CODE> (Command) 创建并使用 <CODE>Action</CODE> 、 
            <CODE>ActionForm</CODE> 和 <CODE>ActionForward</CODE> 。如前所述, 
            <CODE>struts-config.xml</CODE> 文件配置该 Command。在创建 Web 项目时,您将扩展 
            <CODE>Action</CODE> 和 <CODE>ActionForm</CODE> 来解决特定的问题。文件 
            <CODE>struts-config.xml</CODE> 指示 <CODE>ActionServlet</CODE> 
            如何使用这些扩展的类。这种方法有几个优点: </P>
            <UL>
              <LI>应用程序的整个逻辑流程都存储在一个分层的文本文件中。这使得人们更容易查看和理解它,尤其是对于大型应用程序而言。 
              <LI>网页设计人员不必费力地阅读 Java 代码来理解应用程序的流程。 
              <LI>Java 开发人员也不必在更改流程以后重新编译代码。 </LI></UL>
            <P>可以通过扩展 <CODE>ActionServlet</CODE> 来添加 Command 功能。 </P>
            <P><A name=N102CE><SPAN class=smalltitle>ActionForm 类 
</SPAN></A></P>
            <P><CODE>ActionForm</CODE> 维护 Web 应用程序的会话状态。 <CODE>ActionForm</CODE> 
            是一个抽象类,必须为每个输入表单模型创建该类的子类。当我说 <I>输入表单模型</I> 时,是指 
            <CODE>ActionForm</CODE> 表示的是由 HTML 表单设置或更新的一般意义上的数据。例如,您可能有一个由 HTML 
            表单设置的 <CODE>UserActionForm</CODE> 。Struts 框架将执行以下操作: </P>
            <UL>
              <LI>检查 <CODE>UserActionForm</CODE> 是否存在;如果不存在,它将创建该类的一个实例。 <BR>
              <LI>Struts 将使用 HttpServletRequest 中相应的域设置 
              <CODE>UserActionForm</CODE> 的状态。没有太多讨厌的 
              <CODE>request.getParameter()</CODE> 调用。例如,Struts 框架将从请求流中提取 
              <CODE>fname</CODE> ,并调用 <CODE>UserActionForm.setFname()</CODE> 。 
              <BR>
              <LI>Struts 框架在将 <CODE>UserActionForm</CODE> 传递给业务包装 
              <CODE>UserAction</CODE> 之前将更新它的状态。 <BR>
              <LI>在将它传递给 <CODE>Action</CODE> 类之前,Struts 还会对 
              <CODE>UserActionForm</CODE> 调用 <CODE>validation()</CODE> 
              方法进行表单状态验证。 <B>注:</B> 这并不总是明智之举。别的网页或业务可能使用 
              <CODE>UserActionForm</CODE> ,在这些地方,验证可能有所不同。在 
              <CODE>UserAction</CODE> 类中进行状态验证可能更好。 <BR>
              <LI>可在会话级维护 <CODE>UserActionForm</CODE> 。 </LI></UL>
            <P>注:</P>
            <UL>
              <LI><CODE>struts-config.xml</CODE> 文件控制 HTML 表单请求与 
              <CODE>ActionForm</CODE> 之间的映射关系。 
              <LI>可将多个请求映射到 <CODE>UserActionForm</CODE> 。 
              <LI><CODE>UserActionForm</CODE> 可跨多页进行映射,以执行诸如向导之类的操作。 </LI></UL>
            <P><A name=N1035E><SPAN class=smalltitle>Action 类 </SPAN></A></P>
            <P><CODE>Action</CODE> 类是业务逻辑的一个包装。 <CODE>Action</CODE> 类的用途是将 
            <CODE>HttpServletRequest</CODE> 转换为业务逻辑。要使用 <CODE>Action</CODE> 
            ,请创建它的子类并覆盖 <CODE>process()</CODE> 方法。 </P>
            <P><CODE>ActionServlet</CODE> (Command) 使用 <CODE>perform()</CODE> 
            方法将参数化的类传递给 <CODE>ActionForm</CODE> 。仍然没有太多讨厌的 
            <CODE>request.getParameter()</CODE> 调用。当事件进展到这一步时,输入表单数据(或 HTML 
            表单数据)已被从请求流中提取出来并转移到 <CODE>ActionForm</CODE> 类中。 </P>
            <P>注:扩展 <CODE>Action</CODE> 类时请注意简洁。 <CODE>Action</CODE> 
            类应该控制应用程序的流程,而不应该控制应用程序的逻辑。通过将业务逻辑放在单独的包或 EJB 中,我们就可以提供更大的灵活性和可重用性。 
            </P>
            <P>考虑 <CODE>Action</CODE> 类的另一种方式是 Adapter 设计模式。 <CODE>Action</CODE> 
            的用途是“将类的接口转换为客户机所需的另一个接口。Adapter 使类能够协同工作,如果没有 
            Adapter,则这些类会因为不兼容的接口而无法协同工作。”(摘自 Gof 所著的 <I>Design Patterns - 
            Elements of Reusable OO Software</I> )。本例中的客户机是 
            <CODE>ActionServlet</CODE> ,它对我们的具体业务类接口一无所知。因此,Struts 
            提供了它能够理解的一个业务接口,即 <CODE>Action</CODE> 。通过扩展 <CODE>Action</CODE> 
            ,我们使得我们的业务接口与 Struts 业务接口保持兼容。(一个有趣的发现是, <CODE>Action</CODE> 
            是类而不是接口)。 <CODE>Action</CODE> 开始为一个接口,后来却变成了一个类。真是金无足赤。) </P>
            <P><A name=N103C3><SPAN class=smalltitle>Error 类 </SPAN></A></P>
            <P>UML 图(图 6)还包括 <CODE>ActionError</CODE> 和 
            <CODE>ActionErrors</CODE> 。 <CODE>ActionError</CODE> 封装了单个错误消息。 
            <CODE>ActionErrors</CODE> 是 <CODE>ActionError</CODE> 类的容器,View 
            可以使用标记访问这些类。 <CODE>ActionError</CODE> 是 Struts 保持错误列表的方式。 </P><BR><A 
            name=N103EA><B>图 7. Command (ActionServlet) 与 Model (Action) 之间的关系的 
            UML 图</B></A><BR><IMG height=261 
            alt="Relationship of ActionServlet to Action" 
            src="Struts,MVC 的一种开放源码实现.files/action_mapping.jpg" width=525> <BR>
            <P><A name=N103F7><SPAN class=smalltitle>ActionMapping 类 
            </SPAN></A></P>
            <P>输入事件通常是在 HTTP 请求表单中发生的,servlet 容器将 HTTP 请求转换为 
            <CODE>HttpServletRequest</CODE> 。控制器查看输入事件并将请求分派给某个 
            <CODE>Action</CODE> 类。 <CODE>struts-config.xml</CODE> 确定 Controller 
            调用哪个 <CODE>Action</CODE> 类。 <CODE>struts-config.xml</CODE> 
            配置信息被转换为一组 <CODE>ActionMapping</CODE> ,而后者又被放入 
            <CODE>ActionMappings</CODE> 容器中。(您可能尚未注意到这一点,以 <I>s</I>结尾的类就是容器) 
</P>
            <P><CODE>ActionMapping</CODE> 包含有关特定事件如何映射到特定 <CODE>Action</CODE> 
            的信息。 <CODE>ActionServlet</CODE> (Command) 通过 <CODE>perform()</CODE> 
            方法将 <CODE>ActionMapping</CODE> 传递给 <CODE>Action</CODE> 类。这样就使 
            <CODE>Action</CODE> 可访问用于控制流程的信息。 </P>
            <P><A name=N10442><SPAN class=smalltitle>ActionMappings 
            </SPAN></A></P>
            <P><CODE>ActionMappings</CODE> 是 <CODE>ActionMapping</CODE> 对象的一个集合。 
            </P><BR>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD><IMG height=1 alt="" 
                  src="Struts,MVC 的一种开放源码实现.files/blue_rule.gif" 
                  width="100%"><BR><IMG height=6 alt="" 
                  src="Struts,MVC 的一种开放源码实现.files/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="Struts,MVC 的一种开放源码实现.files/c.gif" width="100%"><BR>
                  <TABLE cellSpacing=0 cellPadding=0 border=0>
                    <TBODY>
                    <TR>
                      <TD vAlign=center><IMG height=16 alt="" 
                        src="Struts,MVC 的一种开放源码实现.files/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-struts/#main"><B>回页首</B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
            <P><A name=8><SPAN class=atitle>再访邮件列表样例</SPAN></A></P>
            <P>下面我们看一下 Struts 是如何解决困扰 <CODE>join.jsp</CODE> 
            的这些问题的。改写后的方案由两个项目组成。第一个项目包含应用程序的逻辑部分,这个应用程序是独立于 Web 应用程序的。这个独立层可能是用 
            EJB 技术实现的公共服务层。为了便于说明,我使用 Ant 构建进程创建了一个称为 <CODE>business</CODE> 
            的包。有几个原因促使我们使用独立的业务层: </P>
            <UL>
              <LI><B>划分责任</B> <BR>单独的包使管理人员能够在开发小组内委派责任。这也有助于提高开发人员的责任心。 
              <LI><B>通用件</B> 
              <BR>我们设想开发人员将这个包看作一个商业软件。将它放在另外的包中使它更像通用件。这个包可能是通用件,也可能是由组织内部的另一个小组开发的。 

              <LI><B>避免不必要的构建和单元测试。</B> <BR>分开的构建进程有助于避免不必要的构建和单元测试。 
              <LI><B>使用接口开发</B> 
              <BR>在进行开发和避免不必要的耦合时,它有助于从接口的观点来思考问题。这是极重要的一个方面。当开发您自己的业务包时,这些业务类不应该关心到底是 
              Web 应用程序执行调用,还是独立应用程序执行调用。因此,应该避免在业务逻辑层使用对 servlet API 或 Struts 
              API 调用的任何引用。 
              <LI><B>稳定性</B> 
              <BR>并不是每个组织都每天、每周甚至每月进行检修。因此,在进行开发时,稳定的接口点是重要的。不能因为业务包处于变迁阶段就认为 
              Web 项目也应该处于变迁阶段。 </LI></UL>
            <P><A name=N10493><SPAN class=smalltitle>业务构建注释</SPAN></A></P>
            <P>我用 Ant 构建项目,并用 JUnit 运行单元测试。business.zip 包含构建业务项目所需的一切,当然 Ant 和 
            JUnit 除外。这个包脚本将构建类,运行单元测试,创建 Java 文档和 jar 文件,最后将所有这些内容压缩到一个 zip 
            文件中发送给客户。只要对 <CODE>build.xml</CODE> 作一些修改,您就可以将它部署到其他平台上。 
            <CODE>Business.jar</CODE> 位于 Web 的下载部分,因此,您并非必须下载并构建这个业务包。 </P>
            <P><A name=N104A4><SPAN class=smalltitle>Web 项目</SPAN></A></P>
            <P>第二个项目是用 Struts 开发的一个 Web 应用程序。您将需要一个符合 JSP 1.1 和 Servlet 2.2 
            规范的容器。最快的入门方法是下载并安装 Tomcat 3.2(请参阅 <A 
            href="http://www.ibm.com/developerworks/cn/java/j-struts/#resources">参考资源</A> 
            )。直到有 Struts 的 1.0 发行版之前,我建议您从 Jakarta 项目获得最新的版本(请参阅 <A 
            href="http

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -