import org. apache struts action. *; importjavax.servlet.http oublic class RegisterAction extends Action public ActionForward perform (ActionMapping mapping, Httpservletrequest reg HttpservletrespOnse res)i / Cast the form to the Register Form RegisterForm rf =(RegisterForm) form; string username rf. getUsername( assword1 () String password rf. getPassword2()i //@2Apply business logic if (password1 equals(password))( //Return Action Forward for success UserDirectory. getInstance ().setUser (username, password1); eturn mapping. findForward("success "); y catch (UserDirectoryException e) return mapping. findForward("failure "); // Return Action Forward for failure eturn mapping. findForward ("failure" 代码清单12 RegisterAction. Java 将文件存放在< Base Directory> /webapps/register/ WEB-INF/ classes/app目录下。 虽然很简单,但是我们的 RegisterAction却做了 Action的典型事情。在①,输入 Action Form被转换为 RegisterForm。我们就可以获取 username, password1,和 password2的内容。如果两次密码匹配②,我们将用户添加到 UserDirectory中③,并返回 与 success对应的 Action Forward o UserDirectory是一个 helper类,它记录 usernames和 passwords到一个标准的属性文件之中。否则,返回与 ailure对应的 Action Forward 当我们在下一步创建 struts-config文件时,我们将标识代表 success8和 failure的 Action Forward 对象。 注:Smsl.1提供另外一个进入方法,名为 execute。这个方法提供更好的意外处理,但不和 Struts I.0 的 erform方法一样。在这里我们将使质 erform方法,以使我们的例子可以运行在两个版本之下。 14.3.3创 STruts量文件( struts- config. xn
import org.apache.struts.action.*; import javax.servlet.http.*; import java.io.*; public class RegisterAction extends Action { public ActionForward perform (ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) { // ①Cast the form to the RegisterForm RegisterForm rf = (RegisterForm) form; String username = rf.getUsername(); String password1 = rf.getPassword1(); String password2 = rf.getPassword2(); // ②Apply business logic if (password1.equals(password2)) { try { // ③Return ActionForward for success UserDirectory.getInstance().setUser(username,password1); return mapping.findForward("success"); } catch (UserDirectoryException e) { return mapping.findForward("failure"); } } // ④Return ActionForward for failure return mapping.findForward("failure"); } } 代码清单 1.2 RegisterAction.Java 将文件存放在<Base Directory>/webapps/register/WEB-INF/classes/app 目录下。 虽然很简单,但是我们的RegisterAction 却做了Action 的典型事情。在①,输入 ActionForm 被转换为RegisterForm。我们就可以获取username, password1, 和 password2的内容。如果两次密码匹配②,我们将用户添加到 UserDirectory 中③,并返回 与success 对应的ActionForward 。UserDirectory 是一个 helper 类,它记录usernames 和 passwords 到一个标准的属性文件之中。否则,返回与failure 对应的ActionForward 。 当我们在下一步创建struts-config 文件时,我们将标识代表success和 failure的ActionForward 对象。 注:Struts 1.1提供另外一个进入方法,名为execute。这个方法提供更好的意外处理,但不和Struts 1.0 的perform方法一样。 在这里我们将使用perform 方法,以使我们的例子可以运行在两个版本之下。 1.4.3.3 创建Struts 配置文件 (struts-config.xml)
struts- config. xml文件包含了 Action Servlet需要用来处理对应用请求的详细信息。为了 练习,我们创建一个空壳的 struts-config. xml文件。你需要做的是填入一些细节 文件存储在< BaseDirectory>/ webapps/register∧ WEB-INF/目录下,需要改变的是 首先,添加/ register到< action>元素的path属性。 Action Servlet使用Web容器转发 给它的UR来选择正确的 Action类。URI和 ActionMapping的path属性匹配。这里,请求 给出的路径必须在去除前缀和后缀后和/ register匹配。前缀或后缀通常是/ao/或 者do。我们的练习中,将后缀设置为do。当URI具有一个do扩展名,容器就知道将请 求转发给 Action Servlet. Struts会自动去除扩展名,所以我们在配置时不必加上它们。 下一步添加 registerForm 到< action>元素的name属性。< action>元素使用name属性来识别哪个 Action Forn 将被创建,并将提交的表单组装给他 然后,添加 app.RegisterAction 到< action>元素的type属性。 Action Servlet使用这个属性来识别将用来处理请求的 tion类 接下来,在< forward>元素下,添加 success 到name属性,并且 /success. html 到path属性。最后,再在另一个< forward>下添加 failure 到name属性, /failure. html 到path属性。 这些元素将创建 Action Forward对象,我们将用它来选择程序的控制流。< forward>元 素定义了在 Register Action中使用的逻辑名称之间的关联。 Struts- config. xml源代码见代码1.3。 <?xml version="1.0"encoding="ISo-8859-1"?> <l DOCTYPE struts-config PUBLIC //Apache Software Foundation//DTD Struts Configuration 1.0//EN http://jakarta.apacheorg/struts/dtds/struts-config1o.dtd"> <struts-config> <form-bean name="registerForm" type="app. RegisterForm"/> action -mappings> type="app. RegisterAction" <forward name="success" path="/success. html"/
struts-config.xml 文件包含了ActionServlet 需要用来处理对应用请求的详细信息。为了 练习,我们创建一个空壳的struts-config.xml 文件。你需要做的是填入一些细节。 文件存储在<BaseDirectory>/webapps/register/WEB-INF/目录下,需要改变的是: 首先,添加/register 到<action>元素的 path 属性。ActionServlet 使用Web容器转发 给它的URI来选择正确的Action 类。URI 和ActionMapping 的path 属性匹配。这里,请求 给出的路径必须在去除前缀和后缀后和/register 匹配。前缀或后缀通常是/do/ 或 者 .do。 我们的练习中,将后缀设置为.do。当URI 具有一个.do 扩展名,容器就知道将请 求转发给ActionServlet。Struts会自动去除 扩展名,所以我们在配置时不必加上它们。 下一步添加 registerForm 到<action> 元素的 name 属性。<action> 元素使用name 属性来识别哪个ActionForm 将被创建,并将提交的表单组装给他。 然后,添加 app.RegisterAction 到<action> 元素的 type 属性。ActionServlet 使用这个属性来识别将用来处理请求的 Action 类。 接下来,在<forward> 元素下,添加 success 到 name 属性,并且 /success.html 到 path 属性。最后,再在另一个<forward>下添加 failure 到 name 属性, /failure.html 到 path 属性。 这些元素将创建ActionForward 对象,我们将用它来选择程序的控制流。<forward> 元 素定义了在RegisterAction中使用的逻辑名称之间的关联。 Struts-config.xml 源代码见代码1.3。 <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"> <struts-config> <form-beans> <form-bean name="registerForm" type="app.RegisterForm"/> </form-beans> <action-mappings> <action path="/register" type="app.RegisterAction" name="registerForm"> <forward name="success" path="/success.html"/>
<forward name="failure" path="/failure. html"/> </action </struts-config> 代码清单1.3 Struts- Config XML Struts框架将 struts-config. xml文件视为部署描述符使用。它使我们可以创建和改变 ActionMapping和路径的关联而不用重新编译java类。我们也可以改变页面之间的连接,而 不改变JSP模板。 14.34创建页面 最后的步骤是创建 success. htm, failure htm,以及 register. Jsp页面。 3个文件的源代码如下见代码清单1.4,1.5,1.6。存放在< Base Directory>/ webapps/register 目录下。 <HTML> <HEAD> TITLE>SUCCESS</TITLE> <P><A href="register. jsp">try another?</A></P> 代码清单14 Success hTm <TITLE>FAILURE</TITLE> Registration failed! P><A href="register. jsp">try again?</A></P </BODY> 代码清单1.5 Failure htn 号@tag1 ib uri="/wEB-INF/ struts-form.t1d” prefix="form” <form: form action="register. do">
<forward name="failure" path="/failure.html"/> </action> </action-mappings> </struts-config> 代码清单 1.3 Struts-Config.XML Struts框架将struts-config.xml 文件视为部署描述符使用。它使我们可以创建和改变 ActionMapping 和路径的关联而不用重新编译java类。我们也可以改变页面之间的连接,而 不改变JSP模板。 1.4.3.4 创建页面 最后的步骤是创建success.html, failure.html, 以及register.jsp 页面。 3个文件的源代码如下,见代码清单1. 4,1. 5,1.6。存放在<Base Directory>/webapps/register 目录下。 <HTML> <HEAD> <TITLE>SUCCESS</TITLE> </HEAD> <BODY> Registration succeeded! <P><A href="register.jsp">try another?</A></P> </BODY> </HTML> 代码清单 1.4 Success HTML <HTML> <HEAD> <TITLE>FAILURE</TITLE> </HEAD> <BODY> Registration failed! <P><A href="register.jsp">try again?</A></P> </BODY> </HTML> 代码清单 1.5 Failure.html <%@ taglib uri="/WEB-INF/struts-form.tld" prefix="form" %> <form:form action="register.do">
UserName: <form: text property="username"/><br> enter password: <form: password property="password"/>cbr> re-enter password: <form: password property="password"/><br> submit value="Register"/> </form: form> 代码清单1.6 Register. jsp 这时,所有构建一个简单 Struts应用的工作都做完了。 现在,试一下运行如何 如果, Tomcat没有运行,启动它。 在浏览器中输入以下地址 http://localhost:8080/register/register.jsp 麽 Netscape 回区 Ele Edit View Go Cor x cator Help Back Forward Reload Home Search Netscape Print Security Shop f Bookmarks Location tp: / /ocahost 808/egiste /egistetiss-p"what's Related UserName enter password re-enter password Register Document Done 图12 Registration程序主界面 144看看 让我们再回头看看,我们做了什么,它如何工作的,以及我们还需要做些什么 144.1做了什么 建立 Register,应用我们实际上完成了以下内容 2 RegisterForm Action Form 7 RegisterAction Action λ3个页面 14.4.2它如何工作
UserName:<form:text property="username"/><br> enter password:<form:password property="password1"/><br> re-enter password:<form:password property="password2"/><br> <form:submit value="Register"/> </form:form> 代码清单 1.6 Register.jsp 这时,所有构建一个简单Struts应用的工作都做完了。 现在,试一下运行如何。 如果,Tomcat 没有运行,启动它。 在浏览器中输入以下地址: http://localhost:8080/register/register.jsp 图 1-2 Registration 程序主界面 1.4.4 再看看 让我们再回头看看,我们做了什么,它如何工作的,以及我们还需要做些什么。 1.4.4.1 做了什么 建立Register应用我们实际上完成了以下内容: λ RegisterForm ActionForm λ RegisterAction Action λ 3个页面 1.4.4.2 它如何工作
当你知识浏览器到地址chttp://localhost:8080/register/register.ispTomcat按通常情况加工这个 页面。输入 username和 password,点击 Register提交页面。浏览器在请求中pos表单的内容 容器检查请求将送到哪一个注册的路径去。然后请求被转发到 Action Servlet,并由 Register Action来处理。在返回成功或失败之前, Register Action校验输入的有效性。最后 servlet将控制根据返回的 Action Forward转发到响应页面。图13是程序结构。 success. html failure. html response RegisterForm class ister. sp ACTION P/HTML) SERVLET egisterAction class 图13 Registration程序结构 再看看代码16中的 Register jsp,可以看到表单是提交给UR/ register但是如果你观察正 提交的页面,会发现是提交给 register.do. Struts表单标记自动加上do前缀。当我们设置程 序骨架时,我们要求所有匹配*do的请求都传递给 Action Servlet 当接收到一个请求, Action Servlet做的第一件事情就是查找 ActionMapping来匹配请求 的路径。 Action Mapping是 Struts根据 struts-config. xml文件创建的 JavaBean。我们给出了 XML的具体文件,但运行时, Struts引用的是对象,而不是XML文档。 从代码1.3中可以看到,我们使用这个元素创建了一个到path/ register的映射 name="registerForm input="/register. jsp"> 然后, Action Servlet检查是否有name属性和这个映射相关 path=”/ register input="/register. jsp"> 这里/ register映射通过 registerForm的名称标识了一个 form bean。 Action Servlet使用这
当你知识浏览器到地址http://localhost:8080/register/register.jsp,Tomcat按通常情况加工这个 页面。输入username 和password,点击Register 提交页面。浏览器在请求中post表单的内容。 容器检查请求将送到哪一个注册的路径去。然后请求被转发到ActionServlet ,并由 RegisterAction来处理。在返回成功或失败之前,RegisterAction 校验输入的有效性。最后 servlet将控制根据返回的ActionForward转发到响应页面。图1.3 是程序结构。 图 1-3 Registration 程序结构 再看看代码1.6中的Register.jsp, 可以看到表单是提交给URI /register。但是如果你观察正 提交的页面,会发现是提交给register.do。Struts 表单标记自动加上.do 前缀。当我们设置程 序骨架时,我们要求所有匹配*.do的请求都传递给ActionServlet。 当接收到一个请求, ActionServlet 做的第一件事情就是查找ActionMapping来匹配请求 的路径。ActionMapping是Struts根据 struts-config.xml 文件创建的JavaBean.。我们给出了 XML 的具体文件,但运行时,Struts 引用的是对象,而不是XML 文档。 从代码1.3中可以看到,我们使用这个元素创建了一个到path /register的映射: <action path="/register" type="app.RegisterAction" name="registerForm" input="/register.jsp"> 然后,ActionServlet 检查是否有name 属性和这个映射相关: <action path="/register" type=" app.RegisterAction" name="registerForm" input="/register.jsp"> 这里 /register 映射通过registerForm的名称标识了一个form bean。ActionServlet 使用这