﻿<?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-sakrua`s java 世界 -文章分类-struts</title><link>http://www.blogjava.net/sakrua/category/27208.html</link><description>struts hibernate spring  web2.0 ajax</description><language>zh-cn</language><lastBuildDate>Mon, 19 Nov 2007 04:56:49 GMT</lastBuildDate><pubDate>Mon, 19 Nov 2007 04:56:49 GMT</pubDate><ttl>60</ttl><item><title>跟菜鸟学Struts(4)-action</title><link>http://www.blogjava.net/sakrua/articles/161385.html</link><dc:creator>风の使者</dc:creator><author>风の使者</author><pubDate>Sun, 18 Nov 2007 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/sakrua/articles/161385.html</guid><wfw:comment>http://www.blogjava.net/sakrua/comments/161385.html</wfw:comment><comments>http://www.blogjava.net/sakrua/articles/161385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sakrua/comments/commentRss/161385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sakrua/services/trackbacks/161385.html</trackback:ping><description><![CDATA[在以前的例子中，我们每一个action都只有一个动作，例如execute函数，那么有没有其它的方法让一个Action有多个动作昵，
<p>当然那些设计者也不是SB，那么我们看看API文档，在包org.apache.struts.actions中我们会发现有很多的Action
<blockquote>
<p><a href="http://w-inds8.spaces.live.com/org/apache/struts/actions/package-summary.html">org.apache.struts.actions</a>
<p>Interfaces<br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/DownloadAction.StreamInfo.html"><em>DownloadAction.StreamInfo</em></a>
<p>Classes<br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/ActionDispatcher.html">ActionDispatcher</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/BaseAction.html">BaseAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/DispatchAction.html">DispatchAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/DownloadAction.html">DownloadAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/DownloadAction.FileStreamInfo.html">DownloadAction.FileStreamInfo</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/DownloadAction.ResourceStreamInfo.html">DownloadAction.ResourceStreamInfo</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/EventActionDispatcher.html">EventActionDispatcher</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/EventDispatchAction.html">EventDispatchAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/ForwardAction.html">ForwardAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/IncludeAction.html">IncludeAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/LocaleAction.html">LocaleAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/LookupDispatchAction.html">LookupDispatchAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/MappingDispatchAction.html">MappingDispatchAction</a><br />
<a href="http://w-inds8.spaces.live.com/mmm2007-10-25_18.59/SwitchAction.html">SwitchAction</a></p>
</blockquote>
<p>我们从字面的意思看上去，好像第三个有的像，那么我们来看看 <strong>org.apache.struts.actions.DispatchAction</strong>
<p>来看看下面的英文注解：
<blockquote>
<p>An abstract <strong>Action</strong> that dispatches to a public method that is named by the request parameter whose name is specified by the <code>parameter</code> property of the corresponding ActionMapping. This Action is useful for developers who prefer to combine many similar actions into a single Action class, in order to simplify their application design.
<p>To configure the use of this action in your <code>struts-config.xml</code> file, create an entry like this:
<p><code>&lt;action path="/saveSubscription" type="org.apache.struts.actions.DispatchAction" name="subscriptionForm" scope="request" input="/subscription.jsp" parameter="method"/&gt; </code>
<p>which will use the value of the request parameter named "method" to pick the appropriate "execute" method, which must have the same signature (other than method name) of the standard Action.execute method. For example, you might have the following three methods in the same action:
<ul>
    <li>public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
    <li>public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
    <li>public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception </li>
</ul>
<p>and call one of the methods with a URL like this:
<p><code>http://localhost:8080/myapp/saveSubscription.do?method=update </code>
<p><strong>NOTE</strong> - All of the other mapping characteristics of this action must be shared by the various handlers. This places some constraints over what types of handlers may reasonably be packaged into the same <code>DispatchAction</code> subclass.
<p><strong>NOTE</strong> - If the value of the request parameter is empty, a method named <code>unspecified</code> is called. The default action is to throw an exception. If the request was cancelled (a <code>html:cancel</code> button was pressed), the custom handler <code>cancelled</code> will be used instead. You can also override the <code>getMethodName</code> method to override the action's default handler selection.
<p>从第一段可以知道，这就是我们所要找的那个它了，
<p><code>&lt;action path="/saveSubscription" type="org.apache.struts.actions.DispatchAction" name="subscriptionForm" scope="request" input="/subscription.jsp" parameter="method"/&gt; </code>
<p><code>还有这里有一个配置的例子 ，它的意思就是说，这个Action提供了一个方法让我们跟椐parameter="method" （这里是method）让我们调用Action中的不同的方法，当然这些方法跟我们的execute是一样的只是名字不一样。例如下面：</code>
<p>public ActionForward execute(ActionMapping arg0, ActionForm arg1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {<br />
&nbsp;&nbsp;&nbsp; return super.execute(arg0, arg1, arg2, arg3);<br />
}<br />
//跟上面对比一下，是不是一样呢<br />
public ActionForward sayHello(ActionMapping arg0, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response) throws Exception {<br />
&nbsp;&nbsp;&nbsp; response.getWriter().write("Hello ! DidpatchAction");<br />
&nbsp;&nbsp;&nbsp; response.flushBuffer();<br />
&nbsp;&nbsp;&nbsp; return null;<br />
}
<p>public ActionForward closeWindow(ActionMapping arg0, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response) throws Exception {<br />
&nbsp;&nbsp;&nbsp; String str ="IE Will Close&lt;script language=\"javascript\"&gt;window.close();&lt;/script&gt;";<br />
&nbsp;&nbsp;&nbsp; response.getWriter().write(str);<br />
&nbsp;&nbsp;&nbsp; response.flushBuffer();<br />
&nbsp;&nbsp;&nbsp; return null;
<p>好下面我们在以前的例子的基础上完成这次的例子
<p>新建一个struts-config-action.xml文件，下面为文件的内容：
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>&lt;struts-config&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/testAction" validate="false" parameter="method"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="org.action.struts.DidpatchActionTest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
&lt;/struts-config&gt;
<p>是不是看不习惯呢，没有Action的也没有forward。不过现在我告诉你这是完全可以的
<p>我们把这个配置文件加到web.xml文件中
<p>&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml,/WEB-INF/struts-config-file.xml,/WEB-INF/struts-config-action.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqGHs69xr7T7fTAUCXOdwmvI0fFxo6MiCWcdXntYMXh3Vc0pf9taQp90UrvHhCFMdkE?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="58" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqGMTIv5FN8rkvKfOrbF2zyvQLzw3ap9nyNCKhhtFBgx12My6rCXkpCtBcAfyFMPtPI?PARTNER=WRITER" width="196" border="0" /></a>
<p>以这种目录结构建一个index.jsp文件
<p>下面为jsp的内容：
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'>http://struts.apache.org/tags-bean"</a> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'>http://struts.apache.org/tags-html"</a> prefix="html" %&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;Action Test&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;a href="../testAction.do?method=sayHello"&gt;sayHello&lt;/a&gt;<br />
&lt;a href="../testAction.do?method=closeWindow"&gt;closeWindow&lt;/a&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
<p>没有什么好说的。
<p>下面我们建一个Action，当然基类是<strong>org.apache.struts.actions.DispatchAction</strong>
<p>下面为Action的内容：
<p>package org.action.struts;
<p>import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import org.apache.struts.actions.DispatchAction;
<p>public class DidpatchActionTest extends DispatchAction {
<p>&nbsp;&nbsp;&nbsp; public ActionForward execute(ActionMapping arg0, ActionForm arg1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return super.execute(arg0, arg1, arg2, arg3);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //跟上面对比一下，是不是一样呢<br />
&nbsp;&nbsp;&nbsp; public ActionForward sayHello(ActionMapping arg0, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.getWriter().write("&lt;script language=\"javascript\"&gt;alert('Hello ! DidpatchAction');&lt;/script&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.flushBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public ActionForward closeWindow(ActionMapping arg0, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str ="IE Will Close&lt;script language=\"javascript\"&gt;window.close();&lt;/script&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.getWriter().write(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.flushBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; }
<p>}
<p>我们用response对象来输出页面的内容（这个与jsp的response对象是一样的);
<p>下面为运行的结果
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqHVv-8bfI9EIsPe0VFFeinD1UnVJjdpY7HKzxVf21cNSlrjFfaRRIVkgqzcXcdyoqE?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="219" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqF7M0yJzI2lJdPrZFovSQ2C7LYQ2XJXqvlql1DxZ_4cH8k6OWyt4vyL191lkXihGro?PARTNER=WRITER" width="211" border="0" /></a>
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqFBj_xpQYul4rFMgfq7lhkGpGqmlGgZQiiFH8Y9Wk4yotJb2m69sBpamqJG_X7wYU8?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="254" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqH2b0-7byUSQ8NrACzvcsbH5g-ln07HL9TBEV6-deTH9u4zIRlKMRtSwbGewT46cm4?PARTNER=WRITER" width="375" border="0" /></a>
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqEg5RdQ56vPdgTVymt2uzi79IDsFluGzUGx8xm2UAMwiUU3_nezfrCaO2gMhaX2Cwo?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="264" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqE-RkCM1zKTlxuFXOq9_gxKy-cresNnv14SEmcHHOsr_rAAMnxMdbgwiiNFfeRW0Ig?PARTNER=WRITER" width="465" border="0" /></a>
<p>大家看到了没有，<a title="http://localhost:8080/Struts_HelloWorld/testAction.do?method=closeWindow" href="http://localhost:8080/Struts_HelloWorld/testAction.do?method=closeWindow">http://localhost:8080/Struts_HelloWorld/testAction.do?method=closeWindow</a>
<p>它会跟椐method中的参数来调用不同的函数</p>
</blockquote>
<div class="footerLinks"><nobr>18:51</nobr>&nbsp;| <nobr><a id="blogAddComment0" href="http://w-inds8.spaces.live.com/blog/cns!4D28F2F74B328142!429.entry#post" bvitemtype="post">添加评论</a></nobr>&nbsp;| <nobr><a id="blogSendMessage0" title="给作者发送消息" href="http://spaces.live.com/api.aspx?wx_action=sendMessage&amp;wxp_toCid=5559960883921322306&amp;wx_ru=http%3a%2f%2fw-inds8.spaces.live.com%2fdefault.aspx%3fwa%3dwsignin1.0&amp;wxp_subject=%e7%ad%94%e5%a4%8d%ef%bc%9a%e6%82%a8%e7%9a%84%e6%97%a5%e5%bf%97%e2%80%9c%e8%b7%9f%e8%8f%9c%e9%b8%9f%e5%ad%a6Struts(4)-action%e2%80%9d&amp;wxp_body=%3cdiv%3e%3cbr+%2f%3e%3cbr+%2f%3e%3chr+%2f%3e%e6%9f%a5%e7%9c%8b%e6%97%a5%e5%bf%97%ef%bc%9a%3ca+href%3d%22http%26%2358%3b%26%2347%3b%26%2347%3bw-inds8.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b4D28F2F74B328142%26%2333%3b429.entry%22%3ehttp%26%2358%3b%26%2347%3b%26%2347%3bw-inds8.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b4D28F2F74B328142%26%2333%3b429.entry%3c%2fa%3e%3c%2fdiv%3e">发送消息</a></nobr>&nbsp;| <nobr><a id="blogPermalink0" title="此日志的固定链接" href="http://w-inds8.spaces.live.com/blog/cns!4D28F2F74B328142!429.entry">固定链接</a></nobr>&nbsp;| <nobr><a id="blogTrackbacks0" href="http://w-inds8.spaces.live.com/blog/cns!4D28F2F74B328142!429.entry#trackback" bvitemtype="trackback">查看引用通告 (0)</a></nobr>&nbsp;| <nobr><a id="blogThis0" title="写入您的共享空间日志" href="javascript:BlogIt('cns!4D28F2F74B328142!429');">写入日志</a></nobr></div>
<div class="footer"></div>
<div class="bvEntry" id="entrycns!4D28F2F74B328142!420" bv:cns="cns!4D28F2F74B328142!420" bv:ca="true" bv:cat="">
<h4 class="TextColor1" id="subjcns!4D28F2F74B328142!420" style="margin-bottom: 0px"><a href="http://w-inds8.spaces.live.com/blog/cns!4D28F2F74B328142!420.entry">跟菜鸟学struts (3) - actionFrom</a></h4>
<div class="bvMsg" id="msgcns!4D28F2F74B328142!420">
<blockquote>
<p>通常我们在Struts中是使用ActionForm来传送jsp页面的form中提交的数据的，在前面的例子中我们也用到了一个
<p>ActionForm它们都是从org.apache.struts.action.ActionForm中继承来的，那么Struts就行帮我们把提交的数
<p>据自动入到这个Form 中，我们在Action中就可以用form.getXXX()和form.setXXX()来处理数据了，好！下面我
<p>们来做一下这个例子
<p>新建一个文件struts-config-formtest.xml ，下面为文件的内容：
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>&lt;struts-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<br />
&nbsp; <font color="#ff2828">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><u>&lt;form-bean name="testForm" type="org.form.struts.form.NormalForm"&nbsp; &gt;&lt;/form-bean&gt;</u></strong></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="dynaTestForm" type="org.apache.struts.action.DynaActionForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="userName" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="passWorld" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="sex" type="byte" initial="0"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="email" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="phoneNum" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="age" type="int" initial="12"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/formTest"&nbsp; name="testForm" type="org.form.struts.action.NormalFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/normalsuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/dynaformTest"&nbsp; name ="dynaTestForm" type="org.form.struts.action.dynaFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/dynasuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/gotoaction" type="org.form.struts.action.GotoAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/index.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
&lt;/struts-config&gt;
<p>现在我们只要看到这一句就足够了，动态Form我们会在下面讲解
<p><font color="#ff2828">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><u>&lt;form-bean name="testForm" type="org.form.struts.form.NormalForm"&nbsp; &gt;&lt;/form-bean&gt;</u></strong></font>
<p>相信朋友们都清楚这个用来做什么的吧，不知道就看看我先前的文章。
<p>下面为NormalForm.java的内容
<p>package org.form.struts.form;
<p>import org.apache.struts.action.ActionForm;
<p>public class NormalForm extends ActionForm {<br />
&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = -4017195510815090304L;
<p>&nbsp;&nbsp;&nbsp; private String userName;<br />
&nbsp;&nbsp;&nbsp; private String passWorld;<br />
&nbsp;&nbsp;&nbsp; private byte sex;<br />
&nbsp;&nbsp;&nbsp; private String email;<br />
&nbsp;&nbsp;&nbsp; private String phoneNum;<br />
&nbsp;&nbsp;&nbsp; private int age;<br />
&nbsp;&nbsp;&nbsp; public String getUserName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return userName;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setUserName(String userName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userName = userName;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String getPassWorld() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return passWorld;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setPassWorld(String passWorld) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.passWorld = passWorld;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public byte getSex() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sex;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setSex(byte sex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.sex = sex;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String getEmail() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return email;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setEmail(String email) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.email = email;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String getPhoneNum() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return phoneNum;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setPhoneNum(String phoneNum) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.phoneNum = phoneNum;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public int getAge() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return age;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setAge(int age) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.age = age;<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<p>我们可以看到这个只是个从ActionForm派生来的javabean,下面把jsp页面也帖出来
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'>http://struts.apache.org/tags-bean"</a> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'>http://struts.apache.org/tags-html"</a> prefix="html" %&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;请选择你要测试的form&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;html:form action="formTest" styleId="testform" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userName:&lt;html:text property="userName"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passWorld:&lt;html:password property="passWorld"&gt;&lt;/html:password&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sex&lt;html:radio property="sex" value="0" title="男"&gt;男&lt;/html:radio&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:radio property="sex" value="1" title="女"&gt;女&lt;/html:radio&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; email&lt;html:text property="email"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phoneNum&lt;html:text property="phoneNum"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age&lt;html:text property="age"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; normalForm submit&lt;html:submit onclick="submit(0);return false;"&gt;&lt;/html:submit&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynaForm submit&lt;html:submit &gt;&lt;/html:submit&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
<p>这次不会讲它的目录结构，在最后我会放出下载地址
<p>好，我们拉着反struts动态from也讲完再来看运行效果：
<p>动态Form是什么意思呢，好就是让我们不用写上面的javabean面直接在xml配置文件中配置，下面为代码，其实上面也已经把代码帖出来了，下面我再帖一次，请注意高亮部分
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>&lt;struts-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="testForm" type="org.form.struts.form.NormalForm"&nbsp; &gt;&lt;/form-bean&gt;<br />
<font color="#ff0909"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="dynaTestForm" type="org.apache.struts.action.DynaActionForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="userName" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="passWorld" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="sex" type="byte" initial="0"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="email" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="phoneNum" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="age" type="int" initial="12"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;</strong></font><br />
&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/formTest"&nbsp; name="testForm" type="org.form.struts.action.NormalFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/normalsuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/dynaformTest"&nbsp; name ="dynaTestForm" type="org.form.struts.action.dynaFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/dynasuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/gotoaction" type="org.form.struts.action.GotoAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/index.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
&lt;/struts-config&gt;
<p>我们可以看到form中的所有的内容都在xml文件中写出来了，
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="sex" type="byte" initial="0"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="email" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
看看上面的两行有什么不一样，它们都是用&lt;form-property&gt;来定义的都有name (相当于javabean中的一个property)
<p>type 不用说了吧就是它的类型，不同的是在第一行中多了一个initial="0" 为什么呢，请记住在基本数据成员是要初始化的
<p>就像局部变量一样。
<p>其实这个东东没什么难度吧，下面讲一个我们初学者都出现的问题，
<p>我们可以先找找这个关键字Cannot retrieve mapping for action 了解一下
<p>下面我们进入正题吧：
<p>web.xml的内容
<p>&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xm&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config/formtest&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config-formtest.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</font><br />
&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;
<p>我们可以看到这里有两个模块，问题就在这里了，（如果不清楚struts多个配置文件的使用可以看我另一个文章）
<p>在配置文件中你们可以看到我们多了模块，在直接访问jsp文件时，struts只会在默认的模块中找Action所以我们只能
<p>通过一个Action来做连接（好不爽啊）。
<p>下面帖运行效果出来：
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqG4-6gzHFnvSmDM_DLtoqiaTA1yNbVEldx5pqOdi1JvZZpm_Qfaqv1DXkjmIpSbQAg?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="320" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqFokPoNRswRq2GmG5ePTKXm60nbL5flxLF71oM-EuNidckjfaCDkVIAzmrpmcoiVEI?PARTNER=WRITER" width="293" border="0" /></a>
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqGlWkvaKc6RBnzLtBnvqu0wlIByKeUiFGemIH1NaU4RMAio4Yxs5IP0ah8TXWJCMFM?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="247" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHFvNyXawN6i00RwM4uCH8d-dl2s9HmUhEePjN0X3gJeeCgxeQOqnMD4z2mrF_087U?PARTNER=WRITER" width="208" border="0" /></a>
<p>下面这个是找不到Action的效果
<p><a href="http://vzzrda.bay.livefilestore.com/y1p3Z-d0h5oz15dy8Bom5NIowAcgVaefXQSRmdWr-5OHVC_eGJS3z5fkE5z_mMZuC95Lp88AF1BaVCtvyY2BkUBjw?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="278" alt="image" src="http://by1.storage.msn.com/y1p04t0TR1P2tu-E1wU52N3DumGDK42C3CDHDKg-k9Y2Ji0A_qrrM91za2Tqg3BvYtn8q-J1_SYXdCv91hkby0fbHJ8xau99xBM?PARTNER=WRITER" width="519" border="0" /></a>
<p>&nbsp;&nbsp; &lt;!-- 动态Form用这个 --&gt;
<p>&lt;html:form action="formTest" styleId="testform" &gt;<br />
&lt;!--&lt;html:form action="dynaformTest" styleId="testform" &gt;--&gt;
<p>下载地址
<p><a title="Click to view this file" href="http://winds8.googlepages.com/Struts_HelloWorld.war">Click to view this file</a></p>
</blockquote></div>
</div>
<img src ="http://www.blogjava.net/sakrua/aggbug/161385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sakrua/" target="_blank">风の使者</a> 2007-11-18 13:32 <a href="http://www.blogjava.net/sakrua/articles/161385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跟菜鸟学struts (3) - actionFrom</title><link>http://www.blogjava.net/sakrua/articles/161369.html</link><dc:creator>风の使者</dc:creator><author>风の使者</author><pubDate>Sun, 18 Nov 2007 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/sakrua/articles/161369.html</guid><wfw:comment>http://www.blogjava.net/sakrua/comments/161369.html</wfw:comment><comments>http://www.blogjava.net/sakrua/articles/161369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sakrua/comments/commentRss/161369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sakrua/services/trackbacks/161369.html</trackback:ping><description><![CDATA[<blockquote>
<p>通常我们在Struts中是使用ActionForm来传送jsp页面的form中提交的数据的，在前面的例子中我们也用到了一个
<p>ActionForm它们都是从org.apache.struts.action.ActionForm中继承来的，那么Struts就行帮我们把提交的数
<p>据自动入到这个Form 中，我们在Action中就可以用form.getXXX()和form.setXXX()来处理数据了，好！下面我
<p>们来做一下这个例子
<p>新建一个文件struts-config-formtest.xml ，下面为文件的内容：
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>&lt;struts-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<br />
&nbsp; <font color="#ff2828">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><u>&lt;form-bean name="testForm" type="org.form.struts.form.NormalForm"&nbsp; &gt;&lt;/form-bean&gt;</u></strong></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="dynaTestForm" type="org.apache.struts.action.DynaActionForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="userName" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="passWorld" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="sex" type="byte" initial="0"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="email" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="phoneNum" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="age" type="int" initial="12"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/formTest"&nbsp; name="testForm" type="org.form.struts.action.NormalFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/normalsuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/dynaformTest"&nbsp; name ="dynaTestForm" type="org.form.struts.action.dynaFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/dynasuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/gotoaction" type="org.form.struts.action.GotoAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/index.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
&lt;/struts-config&gt;
<p>现在我们只要看到这一句就足够了，动态Form我们会在下面讲解
<p><font color="#ff2828">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><u>&lt;form-bean name="testForm" type="org.form.struts.form.NormalForm"&nbsp; &gt;&lt;/form-bean&gt;</u></strong></font>
<p>相信朋友们都清楚这个用来做什么的吧，不知道就看看我先前的文章。
<p>下面为NormalForm.java的内容
<p>package org.form.struts.form;
<p>import org.apache.struts.action.ActionForm;
<p>public class NormalForm extends ActionForm {<br />
&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = -4017195510815090304L;
<p>&nbsp;&nbsp;&nbsp; private String userName;<br />
&nbsp;&nbsp;&nbsp; private String passWorld;<br />
&nbsp;&nbsp;&nbsp; private byte sex;<br />
&nbsp;&nbsp;&nbsp; private String email;<br />
&nbsp;&nbsp;&nbsp; private String phoneNum;<br />
&nbsp;&nbsp;&nbsp; private int age;<br />
&nbsp;&nbsp;&nbsp; public String getUserName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return userName;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setUserName(String userName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userName = userName;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String getPassWorld() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return passWorld;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setPassWorld(String passWorld) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.passWorld = passWorld;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public byte getSex() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sex;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setSex(byte sex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.sex = sex;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String getEmail() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return email;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setEmail(String email) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.email = email;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String getPhoneNum() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return phoneNum;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setPhoneNum(String phoneNum) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.phoneNum = phoneNum;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public int getAge() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return age;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setAge(int age) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.age = age;<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<p>我们可以看到这个只是个从ActionForm派生来的javabean,下面把jsp页面也帖出来
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'>http://struts.apache.org/tags-bean"</a> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'>http://struts.apache.org/tags-html"</a> prefix="html" %&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;请选择你要测试的form&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;html:form action="formTest" styleId="testform" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userName:&lt;html:text property="userName"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passWorld:&lt;html:password property="passWorld"&gt;&lt;/html:password&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sex&lt;html:radio property="sex" value="0" title="男"&gt;男&lt;/html:radio&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:radio property="sex" value="1" title="女"&gt;女&lt;/html:radio&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; email&lt;html:text property="email"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phoneNum&lt;html:text property="phoneNum"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age&lt;html:text property="age"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; normalForm submit&lt;html:submit onclick="submit(0);return false;"&gt;&lt;/html:submit&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynaForm submit&lt;html:submit &gt;&lt;/html:submit&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
<p>这次不会讲它的目录结构，在最后我会放出下载地址
<p>好，我们拉着反struts动态from也讲完再来看运行效果：
<p>动态Form是什么意思呢，好就是让我们不用写上面的javabean面直接在xml配置文件中配置，下面为代码，其实上面也已经把代码帖出来了，下面我再帖一次，请注意高亮部分
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>&lt;struts-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="testForm" type="org.form.struts.form.NormalForm"&nbsp; &gt;&lt;/form-bean&gt;<br />
<font color="#ff0909"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="dynaTestForm" type="org.apache.struts.action.DynaActionForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="userName" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="passWorld" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="sex" type="byte" initial="0"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="email" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="phoneNum" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="age" type="int" initial="12"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;</strong></font><br />
&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/formTest"&nbsp; name="testForm" type="org.form.struts.action.NormalFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/normalsuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/dynaformTest"&nbsp; name ="dynaTestForm" type="org.form.struts.action.dynaFormAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/dynasuccess.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/gotoaction" type="org.form.struts.action.GotoAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/index.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
&lt;/struts-config&gt;
<p>我们可以看到form中的所有的内容都在xml文件中写出来了，
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="sex" type="byte" initial="0"&gt;&lt;/form-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="email" type="java.lang.String"&gt;&lt;/form-property&gt;<br />
看看上面的两行有什么不一样，它们都是用&lt;form-property&gt;来定义的都有name (相当于javabean中的一个property)
<p>type 不用说了吧就是它的类型，不同的是在第一行中多了一个initial="0" 为什么呢，请记住在基本数据成员是要初始化的
<p>就像局部变量一样。
<p>其实这个东东没什么难度吧，下面讲一个我们初学者都出现的问题，
<p>我们可以先找找这个关键字Cannot retrieve mapping for action 了解一下
<p>下面我们进入正题吧：
<p>web.xml的内容
<p>&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xm&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config/formtest&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config-formtest.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</font><br />
&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;
<p>我们可以看到这里有两个模块，问题就在这里了，（如果不清楚struts多个配置文件的使用可以看我另一个文章）
<p>在配置文件中你们可以看到我们多了模块，在直接访问jsp文件时，struts只会在默认的模块中找Action所以我们只能
<p>通过一个Action来做连接（好不爽啊）。
<p>下面帖运行效果出来：
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqG4-6gzHFnvSmDM_DLtoqiaTA1yNbVEldx5pqOdi1JvZZpm_Qfaqv1DXkjmIpSbQAg?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="320" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqFokPoNRswRq2GmG5ePTKXm60nbL5flxLF71oM-EuNidckjfaCDkVIAzmrpmcoiVEI?PARTNER=WRITER" width="293" border="0" /></a>
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqGlWkvaKc6RBnzLtBnvqu0wlIByKeUiFGemIH1NaU4RMAio4Yxs5IP0ah8TXWJCMFM?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="247" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHFvNyXawN6i00RwM4uCH8d-dl2s9HmUhEePjN0X3gJeeCgxeQOqnMD4z2mrF_087U?PARTNER=WRITER" width="208" border="0" /></a>
<p>下面这个是找不到Action的效果
<p><a href="http://vzzrda.bay.livefilestore.com/y1p3Z-d0h5oz15dy8Bom5NIowAcgVaefXQSRmdWr-5OHVC_eGJS3z5fkE5z_mMZuC95Lp88AF1BaVCtvyY2BkUBjw?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="278" alt="image" src="http://by1.storage.msn.com/y1p04t0TR1P2tu-E1wU52N3DumGDK42C3CDHDKg-k9Y2Ji0A_qrrM91za2Tqg3BvYtn8q-J1_SYXdCv91hkby0fbHJ8xau99xBM?PARTNER=WRITER" width="519" border="0" /></a>
<p>&nbsp;&nbsp; &lt;!-- 动态Form用这个 --&gt;
<p>&lt;html:form action="formTest" styleId="testform" &gt;<br />
&lt;!--&lt;html:form action="dynaformTest" styleId="testform" &gt;--&gt;
<p>下载地址
<p><a title="Click to view this file" href="http://winds8.googlepages.com/Struts_HelloWorld.war">Click to view this file</a></p>
</blockquote>
<p><a href="http://w-inds8.spaces.live.com/blog/cns!4D28F2F74B328142!429.entry"></a>&nbsp;</p>
<img src ="http://www.blogjava.net/sakrua/aggbug/161369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sakrua/" target="_blank">风の使者</a> 2007-11-18 12:12 <a href="http://www.blogjava.net/sakrua/articles/161369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 进阶之 ActionServlet深入探讨</title><link>http://www.blogjava.net/sakrua/articles/159190.html</link><dc:creator>风の使者</dc:creator><author>风の使者</author><pubDate>Thu, 08 Nov 2007 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/sakrua/articles/159190.html</guid><wfw:comment>http://www.blogjava.net/sakrua/comments/159190.html</wfw:comment><comments>http://www.blogjava.net/sakrua/articles/159190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sakrua/comments/commentRss/159190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sakrua/services/trackbacks/159190.html</trackback:ping><description><![CDATA[<p><a href="http://by1.storage.msn.com/y1p04t0TR1P2ttv3ff5Qh1VN-VDLuuqBeaftS6YsJDPiVOpWmq2PteuXwkKnzvm7iAXK3lyjyD9ymkQzWZhX56BsZHIMpDoGy-v"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="153" alt="image" src="http://by1.storage.msn.com/y1p04t0TR1P2tsA5rBiNp5FS3wxkz9wOUwsgzoI_CbIDYQ54iWVoCOzYOGROuuqP19vDs3PX21xUFMr9ujsZLDLUlK4xesciUkc" width="515" border="0" /></a>
<blockquote>
<p>Struts提供了一个缺省版本的ActionServlet类，你可以继承这个类，覆盖其中的一些方法来达到你的特殊处理的需要。ActionServlet继承与javax.servlet.http.HttpServlet，所以在本质上它和一个普通的servlet没有区别，你完全可以把它当做一个servlet来看待，只是在其中完成的功能不同罢了。ActionServlet主要完成如下功能：</p>
</blockquote>
<ol>
    <ol>
        <li>将一个来自客户端的URI映射到一个相应的Action类
        <li>如果是这个Action类是第一次被调用，那么实例化一个并放入缓存
        <li>如果在配置文件(struts-config.xml)中指定了相应的ActionForm，那么从Request中抓取数据填充FormBean
        <li>调用这个Action类的perform()方法，传入ActionMapping的一个引用，对应的ActionForm、以及由容器传给ActionServlet的HttpServletRequest、HttpServletResponse对象。</li>
    </ol>
</ol>
<blockquote>
<p><br />
缺省版本的ActionServlet会从配置文件web.xml中读取如下初始化参数：
<ol>
    <li>application<br />
    应用使用的资源包(resources&nbsp;bundle)的基类
    <li>factory<br />
    用于创建应用的MessageResources对象的MessageResourcesFactory的类名。缺省是org.apache.struts.util.PropertyMessageResourcesFactory。
    <li>config<br />
    Struts的配置文件，缺省是/WEB-INF/struts-config.xml。注意这儿是与应用Context关联的相对路径。
    <li>content<br />
    定义了缺省的内容类型和编码格式，它会被自动地被设置到每个response中，如果JSP/Servlet中没有明确的设置。缺省是text/html。
    <li>debug<br />
    调试信息的级别。默认为0，比当前级别高的调试信息会被log到日志文件中。
    <li>detail<br />
    与debug的作用类似，只是这个detail是initMapping()时专用的。调试信息会被打印到System.out，而不是日志文件。
    <li>formBean<br />
    ActionFormBean的实现类，缺省为org.apache.struts.action.ActionFormBean
    <li>forward<br />
    应用中使用的ActionForward类，缺省是org.apache.struts.action.ActionForward。
    <li>locale<br />
    指定了缺省使用的Locale对象。设为true，当得到一个session时，会自动在session中存储一个以Action.LOCALE_KEY标示的Locale对象，如果session中还没有与Action.LOCALE_KEY绑定的Locale对象。
    <li>mapping<br />
    应用中使用的ActionMapping类，缺省是org.apache.struts.action.ActionMapping。
    <li>multipartClass<br />
    文件上传使用的MutipartRequestHandler的实现类。缺省为org.apache.struts.upload.DiskMultipartRequestHandler
    <li>nocache<br />
    如果设为true，那么ActionServlet会自动在每个到客户端的响应中添加nocache的HTML头，这样客户端就不会对应用中的页面进行缓存。缺省为false
    <li>null<br />
    如果设置为true，那么应用在得到一个未定义的message资源时，会返回null，而不是返回一个错误信息。缺省是true。
    <li>maxFileSize<br />
    文件上传的大小上限，缺省为250M
    <li>bufferSize<br />
    文件上传时的缓冲区的大小，缺省为4M
    <li>tempDir<br />
    设置用于上传时的临时目录。工作目录会作为一个Servlet环境（Context）的属性提供。
    <li>validate<br />
    Are&nbsp;we&nbsp;using&nbsp;the&nbsp;new&nbsp;configuration&nbsp;file&nbsp;format?缺省为true。
    <li>validating<br />
    在解析配置XML文件是是否进行有效性的验证。缺省为true<br />
    </li>
</ol>
</blockquote>
<blockquote>
<p>ActionServlet中应用了命令设计模式:</p>
</blockquote>
<blockquote>
<p>一个Servlet在由容器生成时，首先会调用init()方法进行初始化，在接到一个HTTP请求时，调用相应的方法进行处理；比如GET请求调用doGet()方法，POST请求调用doPost()方法。所以首先看看ActionServlet的init()方法，你就会很清楚为什么ActionServlet可以完成这些功能了。<br />
</p>
</blockquote>
<ul>
    <ul>
        <li>在它的init()方法中，ActionServlet依次调用如下protected的方法完成初始化：<br />
        initActions()&nbsp;－&nbsp;大家可能还曾有这个疑问：Struts为什么可以找到一个请求URI对应的action类呢？答案就在这儿，ActionServlet有一个actions属性，类型为org.apache.struts.util.FastHashMap，用于存储以类的全名为key的已实例化的Action类。在init()时首先调用的就是initActions()方法，在这个方法中只是简单的清除map中的所有的名值对，<br />
        synchronized&nbsp;(actions)&nbsp;{&nbsp;<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actions.setFast(false);&nbsp;<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actions.clear();&nbsp;<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actions.setFast(true);&nbsp;<br />
        }&nbsp;<br />
        首先把actions设为slow模式，这时对FastHashMap的访问是线程同步的，然后清除actions中的所有的已存在的名/值对，最后再把actions的模式设为fast。由于FastHashMap是struts在java.util.HashMap的基础上的一个扩展类，是为了适应多线程、并且对HashMap的访问大部分是只读的特殊环境的需要。大家知道java.util.HashMap是非线程安全的，所以HashMap一般适用于单线程环境下。org.apache.struts.FastHashMap就是继承于java.util.HashMap，在其中添加多线程的支持产生的。在fast模式下的工作方式是这样的：读取是非线程同步的；写入时首先克隆当前map，然后在这个克隆上做写入操做，完成后用这个修改后的克隆版本替换原来的map。那么在什么时候会把Actions类添加到这个map中呢？我们已经提到了struts是动态的生成Action类的实例的，在每次ActionServlet接收到一个GET或POST的HTTP请求时，会在这个map中查找对应的Action类的实例，如果不存在，那么就实例化一个，并放入map中。可见这个actions属性起到了对Action类实例的缓存的作用。
        <li>initInternal()&nbsp;－&nbsp;初始化ActionServlet内部使用的资源包MessageResources，使用MessageResources.getMessageResources(internalName)得到&nbsp;internalName为"org.apache.struts.action.ActionResources"对应的ActionResources.properties文件。这个资源包主要用于ActionServlet处理过程中的用到的提示信息，这儿不展开讨论。
        <li>initDebug()&nbsp;－&nbsp;从web.xml中读取本应用的debug级别参数getServletConfig().getInitParameter("debug")，然后赋给debug属性。
        <li>initApplication()－&nbsp;初始化应用资源包，并放置入ServletContext中。<br />
        String&nbsp;factory&nbsp;=getServletConfig().getInitParameter(&#8220;factory&#8221;);&nbsp;<br />
        String&nbsp;oldFacory&nbsp;=&nbsp;MessageResourcesFactory.getFactoryClass();&nbsp;<br />
        if&nbsp;(factory&nbsp;!=null)&nbsp;<br />
        &nbsp;&nbsp;&nbsp;&nbsp; MessageResourcesFactory.setFactoryClass(factory);&nbsp;<br />
        String&nbsp;value&nbsp;=&nbsp;getServletConfig().getInitParameter("application");&nbsp;<br />
        MessageResourcesFactory&nbsp;factoryObject&nbsp;=&nbsp;MessageResourcesFactory.createFactory();&nbsp;<br />
        application&nbsp;=&nbsp;factoryObject.createResources(value);&nbsp;<br />
        MessageResourcesFactory.setFactory(oldFactory);&nbsp;<br />
        getServletContext().setAttribute(Action.MESSAGES_KEY,&nbsp;application);&nbsp;<br />
        <font color="#ff0000"><strong>说明：文中引用的代码片断可能会省略了一些例外检查等非主线的内容，敬请注意。</strong></font></li>
    </ul>
</ul>
<blockquote>
<p>首先从配置文件中读取factory参数，如果这个参数不为空，那么就在MessageResourcesFactory中使用这个指定的Factory类；否则，使用默认的工厂类org.apche.struts.util.PropertyMessageResourceFactory。然后调用MessageResourcesFactory的静态createFactory()方法，生成一个具体的MessageResourceFactory对象（注意：MessageResourcesFactory是抽象类）。这样就可以调用这个具体的MessageResourceFactory的createResource()方法得到配置文件(web.xml)中定义的资源文件了。<br />
上面的application对象类型为MessageResources。在web.xml中在配置ActionServlet时可以指定一个特定的工厂类。不能直接MessageResourcesFactory的createResources()方法，因为这个方法是abstract的。创建factoryObject的过程如下：<br />
MessageResourceFactory&nbsp;factoryObject=&nbsp;<br />
MessageResourcesFactory.createFactory();&nbsp;<br />
application&nbsp;=&nbsp;factoryObject.createResources(value);&nbsp;<br />
&lt;li&gt;initMapping()&nbsp;－&nbsp;为应用初始化mapping信息ActionServlet有一个protected的属性：mapping，封装了一个ActionMapping的对象集合，以便于管理、查找ActionMapping。mappings是org.apache.struts.action.ActionMappings类的实例。主要有两个方法：addMapping(ActionMapping&nbsp;mapping)和findMapping(String&nbsp;path)。ActionMapping也是使用上面提到的org.apache.struts.util.FastHashMap类来存储所有的ActionMapping对象。<br />
mappings.setServlet(this);&nbsp;<br />
&#8230;&#8230;&nbsp;<br />
//&nbsp;Initialize&nbsp;the&nbsp;name&nbsp;of&nbsp;our&nbsp;ActionFormBean&nbsp;implementation&nbsp;class&nbsp;<br />
value&nbsp;=&nbsp;getServletConfig().getInitParameter("formBean");&nbsp;<br />
if&nbsp;(value&nbsp;!=&nbsp;null)&nbsp;<br />
formBeanClass&nbsp;=&nbsp;value;&nbsp;<br />
//&nbsp;Initialize&nbsp;the&nbsp;name&nbsp;of&nbsp;our&nbsp;ActionForward&nbsp;implementation&nbsp;class&nbsp;<br />
value&nbsp;=&nbsp;getServletConfig().getInitParameter("forward");&nbsp;<br />
if&nbsp;(value&nbsp;!=&nbsp;null)&nbsp;<br />
forwardClass&nbsp;=&nbsp;value;&nbsp;<br />
//&nbsp;Initialize&nbsp;the&nbsp;name&nbsp;of&nbsp;our&nbsp;ActionMapping&nbsp;implementation&nbsp;class&nbsp;<br />
value&nbsp;=&nbsp;getServletConfig().getInitParameter("mapping");&nbsp;<br />
if&nbsp;(value&nbsp;!=&nbsp;null)&nbsp;<br />
mappingClass&nbsp;=&nbsp;value;&nbsp;<br />
在initMapping()中，首先链接mappings对象到本servlet实例。其实这句话的作用很简单，在ActionMappings中会有一个ActionServlet类型的属性，这个属性就界定了这个ActionMappings对象所属的ActionServlet。Struts的实现比较灵活，其中的ActionFormBean、ActionForward、ActionMapping类你完全可以使用自己实现的子类，来定制Struts的工作方式。上面的代码就从配置文件（web.xml）中读取formBean、forward、mapping参数，这些参数就是你定制的ActionFormBean、ActionForward、ActionMapping类名。<br />
//&nbsp;Initialize&nbsp;the&nbsp;context-relative&nbsp;path&nbsp;to&nbsp;our&nbsp;configuration&nbsp;resources&nbsp;<br />
value&nbsp;=&nbsp;getServletConfig().getInitParameter("config");&nbsp;<br />
if&nbsp;(value&nbsp;!=&nbsp;null)&nbsp;<br />
config&nbsp;=&nbsp;value;&nbsp;<br />
//&nbsp;Acquire&nbsp;an&nbsp;input&nbsp;stream&nbsp;to&nbsp;our&nbsp;configuration&nbsp;resource&nbsp;<br />
InputStream&nbsp;input&nbsp;=&nbsp;getServletContext().getResourceAsStream(config);&nbsp;<br />
Digester&nbsp;digester&nbsp;=&nbsp;null;&nbsp;<br />
digester&nbsp;=&nbsp;initDigester(detail);&nbsp;<br />
try&nbsp;{&nbsp;<br />
formBeans.setFast(false);&nbsp;<br />
forwards.setFast(false);&nbsp;<br />
mappings.setFast(false);&nbsp;<br />
digester.parse(input);&nbsp;<br />
mappings.setFast(true);&nbsp;<br />
forwards.setFast(true);&nbsp;<br />
formBeans.setFast(true);&nbsp;<br />
}&nbsp;catch&nbsp;(SAXException&nbsp;e)&nbsp;{&nbsp;<br />
throw&nbsp;new&nbsp;ServletException&nbsp;<br />
(internal.getMessage("configParse",&nbsp;config),&nbsp;e);&nbsp;<br />
}&nbsp;finally&nbsp;{&nbsp;<br />
input.close();&nbsp;<br />
}&nbsp;<br />
从web.xml读取Struts的配置文件的位置。使用org.apache.struts.digester.Digester解析config参数标示的配置文件，通常为&#8220;/WEB-INF/struts-config.xml&#8221;，解析出所有的data-source、form-bean、action-mapping、forward。从上面的程序片断看到，Digester仅仅调用了一个parse()方法，那么，Digester是怎样把解析struts-config.xml文件并把解析的结果form-bean等信息存储到属性变量formBeans等中的呢？你可以注意到在调用digester.parse(InputStream)之前，首先调用了initDigester()方法：<br />
Digester&nbsp;digester&nbsp;=&nbsp;new&nbsp;Digester();&nbsp;<br />
digester.push(this);&nbsp;<br />
digester.addObjectCreate("struts-config/action-mappings/action",&nbsp;<br />
mappingClass,&nbsp;"className");&nbsp;<br />
digester.addSetProperties("struts-config/action-mappings/action");&nbsp;<br />
digester.addSetNext("struts-config/action-mappings/action",&nbsp;<br />
"addMapping",&nbsp;<br />
"org.apache.struts.action.ActionMapping");&nbsp;<br />
digester.addSetProperty&nbsp;<br />
("struts-config/action-mappings/action/set-property",&nbsp;<br />
"property",&nbsp;"value");&nbsp;<br />
在这个方法中首先生成一个Digester对象，然后设置解析的规则和回调，如果你对XML、SAX不是很熟，这儿不必纠缠太深。要注意的是addSetNext()方法，设置了每一个要解析元素的Set&nbsp;Next回调方法，而这个方法就是由digester解析器的父提供的。上面的片断中的&#8220;addMapping&#8221;就是ActionServlet本身定义的一个方法，将由Digester回调。Digester就是籍此把解析出的每一个FormBean、ActionForward、ActionMapping等存储到属性变量formBeans、forwards、mappings等中的。<br />
initUpload()&nbsp;－&nbsp;初始化有关Upload的一些参数，比如：bufferSize、tempDir。<br />
initDataSource()&nbsp;－取出在initMapping()中从配置文件中读取的每一个DataSource，设置LogWriter，如果为GenericDataSource的实例，则打开数据源。然后，把每个dataSource放入Context中。<br />
dataSource.setLogWriter(scw)；<br />
((GenericDataSource)dataSource).open();<br />
getServletContext().setAttribute(key,dataSource);<br />
initOther()&nbsp;－&nbsp;设置其它尚未初始化的的参数（content、locale、nocache），并发布formBeans、forwards、mappings到Context：<br />
getServletContext().setAttribute(Action.FORM_BEANS_KEY,&nbsp;formBeans);<br />
getServletContext().setAttribute(Action.FORWARDS_KEY,&nbsp;forwards);<br />
getServletContext().setAttribute(Action.MAPPINGS_KEY,&nbsp;mappings);<br />
initServlet()&nbsp;－&nbsp;初始化Controller&nbsp;Servlet的Servlet&nbsp;Mapping。这儿也使用了Digester工具，扫描web.xml所有的&lt;web-app/servlet-mapping&gt;，寻找servlet-name与当前Servlet相同的mapping，置入Context。代码如下；<br />
Digester&nbsp;digester&nbsp;=&nbsp;new&nbsp;Digester();&nbsp;<br />
digester.push(this);&nbsp;<br />
digester.setDebug(debug);&nbsp;<br />
digester.setValidating(validating);&nbsp;<br />
digester.addCallMethod(&#8220;web-appservlet-mapping&#8221;,&#8220;addServletMapping&#8221;,&nbsp;2);&nbsp;<br />
digester.addCallParm(&#8220;web-appservlet-mappingservlet-name&#8221;,&nbsp;0);&nbsp;<br />
digester.addCallParm(&#8220;web-appservlet-mappingurl-pattern&#8221;,&nbsp;1);&nbsp;<br />
InputStream&nbsp;is&nbsp;=&nbsp;getServletContext().getResourceAsStream(&#8220;/WEB-INFweb.xml&#8221;);&nbsp;<br />
digester.parse(is);&nbsp;<br />
getServletContext().setAttribute(Action.SERVLET_KEY,servletMapping);</p>
</blockquote>
<img src ="http://www.blogjava.net/sakrua/aggbug/159190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sakrua/" target="_blank">风の使者</a> 2007-11-08 22:50 <a href="http://www.blogjava.net/sakrua/articles/159190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 中配置到多个xml文件中</title><link>http://www.blogjava.net/sakrua/articles/159185.html</link><dc:creator>风の使者</dc:creator><author>风の使者</author><pubDate>Thu, 08 Nov 2007 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/sakrua/articles/159185.html</guid><wfw:comment>http://www.blogjava.net/sakrua/comments/159185.html</wfw:comment><comments>http://www.blogjava.net/sakrua/articles/159185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sakrua/comments/commentRss/159185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sakrua/services/trackbacks/159185.html</trackback:ping><description><![CDATA[<blockquote>
<p>通常当我们的项目比较大，一个小的部分就会的struts配置文件的内容就会上百行，跟任何东西一样，一但多了，管理就会变得困难。因此在大型的项目中把配置文件分开更有利于管理和多人开发，下面我来讲讲在struts中是怎样实现的。
<p>通常有两个方法：
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一是像这样：
<p>&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml , /WEB-INF/struts-config-dao.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;
<p>不过这样有一个不好的地方，那就是两个配置文件都是全局的，因此在有相同路径的Action就会产生冲突</p>
</blockquote>
<blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 二是像这样
<p>&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml &lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config/dao&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config-dao.xml &lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;
<p>这样就不会出现那些问题了</p>
</blockquote>
<img src ="http://www.blogjava.net/sakrua/aggbug/159185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sakrua/" target="_blank">风の使者</a> 2007-11-08 22:47 <a href="http://www.blogjava.net/sakrua/articles/159185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跟菜鸟学STRUTS(2)</title><link>http://www.blogjava.net/sakrua/articles/159183.html</link><dc:creator>风の使者</dc:creator><author>风の使者</author><pubDate>Thu, 08 Nov 2007 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/sakrua/articles/159183.html</guid><wfw:comment>http://www.blogjava.net/sakrua/comments/159183.html</wfw:comment><comments>http://www.blogjava.net/sakrua/articles/159183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sakrua/comments/commentRss/159183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sakrua/services/trackbacks/159183.html</trackback:ping><description><![CDATA[<p>上次刚完成了一个struts 的例子，大家都看到了，那么在上－次中我们到底做了什么呢，我现在为大家说说
<p>先来看看我们的web.xml文件
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app id="WebApp_ID" version="2.4" xmlns="<a href='http://java.sun.com/xml/ns/j2ee"' href_cetemp='http://java.sun.com/xml/ns/j2ee"'>http://java.sun.com/xml/ns/j2ee"</a> xmlns:xsi="<a href='http://www.w3.org/2001/XMLSchema-instance"' href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a> xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href='http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"' href_cetemp='http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"'>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</a>&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;display-name&gt;Struts_HelloWorld by sakrua&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- the struts config --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;!-- Standard Action Servlet Mapping --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- end struts config --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;
<p>我们在文件中定义了一个 servlet&nbsp; 我们来看看这个类&#8220;org.apache.struts.action.ActionServlet&#8221; 这个是struts 的核心类
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqEiM8qMcHHjZsV0uGaZMMgsLUySp_j_AM1J82-Ry6veLjbtlssyiE_CwK4zsuXY1g4"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="137" alt="image" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHvGh9sDKyk6Gra6U84umKIpfbYxuiV5XuQNRYezbjpDwDZXIs1_n4Jxlfo4f3xjcw" width="458" border="0" /></a>
<p>我们看到它也是从HttpServlet中继成来的，它为struts 完成如下的任务：
<ol>
    <li>为到来的请求找到URI
    <li>URI映射到ActionMapping
    <li>创建或找到相关的ActionMapping 实例
    <li>如果有ActionFrom创建它
    <li>创建Action实例
    <li>最后execute返回ActionForwar </li>
</ol>
<blockquote>
<p>&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br />
&nbsp;&lt;/init-param&gt;
<p>接着我们用下面的方法关连到我们的struts-config.xml中</p>
</blockquote>
<p>看看我们的重点内容struts-config.xml文件
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>&lt;struts-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="helloWorldForm" type="org.helloWorld.struts.form.HelloWorldForm"&gt;&lt;/form-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/hello" name="helloWorldForm" type="org.helloWorld.struts.action.HelloWorldAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/helloworld/success.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="fail" path="/helloworld/fail.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;message-resources parameter="org.helloWorld.struts.resource.ApplicationResources"&gt;&lt;/message-resources&gt;<br />
&lt;/struts-config&gt;
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>上面是固定的，但我们可以看到我用的是1.3的dtd文件，也就是说我用的是struts的1.3x
<p>&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="helloWorldForm" type="org.helloWorld.struts.form.HelloWorldForm"&gt;&lt;/form-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;<br />
<p>定义一个form-beans,在from-beans中我们可以定义很多的form-bean
<p>还记得我们的actionFrom吧，这里就是它的定义，在工作是struts 会为我们创建它
<p>这样的定义在大多数我情况下已经足够了，但还是有很多的其它的内容的，这个我以后再说了
<blockquote>
<p>&lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/hello" name="helloWorldForm" type="org.helloWorld.struts.action.HelloWorldAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/helloworld/success.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="fail" path="/helloworld/fail.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&lt;/action-mappings&gt;</p>
</blockquote>
<p>再下来就是定义一个action了，action都要从struts的类中继承，例如<strong>org.apache.struts.action.Action</strong>
<p>我们的例子中用的就是这个下面来说一下这个
<p>在action中我们完成业务中的工作，其有一个execute方法,我们要重写这个方法来完成我们想做的事情
<p>例如我们的例子中的
<blockquote>
<p>package org.helloWorld.struts.action;
<p>import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;
<p>import org.apache.struts.action.Action;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import org.helloWorld.struts.form.HelloWorldForm;<br />
/**<br />
&nbsp;* struts helloworld 的action form<br />
&nbsp;* @author sakrua<br />
&nbsp;* email :winds8@gmail.com&nbsp; msn:wind_s8@hotmail.com<br />
&nbsp;* 2007年11月5日<br />
&nbsp;*/<br />
public class HelloWorldAction extends Action {
<p>&nbsp;&nbsp;&nbsp; private static final String FAIL ="fail";<br />
&nbsp;&nbsp;&nbsp; private static final String SUCCESS ="success";<br />
&nbsp;&nbsp;&nbsp; //action中所有的请求都会由这个函数处理<br />
&nbsp;&nbsp;&nbsp; public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从actionForm 中取数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HelloWorldForm helloWorldForm =(HelloWorldForm)form;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String userName = helloWorldForm.getUserName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String worldToSay = helloWorldForm.getWorldToSay();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果没有协作输入转到错误页面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(userName.equals("")||worldToSay.equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward(FAIL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //转到成功页面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward(SUCCESS);<br />
&nbsp;&nbsp;&nbsp; }
<p>}
<p>&nbsp;</p>
</blockquote>
<p>在&nbsp;&lt;action-mappings&gt;中我们可以定义很多的action
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/hello" name="helloWorldForm" type="org.helloWorld.struts.action.HelloWorldAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/helloworld/success.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="fail" path="/helloworld/fail.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;
<p><strong>请注意的事在Action中定义是name是指向某个ActionFrom的，type才是指向我们的Action类</strong>
<p>在Action元素内我们定义了两个
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/helloworld/success.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="fail" path="/helloworld/fail.jsp"&gt;&lt;/forward&gt;
<p>与代码一同看，我们很容易想到这是让我们转到不同的页面中的
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果没有协作输入转到错误页面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(userName.equals("")||worldToSay.equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward(FAIL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //转到成功页面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward(SUCCESS)；
<p>下面现看看我们的页面吧，与其它的普通的HTML不一样的是我们这里多了struts的标签，来我们看一下例子
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
<p><strong>&lt;%@ taglib uri="</strong><a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'><strong>http://struts.apache.org/tags-bean"</strong></a><strong> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="</strong><a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'><strong>http://struts.apache.org/tags-html"</strong></a><strong> prefix="html" %&gt;</strong>
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;Welcome　you to use this demo&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;
<p><strong>&lt;html:form action="/hello"&gt;<br />
请输入你的用户名：&nbsp;&nbsp;&nbsp; <br />
&lt;html:text property="userName"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
请输入你想说的话：<br />
&lt;html:textarea property="worldToSay"&gt;&lt;/html:textarea&gt;&lt;br /&gt;<br />
&lt;html:submit value="submit"&gt;&lt;/html:submit&gt;<br />
&lt;/html:form&gt;</strong>
<p>&lt;/body&gt;<br />
&lt;/html&gt;
<p>这个是index.jsp文件的代码，
<p>我们先来讲讲标签
<p><strong>&lt;%@ taglib uri="</strong><a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'><strong>http://struts.apache.org/tags-bean"</strong></a><strong> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="</strong><a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'><strong>http://struts.apache.org/tags-html"</strong></a><strong> prefix="html" %&gt;</strong>
<p>这两句让我们导入了struts 的标签
<p>这样我拉就可以像下面一样使用了
<p><strong>&lt;html:form action="/hello"&gt;<br />
请输入你的用户名：&nbsp;&nbsp;&nbsp; <br />
&lt;html:text property="userName"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
请输入你想说的话：<br />
&lt;html:textarea property="worldToSay"&gt;&lt;/html:textarea&gt;&lt;br /&gt;<br />
&lt;html:submit value="submit"&gt;&lt;/html:submit&gt;<br />
&lt;/html:form&gt;</strong>
<p>也许有些人已经看到了一个东东，那就是标签中的property都与我们的ActionForm中定义的是一样的，
<p>没错，只要这样，在数据提交的时候Struts就会为我们把数据填入Form中
<p>再看回到struts-conf.xml文件
<p>我们可以发现
<p>&lt;message-resources parameter="org.helloWorld.struts.resource.ApplicationResources"&gt;&lt;/message-resources&gt;<br />
<p>这句话，这句定义了Struts的资源文件在国际化中我们会经常用到,同时在fail.jsp中我们也用到了
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'>http://struts.apache.org/tags-bean"</a> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'>http://struts.apache.org/tags-html"</a> prefix="html" %&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;请输入完整的信息&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;bean:message key="helloWorld.userNameRequire"/&gt;&lt;br /&gt;<br />
&lt;bean:message key="helloWorld.worldToSayRequire"/&gt;&lt;br /&gt;<br />
&lt;a href="index.jsp" &gt;转到转入页面&lt;/a&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
<p>&lt;bean:message key="helloWorld.userNameRequire"/&gt;&lt;br /&gt;<br />
&lt;bean:message key="helloWorld.worldToSayRequire"/&gt;&lt;br /&gt;
<p>下面为properties.文件的内容
<blockquote>
<p>helloWorld.userNameRequire=请填写用户名<br />
helloWorld.worldToSayRequire=请填写你想说的话</p>
</blockquote>
<p>key 与其是对应的
<p>到这里，我们大约看到了struts的一小部分的内容了，在后面我们会继续讲<br />
<br />
例子下载<br />
http://winds8.googlepages.com/Struts_HelloWorld.war<br />
http://winds8.googlepages.com/servlet_Test_project.war</p>
<img src ="http://www.blogjava.net/sakrua/aggbug/159183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sakrua/" target="_blank">风の使者</a> 2007-11-08 22:43 <a href="http://www.blogjava.net/sakrua/articles/159183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跟菜鸟学STRUTS（1）</title><link>http://www.blogjava.net/sakrua/articles/159181.html</link><dc:creator>风の使者</dc:creator><author>风の使者</author><pubDate>Thu, 08 Nov 2007 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/sakrua/articles/159181.html</guid><wfw:comment>http://www.blogjava.net/sakrua/comments/159181.html</wfw:comment><comments>http://www.blogjava.net/sakrua/articles/159181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sakrua/comments/commentRss/159181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sakrua/services/trackbacks/159181.html</trackback:ping><description><![CDATA[<p>Struts 的MVC
<p><a>1</a>．Model 1 和Model 2简介
<p>我们在开发Web应用时经常提到的一个概念是Model 1/Model 2，那么到底它是什么意思呢？其实它是对采用JSP技术构成Web应用的不同模型的描述。下面对这个概念做一个简单的介绍。
<p>Model 1
<p>在使用JAVA技术建立Web应用的实例中，由于JSP技术的发展，很快这种便于掌握和可实现快速开发的技术就成了创建Web应用的主要技术。JSP页面中可以非常容易地结合业务逻辑(jsp:useBean)、服务端处理过程（jsp:scriplet）和HTML(&lt;html&gt;)，在JSP页面中同时实现显示，业务逻辑和流程控制，从而可以快速地完成应用开发。现在很多的Web应用就是由一组JSP页面构成的。这种以JSP为中心的开发模型我们可以称之为Model 1。
<p>当然这种开发模式在进行快速和小规模的应用开发时，是有非常大的优势，但是从工程化的角度考虑，它也有一些不足之处：
<p>1. 应用的实现一般是基于过程的,一组JSP页面实现一个业务流程，如果要进行改动，必须在多个地方进行修改。这样非常不利于应用扩展和更新。
<p>2. 由于应用不是建立在模块上的, 业务逻辑和表示逻辑混合在JSP页面中没有进行抽象和分离。所以非常不利于应用系统业务的重用和改动。
<p>考虑到这些问题在开发大型的Web应用时必须采用不同的设计模式――这就是Model2
<p>Model 2
<p>Model 2 表示的是基于MVC模式的框架。MVC是Model－View－Controller的简写。"Model" 代表的是应用的业务逻辑（通过JavaBean，EJB组件实现）， "View" 是应用的表示面（由JSP页面产生），"Controller" 是提供应用的处理过程控制（一般是一个Servlet），通过这种设计模型把应用逻辑，处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model 1的不足。
<p>Model 2具有组件化的优点从而更易于实现对大规模系统的开发和管理，但是开发MVC系统比简单的JSP开发要复杂许多，它需要更多的时间学习和掌握。
<p>1. 必须基于MVC组件的方式重新思考和设计应用结构。原来通过建立一个简单的JSP页面就能实现的应用现在变成了多个步骤的设计和实现过程。
<p>2. 所有的页面和组件必须在MVC框架中实现，所以必须进行附加地开发工作。
<p>在开始讲struts 前,我们先了解一下servlet 为什么要看servlet 看到最后就知道了
<p>1、 环境的搭建就pass了
<p>2、 open eclipse and follow me
<p>create new project
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqFGrxwvykVOKzbU1Gn1_9phr7gX5iZXnDXRxsRhEpqBG3KtM_5vnSAOCjbVQqC3TZA"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="238" alt="clip_image002[5]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqFc5lwJYcfsxZ6WbSsJMlJVOAC7MduK51CpF098q_33PDs_NVHD1OrqKLZgwbnnJ_Q" width="388" border="0" /></a>
<p>新建一个Dynamic Web Project named servlet_Test_project
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqG11eTV-SLRR8RWR2hFp8utCiLMaILn8fGjXJUHUqWj90IawyUFV5NH1NPghsyoDaw"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="316" alt="clip_image0045" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqEKkVrCs5KZMz9jBNmsC4oGVV2hE6QSIOlBcJpkEDr8sTc5BGAlFRQF9JHF4T7tBvg" width="444" border="0" /></a>
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqE-0hxybL7pxg-9xQVf13UJfqB9GZttxMZRLd63dNk81AntVigLeZy5In1f8246cr0"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="316" alt="clip_image0065" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHUVtuzKnDzhO2cBVbkudGjY4ZIH-qC_leXMjZkdHFgcCChPZ3GavZjVEcx_ohuwT8" width="460" border="0" /></a>
<p>我用的是jdk1.6
<p>接着next &#8230;.next完成
<p>转到PackageExplor 我们看一下project 的目录结构
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqHFUUDIrTpryoxmuv3b5_cg437owLD4RgVg08dBIhu5FJpy9IiQntX37dkHKLho3To"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="348" alt="clip_image008[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqFwmk5NRj2mnmH03sacS0k_yNbob566RH7t1l0Ab1iXUMzzwQXi40MuAeT_4LS_Xzo" width="358" border="0" /></a>
<p>两个jar的环境
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqFXm-mPdb21r0lbDt3EExBysFoFJt_rlDRMYqV-2EANnIJJStvJUqHVmfxp8B5Vo2Q"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="39" alt="clip_image010[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqFHTmZHggvk4vpPjbriBXYU8tJUZkB--yBTgBpDx7Gwd9mvv25kSAWP0UAGRZDiKL0" width="285" border="0" /></a>
<p>源文件目录
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqF3lAsJ7y2zChRC3RUcxwV7lpa8mfK4jn9ExefelIf-_pT8MKL34R3z0IWnvbscbps"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="17" alt="clip_image012[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqEcnIFtuHKK-7o_uS_At1dc9bkGuh46rhV-hL-noJ2H478MGWYe2mhexQma7WhL4qU" width="349" border="0" /></a>
<p>输出目录，也就是class的目录了（不多说了，不知道class是什么，学j2se吧）
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqEMHsSOYwXolhxuF32MlK6ZR8LBHQc8z9CvQNvXmo1R1bgiv1bBwMm_Zie92mtL_Og"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="20" alt="clip_image014[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqGqHg7aKltFHmMma02dJLszsPFf1uIbaR3VHr7-_Kfr9NvOaeeKfSaVvAKA1du9PqU" width="373" border="0" /></a>
<p>Web目录
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqE9ZVDBQxz_vp8DWDlIzpQF0PREwH68onUmvhfqIKkDq1kKYisd9rzymPVXIKUXG_w"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="108" alt="clip_image016[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHr0G0tVTfot6M5zclpTxaJ8UpvX7VI7et8RDei7VUECLYAbYzPQ6lycXCGJAxcb1k" width="351" border="0" /></a>
<p>其中jsp等文件放在WebContent目录内（下面两个Web-INF、META-INF除外）
<p>Lib目录为我们工程中用到的jar包的目录
<p>下面为Projct explor下看到的目录结构，我们可以看看他的不同
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqFy2fYe0MinRJYsR2V73rOeUdCQk2O9ov5NjzIHoEjQ6Li9uavZUO7t7mMDMtyLc2Q"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="348" alt="clip_image018[7]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqEHFYe5d5UbGQp4hvp8Li4dQ4wIWqKpYhnrtQBwog7JwWqG6mPzi_gMdgH5OnL6OLk" width="270" border="0" /></a>
<p>好，少来费话，新建一个servlet 先
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqFIXvPhcg3Vj8H3vz1P2icLm85ptS97CNB6J_PNmHxPymI-pmG4ncr14ib7wjkouxE"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="348" alt="clip_image020[7]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqGQYHCLu79_bS0rH1fMDBjBzzgkat2TCuyrfIxSdH7k7hdzOWg7ZexMeenpmTWIWZs" width="387" border="0" /></a>
<p>下面看图
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqFfTSguJ0UHSyavqI7u7UQq1DcnLqZS--oAs5o220gjjujRpSVS4DMsVh9gz5oL5AA"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="348" alt="clip_image022[5]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHtDCu_E8B_Spp4UaHeMhpuH5SWsU6FKFOGgBkIwdFInFRja4Hezot0EfrP8rgis8Q" width="384" border="0" /></a>
<p>包名为sakrua ，lass名为ServletHelloWorld，Superclass 为javax.servlet.http.HttpServlet
<p>只有javax.servlet.http.HttpServlet这个父类吧，到下面再说
<p>接着 你可以点完成，我们next看看有什么
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqHfTrFZSU2zDi8sjvl2n2bMj9LyE3mwMCIU5Vhgl5fNqjZHZRPp0sUI895ScKT-6VA"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="316" alt="clip_image0244" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqEo5NYWoB_GpbdREnxlBnBTaIMMptRQ5LvOAfUDzIHVoeOMEd2VhLs2olmkgrzfy8M" width="381" border="0" /></a>
<p>呵呵 ，好像没有什么，我们点完成（是finish 不要告诉我找不到完成，<a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqHMt7Aci6gASshgX6fl7tKJ5Um-toI5pXXZ95f5lG_JjMjcy-ILM71aVsGbTAe8MXY"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="21" alt="clip_image026[6]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqE1guySF3a0u5HkCBccKaYuPfERUbiFrNW3nosHUdVxF1FRiCaBYp4gggVzV7MLto8" width="23" border="0" /></a>）
<p>好，eclipse 为我们已经完成了大部分的代码了，不过我们先不看代码先（习惯先在后了）
<p>我们再看看 Projct explor 有什么不同，不要让我说了，自己能看到的<a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqGmjwSvuXWtJHf64bS9G4VeCK0V-LJIts1d3CyyiZNoQANQ9EN0XxccsRnGiiBlIcU"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="21" alt="clip_image026[7]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqGIaPSXChsci8suDiVP5VsKZ5yI9Mi67PGervn_Ed5ZAumlLc9qV9mfCkrR8twnkmk" width="23" border="0" /></a>
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqG-aIZH30KclY7MXL3HLTKTpwhS95n3BbO2OWUaVRmmhOhENxbBQhZIb2J5vuugLX8"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="186" alt="clip_image028[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqH0yMIpAQfzJECaA7YPEvxMUsegHHZjZrtYwKBpK6KCeywOjgk4sl62SSonDRRpSTI" width="368" border="0" /></a>
<p>其实这是web.xml文件中的内容，我们去 see see
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app id="WebApp_ID" version="2.4" xmlns="<a href='http://java.sun.com/xml/ns/j2ee"' href_cetemp='http://java.sun.com/xml/ns/j2ee"'>http://java.sun.com/xml/ns/j2ee"</a> xmlns:xsi="<a href='http://www.w3.org/2001/XMLSchema-instance"' href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a> xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href='http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"' href_cetemp='http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"'>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</a>&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;display-name&gt;servlet_Test_project&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--servlet 的--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;sakrua 的第一个servlet&lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;ServletHelloWorld&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- servlet的名字 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;ServletHelloWorld&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- servlet 类 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;sakrua.ServletHelloWorld&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 跟上面对应的 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;ServletHelloWorld&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- ie中输入的访问路径 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/ServletHelloWorld&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- servlet 的 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- 其它的先不理 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;
<p>应该中国人都看得明
<p>下面我们去看看Servlet 的代码
<p>package sakrua;
<p>import java.io.IOException;<br />
import java.io.PrintWriter;
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;
<p>&nbsp;public class ServletHelloWorld extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {<br />
&nbsp;&nbsp; static final long serialVersionUID = 1L;<br />
&nbsp;&nbsp;&nbsp; public ServletHelloWorld() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}
<p>好我们加点东西上去看看
<p>package sakrua;
<p>import java.io.IOException;<br />
import java.io.PrintWriter;
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;
<p>&nbsp;public class ServletHelloWorld extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {<br />
&nbsp;&nbsp; static final long serialVersionUID = 1L;<br />
&nbsp;&nbsp;&nbsp; public ServletHelloWorld() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
<blockquote>
<p>PrintWriter out = response.getWriter(); <br />
out.println("&lt;html&gt;&lt;head&gt;&lt;title&gt;servlet Example by sakrua &lt;/title&gt;&lt;/head&gt;&lt;body&gt;"); <br />
out.println("&lt;h3&gt;&lt;font color=red&gt;servlet is here&lt;/font&gt;&lt;/h3&gt;"); <br />
out.println("&lt;/body&gt;&lt;/html&gt;");</p>
</blockquote>
<p><br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void destroy() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("It is destroy");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.destroy();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void init() throws ServletException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("It is started");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.init();<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}
<p>右键选择
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqG8FV2aud0U9DAZVUFLaeUqI9P6FcEO2NYtq16kph4NI7PerjCWha0bGAUhnb68nqA"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="114" alt="clip_image030[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqGcBdRPPNwkHlDRKrfwvuIfxnyY9uqPMg9yz0rX1oVPvBUBO7jNt710RZmaSAqJf8k" width="388" border="0" /></a>
<p>在ie看到
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqE05yjtJdYfk6XjrJukJcT2o0aGEBsFibzkTkm2mVdHiELS_-LuRyOBFrhWi-BtM9o"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="225" alt="clip_image032[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqG689QiuD9CXPlC5MEvyn6ry1T-IYu8q-WuLpO6n7ERi70AEGuKl6C6gucKuCsYg00" width="382" border="0" /></a>
<p>Ok !
<p>下面我们具体说一下
<p>Servlet是一个接口，位于 javax.servlet.Servlet，它规定了每个Servlet所必须实现的方法。实际应用时我们需要从 javax.servlet.GenericServlet 和 javax.servlet.http.HttpServlet 两个抽象类继承出自己的Servlet类，并实现所需的功能。这几个类的关系如下（绿色斜体字为抽象类）：
<p><a href="http:///"><img height="292" alt="clip_image034[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHjae8ACi7tU2bsx2MssYQoAs1uD3JoTuxJRD4brbYtmNy8Y5J58DWPvIFJI_N0KyA" width="388" /></a>
<p>上图中，Servlet依赖于ServletRequest和ServletResponse接口，这两个接口负责为Servlet接受和发送信息。 HttpServlet也类似。
<p><strong>Servlet</strong><strong>接口</strong>
<p>javax.servlet.Servlet接口包含以下的方法：
<p>init()
<p><strong>void init(ServletConfig config) throws ServletException</strong>
<p>init方法用于初始化，在Servlet启动时调用。
<p>service()
<p><strong>void service(ServletRequest req, ServiceResponse res) throws ServletException, IOException</strong>
<p>Servlet通过这个方法，从req获得客户端请求，处理并生成结果，再通过res发送给客户端。
<p>destroy()
<p><strong>void destroy()</strong>
<p>Servlet销毁时执行的方法。
<p>getServletInfo()
<p><strong>String getServletInfo()</strong>
<p>将Servlet的信息通过字符串返回。
<p>getServletConfig()
<p><strong>ServletConfig getServletConfig()</strong>
<p>获取包含Servlet各种信息的ServletConfig对象。
<p>当某个Servlet第一次被请求时，服务器（Servlet容器）会生成该Servlet并调用它的init()方法，再调用其service()方法处理请求。处理结束后该Servlet会常驻于容器中，下一个请求则不再重新生成Servlet，而是直接调用常驻的Servlet对象的service()方法。服务器停止时，会调用该Servlet的destroy()方法。
<p>因此，在Servlet的一个生命周期中，init()和destroy()仅会被调用一次，而service()则会被调用多次。
<p>―――
<p>好我们又看看这样
<p>package sakrua;
<p>import java.io.IOException;<br />
import java.io.PrintWriter;
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;
<p>&nbsp;public class ServletHelloWorld extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {<br />
&nbsp;&nbsp; static final long serialVersionUID = 1L;<br />
&nbsp;&nbsp;&nbsp; public ServletHelloWorld() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out = response.getWriter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;html&gt;&lt;head&gt;&lt;title&gt;servlet Example by sakrua &lt;/title&gt;&lt;/head&gt;&lt;body&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;h3&gt;&lt;font color=red&gt;这就是Servlet 呵呵！&lt;/font&gt;&lt;/h3&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;/body&gt;&lt;/html&gt;");<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void destroy() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("It is destroy");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.destroy();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void init() throws ServletException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("It is started");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.init();<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}
<p>看看控制台，所有都ok（close 后才会看到 Is is Destroy）
<p>再看看ie，乱码了！晕
<p>―――
<p><strong>GenericServlet</strong><strong>抽象类</strong>
<p>javax.servlet.GenericServlet为我们实现了Servlet接口的大部分方法，除了service()方法之外。因此，我们在制作自己的Servlet时，只需要继承GenericServlet并重载service()方法即可。
<p><strong>HttpServlet</strong><strong>类</strong><strong></strong>
<p>HttpServlet继承了GenericServlet，不过它也是一个抽象类，不能直接使用，只能继承它。
<p>HttpServlet中常用的方法有两个：
<p>doGet
<p>void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
<p>当浏览器用GET方式访问时，该方法被调用。
<p>doPost
<p>void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
<p>当浏览器用POST方式访问时，该方法被调用。
<p>这两个函数内部的处理方法基本上与上一节介绍的GenericServlet.service()函数相同。
<p>另外其他的HTTP请求也都有相应的方法：
<p>HTTP请求类别
<p>HttpServlet的方法
<p>GET
<p>doGet()
<p>POST
<p>doPost()
<p>HEAD
<p>doHead()
<p>PUT
<p>doPut()
<p>DELETE
<p>doDelete()
<p><strong>HttpServletRequest</strong>
<p>doGet()和doPost()函数的两个参数为 HttpServletRequest和HttpServletResponse对象。
<p>HttpServletRequest接口表示浏览器请求，你可以通过这个类获取浏览器发送到服务器的任何信息。
<p>getParameter
<p>String getParameter(String name)
<p>获取指定变量名name所对应的参数值。该方法实际上为父接口 javax.servlet.ServletRequest的方法。如果是GET请求则获取查询字符串后的参数，POST请求则获取&lt;form&gt;表单中的参数。类似于PHP的$_GET和$_POST数组。
<p>getParameterValues
<p>String[] getParameterValues(String name)
<p>这个方法与getParameter()类似。当你要获取&lt;input type="check"&gt;这类会返回多个值的表单属性时，就应当用这个方法。
<p>getMethod
<p>String getMethod()
<p>返回字符串"GET"或"POST"。
<p>getRequestURI
<p>String getRequestURI()
<p>获取请求的URI（不包括查询字符串）。相当于PHP的$_SERVER['REQUEST_URI']。
<p>getServletPath
<p>String getServletPath()
<p>获取Servlet的路径。相当于PHP的$_SERVER['PHP_SELF']。
<p>getPathInfo
<p>String getPathInfo()
<p>获取PathInfo。相当于PHP的$_SERVER['PATH_INFO']。
<p>setCharacterEncoding
<p>void setCharacterEncoding(String new)
<p>设置请求的编码。需要处理汉字时务必要通过该方法设置正确的字符编码，否则将无法正确读取浏览器发过来的文字。
<p>还有好多有用的方法大家可以自己去参考接口文档。
<p><strong>HttpServletResponse</strong>
<p>HttpServletResponse接口则用于控制服务器发送给客户端的内容，相当于PHP的echo、header等函数。
<p>setContentType
<p>void setContentType(String type)
<p>设置返回值的类型。通常的HTML内容可设置为"text/html; charset=UTF-8"等，而动态生成的图片则可以设置为"image/gif"等。输出汉字之前，务必要通过该方法指定输出的字符编码。相当于在PHP中写 header("Content-Type: image/gif")。
<p>ServletOutputStream
<p>ServletOutputStream getOutputStream() throws IOException
<p>向客户端发送二进制数据时，需要通过此方法获取输出流。
<p>getWriter
<p>PrintWriter getWriter() throws IOException
<p>向客户端发送文本数据时，需要通过此方法获取输出流。
<p>看到这里应该知道为什么乱码了吧
<p>加上这两句
<p>response.setCharacterEncoding("GBK");
<p>response.setContentType("text/html; charset=GBK");
<p>几乎所有的Web开发语言都支持Session功能，Servlet也不例外。 Servlet/JSP中的Session功能是通过<strong>作用域</strong><strong>(scope)</strong>这个概念来实现的。
<p>作用域分为四种，分别为：
<p>page
<p>在当前页面有效(仅用于JSP中)
<p>request
<p>在当前请求中有效
<p>session
<p>在当前会话中有效
<p>application
<p>在所有应用程序中有效
<p>好，servlet 讲完了，为什么要讲这个呢，我们在以后才会体会到
<p>会到Struts 中，现在，struts 有两个版本 struts 1.x 和struts 2.x , 2 .x 是webwork 的化身,我们现在讲的是1.x .现在来一个struts 的hello world
<p>新建一个同样的工程(如果用myeclipse 有点不一样)
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqFeb8XeJ4TMXnPTkLcDNbm3b0MM9E9i71JRmt-Cb6ZnxhNXlM9q8looEXppub4f6_8"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="320" alt="clip_image036[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqHD5gkMRKHTX5-uHgYrLPhdiIXzEWmDuahkbc3s1VOL8Ca2LGB7MLS0gPwy-Cw2zI8" width="311" border="0" /></a>
<p>把struts 的这些包copy到lib目录中
<p>下面是step by step
<p>1、修改web.xml文件
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app id="WebApp_ID" version="2.4" xmlns="<a href='http://java.sun.com/xml/ns/j2ee"' href_cetemp='http://java.sun.com/xml/ns/j2ee"'>http://java.sun.com/xml/ns/j2ee"</a> xmlns:xsi="<a href='http://www.w3.org/2001/XMLSchema-instance"' href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a> xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href='http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"' href_cetemp='http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"'>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</a>&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;display-name&gt;Struts_HelloWorld by sakrua&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- the struts config --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;
<p>&nbsp;&nbsp;&nbsp; &lt;!-- Standard Action Servlet Mapping --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- end struts config --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;
<p>看不了没，跟servlet 是不是有点相似昵，以后我们会看到更加清楚（struts 的本质，你可以自己想想）
<p>看到这里我们要有一个struts-config.xml文件, Now 我们来写一个
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href='http://struts.apache.org/dtds/struts-config_1_3.dtd"' href_cetemp='http://struts.apache.org/dtds/struts-config_1_3.dtd"'>http://struts.apache.org/dtds/struts-config_1_3.dtd"</a>&gt;
<p>&lt;struts-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="helloWorldForm" type="org.helloWorld.struts.form.HelloWorldForm"&gt;&lt;/form-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action path="/hello" name="helloWorldForm" type="org.helloWorld.struts.action.HelloWorldAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/helloworld/success.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="fail" path="/helloworld/fail.jsp"&gt;&lt;/forward&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;message-resources parameter="org.helloWorld.struts.resource.ApplicationResources"&gt;&lt;/message-resources&gt;<br />
&lt;/struts-config&gt;
<p>好，我们来看看这个XML文件，我们发现有&lt;form-bean&gt;和&lt;action&gt;现在我们先不理what is this
<p>我们看到type中都有一个类，我们先来完成这个类
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqHjRHiOTsapUPFNCTX-g-sqReJjJjg57Ssn4QxiFKLlcy4ZFf7wq-8ScWlkxjovCAc"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="348" alt="clip_image038[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqGYMKUnz2TrXZ-8KbZ7JRGo3oGcyRoi70S5sDWE4a6NQsfYMKSoFLUtN9-LmxJ-EAs" width="313" border="0" /></a>
<p>从ActionForm 类中继成
<p>package org.helloWorld.struts.form;
<p>import javax.servlet.http.HttpServletRequest;
<p>import org.apache.struts.action.ActionErrors;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionMapping;
<p>/**<br />
&nbsp;* struts helloworld 的action form<br />
&nbsp;* @author sakrua<br />
&nbsp;* email :winds8@gmail.com&nbsp; msn:wind_s8@hotmail.com<br />
&nbsp;* 2007年11月5日<br />
&nbsp;*/<br />
public class HelloWorldForm extends ActionForm {
<p>&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = -3372095237053639793L;
<p>&nbsp;&nbsp;&nbsp; //一个javabean 从ActionForm继成<br />
&nbsp;&nbsp;&nbsp; //用户名<br />
&nbsp;&nbsp;&nbsp; private String userName;<br />
&nbsp;&nbsp;&nbsp; //想说的话<br />
&nbsp;&nbsp;&nbsp; private String worldToSay;<br />
/*<br />
&nbsp;&nbsp;&nbsp; //validate <br />
&nbsp;&nbsp;&nbsp; public ActionErrors validate(ActionMapping mapping,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionErrors errors = new ActionErrors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //暂时我们不理这个，以后再说<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(userName.equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(worldToSay.equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return super.validate(mapping, request);<br />
&nbsp;&nbsp;&nbsp; }<br />
*/<br />
&nbsp;&nbsp;&nbsp; //下面为set get function<br />
&nbsp;&nbsp;&nbsp; public String getUserName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return userName;<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public void setUserName(String userName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userName = userName;<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public String getWorldToSay() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return worldToSay;<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public void setWorldToSay(String worldToSay) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.worldToSay = worldToSay;<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<p>下面是action
<p>package org.helloWorld.struts.action;
<p>import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;
<p>import org.apache.struts.action.Action;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import org.helloWorld.struts.form.HelloWorldForm;<br />
/**<br />
&nbsp;* struts helloworld 的action form<br />
&nbsp;* @author sakrua<br />
&nbsp;* email :winds8@gmail.com&nbsp; msn:wind_s8@hotmail.com<br />
&nbsp;* 2007年11月5日<br />
&nbsp;*/<br />
public class HelloWorldAction extends Action {
<p>&nbsp;&nbsp;&nbsp; private static final String FAIL ="fail";<br />
&nbsp;&nbsp;&nbsp; private static final String SUCCESS ="success";<br />
&nbsp;&nbsp;&nbsp; //action中所有的请求都会由这个函数处理<br />
&nbsp;&nbsp;&nbsp; public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从actionForm 中取数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HelloWorldForm helloWorldForm =(HelloWorldForm)form;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String userName = helloWorldForm.getUserName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String worldToSay = helloWorldForm.getWorldToSay();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果没有协作输入转到错误页面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(userName.equals("")||worldToSay.equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward(FAIL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //转到成功页面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward(SUCCESS);<br />
&nbsp;&nbsp;&nbsp; }
<p>}
<p>还有两个jsp
<p>Index.jsp
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
<p>&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'>http://struts.apache.org/tags-bean"</a> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'>http://struts.apache.org/tags-html"</a> prefix="html" %&gt;
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;Welcome　you to use this demo&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;
<p>&lt;html:form action="/hello"&gt;<br />
请输入你的用户名：&nbsp;&nbsp;&nbsp; <br />
&lt;html:text property="userName"&gt;&lt;/html:text&gt;&lt;br /&gt;<br />
请输入你想说的话：<br />
&lt;html:textarea property="worldToSay"&gt;&lt;/html:textarea&gt;&lt;br /&gt;<br />
&lt;html:submit value="submit"&gt;&lt;/html:submit&gt;<br />
&lt;/html:form&gt;
<p>&lt;/body&gt;<br />
&lt;/html&gt;
<p>Fail.jsp
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'>http://struts.apache.org/tags-bean"</a> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'>http://struts.apache.org/tags-html"</a> prefix="html" %&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;请输入完整的信息&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;bean:message key="helloWorld.userNameRequire"/&gt;&lt;br /&gt;<br />
&lt;bean:message key="helloWorld.worldToSayRequire"/&gt;&lt;br /&gt;<br />
&lt;a href="index.jsp" &gt;转到转入页面&lt;/a&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
<p>Success.jsp
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-bean"' href_cetemp='http://struts.apache.org/tags-bean"'>http://struts.apache.org/tags-bean"</a> prefix="bean" %&gt;<br />
&lt;%@ taglib uri="<a href='http://struts.apache.org/tags-html"' href_cetemp='http://struts.apache.org/tags-html"'>http://struts.apache.org/tags-html"</a> prefix="html" %&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' href_cetemp='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br />
&lt;html xmlns="<a href='http://www.w3.org/1999/xhtml"' href_cetemp='http://www.w3.org/1999/xhtml"'>http://www.w3.org/1999/xhtml"</a>&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;Welcome you &lt;bean:write name="helloWorldForm" property="userName" /&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;bean:write name="helloWorldForm" property="userName" /&gt; 你想对我们说的是&lt;bean:write name="helloWorldForm" property="worldToSay" /&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
<p>好写完了
<p>打开ie输入http://localhost:8080/Struts_HelloWorld/
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqEo3Wx1tXdqUKy8WvjQu37RTjT-nUFEtKXNw9sX2YiMZTrPWwQQQHsiRuFQ227DG8w"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="clip_image040[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqEwE1Iwp3ca8uAUrOtzjMDFAoh9hCBNuvNRB_83Xj4fYpJ9pIB6BUUe4IR9AaXnXcY" width="369" border="0" /></a>
<p><a href="http://byfiles.storage.msn.com/y1pnnuPrErVqqE0YJNrOiAb4yW19wj1xPzhVilyt65i02AYT0rI9KPhZ2Sr4WdrKZlHvlKbaXrBg60"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="162" alt="clip_image042[4]" src="http://byfiles.storage.msn.com/y1pnnuPrErVqqFV3ARr9JlmXJQ5uXS8y4_53hsmfky025EDohttfD0h2JNx9NvghohA5RRu-N_cJOk" width="388" border="0" /></a>
<p>正常运行中
<p>在这个过程中我们做了什么呢，我们已经完成了我们的第一个struts 程序（废话）
<p>具体做了什么　
<p>To be continued</p>
 <img src ="http://www.blogjava.net/sakrua/aggbug/159181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sakrua/" target="_blank">风の使者</a> 2007-11-08 22:39 <a href="http://www.blogjava.net/sakrua/articles/159181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>