📄 struts,mvc 的一种开放源码实现.htm
字号:
<LI><B>HTML 和 Java 强耦合在一起</B> <BR>JSP 文件的编写者必须既是网页设计者,又是 Java
开发者。其结果通常要么是很糟的 Java 代码,要么是难看的网页,有时甚至 Java 代码和网页都很糟。
<LI><B>Java 和 JavaScript 的不足</B> <BR>随着网页逐渐变大,很容易想到实现一些
JavaScript。当网页中出现 JavaScript 时,这种脚本就可能与 Java
代码产生混淆。可能产生混淆的一个例子是使用客户端的 JavaScript 来验证 <CODE>email</CODE> 域。
<BR>
<LI><B>内嵌的流程逻辑</B> <BR>要理解应用程序的整个流程,您必须浏览所有网页。试想一下拥有 100
个网页的网站的错综复杂的逻辑。
<LI><B>调试困难</B> <BR>除了很糟的外观之外,HTML 标记、Java 代码和 JavaScript
代码都集中在一个网页中还使调试变得相当困难。
<LI><B>强耦合</B> <BR>更改业务逻辑或数据可能牵涉相关的每个网页。
<LI><B>美学</B> <BR>在很大的网页中,这编码样式看起来杂乱无章。我过去进行 Microsoft ASP
开发时,我经常看到有 1000 行的网页。即使有彩色语法显示,阅读和理解这些代码仍然比较困难。 </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=3><SPAN class=atitle>请别在我的 HTML 中加入太多的 Java
代码</SPAN></A></P>
<P>在清单 1 中,不是 Java 代码中有大量的 HTML,而是在 HTML 文件中有大量的 Java
代码。从这个观点来看,除了允许网页设计人员编写 Java 代码之外,我实际上没做什么。但是,我们并不是一无所有;在 JSP 1.1
中,我们获得一种称为“标记”的新特性。</P>
<P>JSP 标记只是将代码从 JSP 文件中抽取出来的一种方式。有人将 JSP 标记看作是 JSP
文件的宏,其中用于这个标记的代码包含在 servlet 中。(宏的观点在很大程度上是正确的。)出于同样的原因,我不希望在 Java
代码中看到 HTML 标记,我也不希望在 JSP 文件中看到 Java 代码。JSP 技术的整个出发点就是允许网页设计人员创建
servlet,而不必纠缠于 Java 代码。标记允许 Java 程序员将 Java 代码伪装成 HTML 来扩展 JSP 文件。图 3
显示了从 JSP 网页中抽取代码并将它们放入 JSP 标记中的一般概念。</P><BR><A name=N10150><B>图 3.
JSP 标记</B></A><BR><IMG height=70 alt="JSP tag breakdown"
src="Struts,MVC 的一种开放源码实现.files/jsp_tag_breakdown.gif" width=220>
<BR>
<P>清单 2 是用来说明 Struts 标记的功能的一个例子。在清单 2 中,正常的 HTML
<CODE><form></CODE> 标记被用 Struts <CODE><form:form></CODE>
标记替换。清单 3 显示了浏览器接收到的结果 HTML。浏览器获得 HTML <CODE><form></CODE>
标记,但带有附加代码,如 JavaScript。附加的 JavaScript 激活 <CODE>email</CODE>
地址域。服务器端的 <CODE><form:form></CODE> 标记代码创建适当的 HTML,并使网页设计人员不再接触
JavaScript。 </P><BR><A name=N10174><B>清单 2. Struts 的 form
标记</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode><form:form action="join.do" focus="email" >
<form:text property="email" size="30" maxlength="30"/>
<form:submit property="submit" value="Submit"/>
</form:form>
</PRE></TD></TR></TBODY></TABLE><BR><BR><BR><A name=N10180><B>清单 3.
发送给浏览器的结果 HTML</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode><form name="joinForm" method="POST" action="join.do;jsessionid=ndj71hjo01">
<input type="text" name="email" maxlength="30" size="30" value="">
<input type="submit" name="submit" value="Submit">
</form>
<script language="JavaScript">
<!--
document.joinForm.email.focus()
// -->
</script>
</PRE></TD></TR></TBODY></TABLE><BR>
<P><A name=N1018A><SPAN class=smalltitle>有关 JSP
标记的注意事项:</SPAN></A></P>
<UL>
<LI>JSP 标记需要一个运行 JSP 1.1 或更高版本的容器。
<LI>JSP 标记在服务器上运行,而不像 HTML 标记那样由客户机解释。
<LI>JSP 标记提供了适当的代码重用机制。
<LI>可以使用一种称为 <CODE>include</CODE> 的 JSP 机制将 HTML 和 JavaScript
添加到网页中。但是,开发人员常常会创建巨大的 JavaScript 库文件,这些库文件被包含在 JSP 文件中。结果返回给客户机的
HTML 网页要比必需的 HMTL 网页大得多。 <CODE>include</CODE>
的正确用法是仅将它用于生成诸如页眉和页脚这类内容的 HTML 代码段。
<LI>通过抽取出 Java 代码,JSP 标记使开发角色更加专业化。 </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=4><SPAN class=atitle>模型-视图-控制器 (MVC)</SPAN></A></P>
<P>JSP 标记只解决了部分问题。我们还得处理验证、流程控制和更新应用程序的状态等问题。这正是 MVC 发挥作用的地方。MVC
通过将问题分为三个类别来帮助解决单一模块方法所遇到的某些问题:</P>
<UL>
<LI><B>Model(模型)</B>
<BR>模型包含应用程序的核心功能。模型封装了应用程序的状态。有时它包含的唯一功能就是状态。它对视图或控制器一无所知。
<LI><B>View(视图)</B> <BR>视图提供模型的表示。它是应用程序的
<I>外观</I>。视图可以访问模型的读方法,但不能访问写方法。此外,它对控制器一无所知。当更改模型时,视图应得到通知。 <BR>
<LI><B>Controller(控制器)</B> <BR>控制器对用户的输入作出反应。它创建并设置模型。
</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=5><SPAN class=atitle>MVC Model 2</SPAN></A></P>
<P>Web 向软件开发人员提出了一些特有的挑战,最明显的就是客户机和服务器的无状态连接。这种无状态行为使得模型很难将更改通知视图。在
Web 上,为了发现对应用程序状态的修改,浏览器必须重新查询服务器。</P>
<P>另一个重大变化是实现视图所用的技术与实现模型或控制器的技术不同。当然,我们可以使用 Java(或者 PERL、C/C++
或别的语言)代码生成 HTML。这种方法有几个缺点:</P>
<UL>
<LI>Java 程序员应该开发服务,而不是 HTML。
<LI>更改布局时需要更改代码。
<LI>服务的用户应该能够创建网页来满足它们的特定需要。
<LI>网页设计人员不能直接参与网页开发。
<LI>嵌在代码中的 HTML 很难看。 </LI></UL>
<P>对于 Web,需要修改标准的 MVC 形式。图 4 显示了 MVC 的 Web 改写版,通常也称为 MVC Model 2 或
MVC 2。</P><BR><A name=N101F6><B>图 4. MVC Model 2</B></A><BR><IMG
height=170 alt="MVC Model 2"
src="Struts,MVC 的一种开放源码实现.files/mvc2.gif" width=410> <BR><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=6><SPAN class=atitle>Struts,MVC 2 的一种实现</SPAN></A></P>
<P>Struts 是一组相互协作的类、servlet 和 JSP 标记,它们组成一个可重用的 MVC 2 设计。这个定义表示
Struts 是一个框架,而不是一个库,但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类。图 5 显示了
Struts 的一个概览。</P><BR><A name=N1020E><B>图 5. Struts
概览</B></A><BR><IMG height=170 alt="Struts overview"
src="Struts,MVC 的一种开放源码实现.files/mvc2_struts.gif" width=410> <BR>
<P><A name=N1021B><SPAN class=smalltitle>Struts 概览</SPAN></A></P>
<UL>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -