Struts Web 框架简介
本文档介绍使用 NetBeans IDE 开发 Struts Web 框架应用程序的基本知识。利用 Struts 框架,您可以基于标准技术(如 JSP 页面、资源包以及 XML)创建可维护、可扩展和灵活的 Web 应用程序。
Struts 使用 M odel, V iew, C ontroller (MVC) 框架,但只提供 Struts 库中包含的控制器 servlet,在指示要使用 Struts 时,该 Struts 库由 IDE 提供并在 web.xml 部署描述符中自动注册。Struts servlet 使用 struts-config.xml 文件来映射对 Struts "action" 类发出的请求。action 类接收 Struts "actionform bean" 类作为输入内容,该类在 action 类和视图(通常是 JavaServer Pages (JSP) 页面)之间起传输对象的作用。由于许多 Web 应用程序使用 JSP 页面进行查看,因此 Struts 提供自定义标记库来简化与 HTML 窗体的交互。
目录
本教程所需要的软件
开始之前,需要在您的计算机上下载并安装以下软件:
NetBeans IDE 6.0 Web & Java EE(下载 )。
Java Standard Development Kit(JDK)版本 5.0 或版本 6.0(下载 )。
Glassfish V2 或 Tomcat Web Server,两者都可在 NetBeans IDE 6.0 安装程序中选择安装。
本教程结束时,您将获得一个非常简单的半自动登录页面。您将会了解 Struts 提供的几个基本功能,还将学会如何通过 IDE 实现这些功能。特别是,您将在 JSP 页面中使用 Struts 标记,使用Struts actionform bean 类验证字段,并且使用 Struts action 类在页面间导航。还可以看到如何添加各种辅助的 Struts 功能,如 "Cancel" 和 "Logout"。
有关 Struts 工作原理的详细信息,请参见 Struts 网站上的 How does it work? 。有关使用 IDE 的一般信息,请参见 NetBeans 网站上的 文档和支持页面 。
建立 Struts 应用程序
开始编写代码之前,必须确保您具备所有必要的软件,并且保证正确设置项目。
在 IDE 中,“Struts 应用程序”只不过是 Struts 库和配置文件携带的普通 Web 应用程序。在 IDE 中,可以用创建其他 Web 应用程序的方法来创建 Struts 应用程序,只多了在应用程序中包含 Struts 库和配置文件这一指示步骤。
选择 File > New Project 选项。在 Categories 列表中,选择 Web 选项。在 Projects 列表中,选择 Web Application 选项并单击 Next 按钮。
在 Name and Location 面板中,执行以下操作:
在 Project Name 字段中,输入 LoginPage 。
将 Project Location 更改为计算机上的任意目录。从现在起,我们将此目录称作 $ PROJECTHOME 。
选择应用程序将要部署到的服务器。仅列出在 IDE 中注册的服务器。要注册服务器,单击 Server 下拉列表旁边的 Add 按钮。
注意,Context Path 是 /LoginPage 。
单击 Next 按钮。
在 Frameworks 面板中,选择 Struts 1.2.9 选项:
请勿更改该面板下面部分中的值。它们用于以下方面:
Action Servlet Name: Struts action servlet 的 servlet 条目名称的硬编码规范。web.xml 开发部署符包含 action servlet 的 servlet 条目,用于指定特定于 Struts 的相应参数,如 servlet 类的名称和 struts-config.xml 配置文件的路径。
Action URL Pattern: 允许指定应映射到 Struts action 控制器的适当模式。这将会生成相应 web.xml servlet 映射条目,将指定的 URI 模式映射到 action servlet。默认情况下,只映射 *.do 模式。
Application Resource: 允许您指定 struts-config.xml 文件中将用于本地化消息的资源包。默认情况下,该资源包是 com.myapp.struts.ApplicationResource 。
Add Struts TLDs: 允许您生成 Struts 标记库的标记库描述符。标记库描述符是一个 XML 文档,该文档包含了有关整个标记库以及每个个别标记的附加信息。通常没有必要生成标记库描述符,因为您可以参考联机 URI,而不是本地 TLD 文件。
单击 Finish 按钮。
IDE 将在文件系统中创建 $PROJECTHOME /LoginPage 项目文件夹。与 IDE 中的其他 Web 应用程序一样,项目文件夹包含所有源和 IDE 的项目元数据,如 Ant 构建脚本。然而不同之处是,您的 Web 应用程序将所有的 Struts 库都添加在其类路径上。它们不仅放在应用程序的类路径上,而且在本快速入门指南的后面部分构建项目时,它们还包括在项目中并与之一起打包。
LoginPage 项目在 IDE 中打开。可以在 Projects 窗口中查看其逻辑结构,在 Files 窗口中查看其文件结构。例如,现在 Projects 窗口应该如下所示:
在 Configuration Files 节点中,应用程序包括所有特定于 Struts 的配置文件,其中 struts-config.xml 是最重要的。在整篇本快速入门指南中都将用到该配置文件。同样在 Configuration Files 节点中,要处理 Struts 工作流程,就需要在 web.xml 部署描述符中映射 Struts servlet(也就是 MVC 范例中的控制器):
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
在以上示例中,Struts servlet(org.apache.struts.action.ActionServlet )被指定为用来控制映射 .do 所有请求的 servlet。此外,web.xml 文件指定由 WEB-INF 文件夹中找到的 struts-config.xml 文件配置 Struts servlet。
开发 Struts 应用程序
在 IDE 中开发 Struts 应用程序与开发任何其他类型的 Web 应用程序类似。可以使用像 JSP 页面、servlet、侦听器和过滤器这样的组件。但是,通过 IDE 可使用由 Struts 提供的设备来扩充 Web 开发工具包。例如,使用在 IDE 中的模板创建 Struts action 类和 Struts actionform bean 类。除此之外,IDE 自动在 struts-config.xml 文件中注册这些类,并允许您通过在 Source Editor 中弹出菜单的菜单项非常轻松地扩展该文件。
在 JSP 页面中使用 Struts 自定义标记库
许多 Web 应用程序使用 JavaServer Pages ( JSP ) 在 MVC 范例中查看,所以 Struts 提供了自定义标记库来简化与 HTML 窗体的交互。在 IDE 中,这些都可以在 JSP 页面中非常轻松、顺利地设置并使用。
右键单击 LoginPage 项目节点,选择 New > JSP 选项,然后调用新 JSP 页面 loginForm 。单击 Finish 按钮。
在 Source Editor 中,将 <H2> 标记的默认内容更改为 Login Form ,并对 <TITLE> 标记的内容也作相同更改。
将前面这两个 taglib 标记从 welcomeStruts.jsp 文件复制到新 loginForm.jsp 文件的顶部:
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
在 loginForm.jsp 中,中,在 <H2> 标记下面添加以下内容:
<html:form action="login"> <html:submit value="Login" /> </html:form>
注意,当您键入 Struts 标记时,IDE 建议用不同的方法完成代码键入,并提供 Struts Javadoc 给与近一步的帮助:
在 Source Editor 中完成键入后,您可以在 Source Editor 中右键单击并选择 Format 选项(Alt-Shift-F)来整理代码:
在 Source Editor 右边的 Component Palette(Ctrl-Shift-8)的 HTML 部分中,将 Table 项拖到 <html:submit value="Login" /> 行的正上方。将弹出 Insert Table 对话框。将 Rows 和 Columns 设置为 1,以便创建由单行和单列组成的表。单击 OK 按钮。
loginForm.jsp 现在将如下所示:
<html:form action="login"> <table border="1"> <thead> <tr> <th></th> </tr> </thead> <tbody> <tr> <td></td> </tr> </tbody> </table> <html:submit value="Login" /> </html:form>
在 <TH> 标记中间,键入以下内容:
<bean:message key="login.name" />
在 <TD> 标记中间,键入以下内容:
<html:text property="name" />
loginForm.jsp 的主体现在将如下所示:
在 Projects 窗口中,展开 Source Packages 节点,展开 com.myapp.struts 节点,然后双击 ApplicationResource.properties s 文件使其在 Source Editor 中打开。将 login.name 作为键添加在 ApplicationResource.properties 文件的任何地方,并添加一个有意义的消息。例如:
login.name=Name
在页面中使用 Struts 验证字段
Struts "actionform bean" 类代表视图(在本例中,是 JSP 页面)和 Struts action 类之间共享的数据。actionform bean 类可用于填充视图并向 action 类提供输入内容。actioform bean 类还有一个 validate 方法,可允许验证从视图映射的输入内容。
右键单击 LoginPage 项目节点并选择 New > Other 选项。在 Struts 类别中选择 Struts ActionForm Bean 并单击 Next 按钮。注意,actionform bean 类将称作 “NewStrutsActionForm”。在本教程中,保留默认名称。在真实应用程序中,将赋予 actionform bean 类一个有意义的新名称。在 Package 下拉列表中选择 com.myapp.struts 选项并单击 Finish 按钮。
actionform bean 类将在 Source Editor 中打开。默认情况下,IDE 向它提供调用称作 name 的 String 以及调用称作number 的 int 。两个字段也会获得为其定义的获取方法和设置方法。
在 Source Editor 中打开 struts-config.xml 并注意其包含的内容,下面给出了其中的一部份内容:
<form-beans> <form-bean name="NewStrutsActionForm" type="com.myapp.struts.NewStrutsActionForm"/> </form-beans>
按住 Ctrl 键并将鼠标移动到 actionform bean 类的完全合格的类名:
将出现一个超链接。单击该链接可以导航到 actionform bean 类。
现在可以在 Source Editor 中浏览 actionform bean 类。查看 IDE 创建的 validate 的方法:
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if (getName() == null || getName().length() < 1) { errors.add("name", new ActionMessage("error.name.required")); // TODO: add 'error.name.required' key to your resources } return errors; }
注意,在默认情况下验证调用 name 的字段。如果验证失败(JSP 页面中没有输入名称时会发生这种情况),则返回 error.name.required 识别的消息。
按照 IDE 中的 validate 方法 TODO 说明,将 error.name.required 作为键添加到 ApplicationResource.properties 文件并添加一个有意义的消息。例如:
error.name.required=Enter a name!
要自定义错误消息的格式,在文件的顶端将前面四个键更改如下:
errors.header= errors.prefix=<span style="color: red"> errors.suffix=</span> errors.footer=
将 loginForm.jsp 中的以下这行添加到 </html:form> 结束标记的上方,可指定要显示错误消息的位置:
<html:errors />
使用 Struts 在 JSP 页面间导航
执行 Struts "action" 类来响应用户请求并通常通过业务委托与模型交互。action 类的职责是向相应的视图提供导航和前进控制。
右键单击 LoginPage 项目节点并选择 New > Other 选项。在 Struts 类别中选择 Struts Action 选项并单击 Next 按钮。
在 Name and Location 面板中,注意 action 类将被称为“NewStrutsAction”。在本教程中,保留默认名称。在真实程序中,将赋予 action 类一个有意义的新名称。
在 Package 下拉式列表中选择 com.myapp.struts 选项。
在 Action Path 中键入 login (因此,Action Path 的内容现在为 /login )。单击 Next 按钮。
在 ActionForm Bean、Parameter 中,注意 IDE 建议您将 action 类与上一步中创建的 actionform bean 类相关联。在 Input Resource 中,浏览到 loginForm.jsp 页面。单击 Finish 按钮。
在 Source Editor 中打开 struts-config.xml 并注意其包含的内容,下面给出了其中的一些内容:
<action-mappings> <action input="/loginForm.jsp" name="NewStrutsActionForm" path="/login" scope="session" type="com.myapp.struts.NewStrutsAction"/> <action path="/Welcome" forward="/welcomeStruts.jsp"/> </action-mappings>
如果要 action 类对每个请求而不是每个会话做出响应,那么将鼠标放在 scope 属性上并按 Ctrl-Space 组合键:
选择 Request 选项。
按住 Ctrl 键并将鼠标移动到 action 类的完全合格的类名:
将出现一个超链接。单击该链接可以导航到 action 类。
浏览 action 类并查看 execute 方法:
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return mapping.findForward(SUCCESS); }
在 NewStrutsAction 的顶部,注意 SUCCESS 的定义:
private final static String SUCCESS = "success";
SUCCESS String 声明指定该 action 类映射到调用 success 的输出视图。
您需要定义调用以上输出视图时将会显示的页面。所以,在与 loginForm.jsp 相同的位置创建另一个 JSP,并称它为 loginSuccessful 。在 Source Editor 中,将新 JSP 文件中 <H2> 标记的默认内容更改为 Login Successful! ,并对 <TITLE> 标记的内容也作相同更改。
在 Source Editor 中打开 struts-config.xml ,右键单击 /login action 映射的任何区域,然后选择 Struts > Add Forward 选项。
将会打开 Add Forward 对话框。
在 Forward Name 中键入 success 。在 Resource File 中,浏览到 loginSuccessful.jsp 。对话框现在将如下所示:
单击 Add 按钮。
注意,struts-config.xml 现在将如下所示(新代码为黑体):
<action-mappings> <action input="/loginForm.jsp" name="NewStrutsActionForm" path="/login" scope="session" type="com.myapp.struts.NewStrutsAction"> <forward name="success" path="/loginSuccessful.jsp"/> </action> <action path="/Welcome" forward="/welcomeStruts.jsp"/> </action-mappings>
构建和运行 Struts 应用程序
IDE 使用 Ant 构建脚本构建和运行 Web 应用程序。在创建应用程序时,IDE 根据在 New Project 向导和项目的 Project Properties 对话框中输入的选项生成构建脚本。
右键单击 LoginPage 节点,然后选择 Properties 选项。在 Project Properties 对话框中,单击 Run 节点。在 Relative URL 中,键入 login.do 。单击 OK 按钮。
注意: 记住,在本快速入门指南的开始部分,曾将 .do 映射映射到 Struts 控制器 servlet。现在,当您运行应用程序并使用 .do 映射时,Struts 控制器 servlet 知道必须处理该请求。
右键单击项目并选择 Run 选项。
IDE 构建 Web 应用程序和部署它,使用的都是在创建项目时指定的服务器。
浏览器打开并显示 loginForm.jsp 页面:
只有验证成功,action 类的 execute 方法返回 SUCCESS 输出视图,Struts 才会调用 loginsuccesful.jsp 页面。要通过验证,您需要做的只是将任一值添加到 loginForm.jsp 页面的 Name 行。然后,将会显示 loginSuccessful.jsp :
当然,本快速入门指南在开始时已指出,这不是一个完整的登录窗体,仅仅是为您显示 Struts 中此类窗体的基本外观。以下部分介绍了如何使用各种标准功能快速而轻松地扩展登录窗体。
向 Struts 应用程序添加更多功能
Struts 简化并组织应用程序的方法在此处没有完全列出。这里有使用 Struts 扩展现有登录页面的几个简单示例。
使用 Struts 添加 "Cancel" 功能
在本部分,添加 Struts 处理过的 Cancel 功能。
在 loginForm.jsp 的 <html:submit> 行下面添加以下内容创建 Cancel 按钮:
<html:cancel />
将这些行添加到 org.myapp.struts.NewStrutsAction 的 execute 方法中:
if (isCancelled(request)){ return mapping.findForward(CANCEL); }
在 isCancelled 方法中按住 Ctrl-Space 键,然后阅读 Javadoc 以理解该方法:
在 NewStrutsAction 类顶端、SUCCESS 定义的下方声明 CANCEL 的定义:
private final static String CANCEL = "cancel";
您需要定义调用 CANCEL 时将会显示的页面。所以,在与 loginForm.jsp 相同的位置创建另一个 JSP,并称它为 loginCancel 。在 Source Editor 中,将新 JSP 文件中 <H2> 标记的默认内容更改为 Login Cancelled! 并对 <TITLE> 标记的内容也作相同更改。
在 Source Editor 中打开 struts-config.xml ,右键单击 /login action 映射的任何区域,然后选择 Struts > Add Forward 选项。将会打开 Add Forward 对话框。
在 Forward Name 中键入 cancel 。在 Resource File 中,浏览到 loginCancel.jsp 。对话框现在将如下所示:
单击 Add 按钮。
注意,struts-config.xml 现在将如下所示(新代码为黑体):
<action-mappings> <action input="/loginForm.jsp" name="NewStrutsActionForm" path="/login" scope="session" type="com.myapp.struts.NewStrutsAction"> <forward name="success" path="/loginSuccessful.jsp"/> <forward name="cancel" path="/loginCancel.jsp"/> </action> <action path="/Welcome" forward="/welcomeStruts.jsp"/> </action-mappings>
注意,在In Struts 1.2.9 和 1.3 中,在删除功能中存在一些变化,相关描述请点击 此处 。因此,您需要添加下面用黑体显示的那一行。
<action-mappings> <action input="/loginForm.jsp" name="NewStrutsActionForm" path="/login" scope="session" type="com.myapp.struts.NewStrutsAction"> <forward name="success" path="/loginSuccessful.jsp"/> <forward name="cancel" path="/loginCancel.jsp"/> <set-property property="cancellable" value="true"/> </action> <action path="/Welcome" forward="/welcomeStruts.jsp"/> </action-mappings>
再次运行应用程序并注意新 Cancel 按钮:
单击该按钮并注意浏览器中是否打开了新 loginCancel.jsp 页面。
使用 Struts 添加 "Logout" 功能
在 loginForm.jsp 中的 <H2> 标记下面添加以下内容创建 Logout 链接:
<html:link action="/logout">Logout</html:link>
您需要定义单击 Logout 链接时将会显示的页面。所以,在与 loginForm.jsp 相同的位置创建另一个 JSP,并称它为 loginOut 。在 Source Editor 中,将新 JSP 文件中 <H2> 标记的默认内容更改为 Have a Nice Day! ,并对 <TITLE> 标记的内容也做相同更改。
在 Source Editor 中打开 struts-config.xml ,右键单击任意位置并选择 Struts > Add Forward/Include Action。将会打开 Add Forward/Include Action 对话框。
在 Action Path 中键入 logout 。在 Resource File 中,浏览到 loginOut.jsp 。对话框现在将如下所示:
单击 Add 按钮。
注意,struts-config.xml 现在将如下所示(新代码为黑体):
<action-mappings> <action input="/loginForm.jsp" name="NewStrutsActionForm" path="/login" scope="session" type="com.myapp.struts.NewStrutsAction"> <forward name="success" path="/loginSuccessful.jsp"/> <forward name="cancel" path="/loginCancel.jsp"/> </action> <action forward="/loginOut.jsp" path="/logout"/> <action path="/Welcome" forward="/welcomeStruts.jsp"/> </action-mappings>
再次运行应用程序并注意新 Logout 链接:
单击该链接并注意浏览器中是否打开了新 loginOut.jsp 页面。
使用 Struts 添加 "Reset" 功能
在 loginForm.jsp 中,在 Submit 和 Cancel 按钮之间添加以下内容创建 Reset 按钮:
<html:reset />
再次运行应用程序并注意新 Reset 按钮:
在 Name 行中键入一些内容,单击 Reset 按钮,并注意 Struts 是否清空表格。
向 IDE 添加喜欢的 Struts 功能
使用 Struts 时,并不限制您使用 IDE 提供的功能。通过添加 IDE 不支持的功能,您可以增强 IDE。下面是一些示例:
可以将特定于 Struts 的 HTML 片段添加到 Component Palette。例如,您可以将用于创建 Submit、Reset 和 Cancel 按钮的 HTML 代码作为片段添加到 HTML 调色板。然后,可以将代码片段从调色板拖放到 Source Editor。可以创建包含这些片段的 NetBeans 插件模块,然后和同事共享这些片段。要实现此操作,请参见 NetBeans Code Snippet 模块教程 。
除了将 Struts 片段添加到现有的调色板,您还可以特别针对 struts-config.xml 文件创建一个新调色板。您可以再次以插件模块的形式和同事共享 Struts 片段。要实现此操作,请参见 NetBeans Component Palette 模块教程 。
您可以扩展 JSP 编辑器,来提供特别针对 Struts 框架配合使用的功能。与以上两个建议一样,一旦您为同事提供了插件模块,您就可以轻松地与他们共享此类功能。有关详细信息,请参见 NetBeans Editor Extension 模块教程 。
您可以创建 Struts 示例应用程序并通过插件模块使其变为可用。这样,他人就可以用与其他 NetBeans 项目示例相同的访问方法从 New Project 向导访问您的示例,与您共享知识。有关详细信息,请参见 NetBeans Project Sample 模块教程 。
可以用各种其他方法增强 IDE 对 Struts 的支持。有关详细信息,请参见 NetBeans 模块(插件)及富客户端应用程序开发教程 。
更多信息:
有关使用 NetBeans IDE 6.0 的更多信息,请参见以下参考资料:
要发送意见和建议,获取支持,了解关于 NetBeans IDE Java EE 开发特性的最新发展,请加入
nbj2ee @ netbeans.org
邮件列表
。有关 NetBeans IDE 中即将出现的 J2EE 开发特性的更多信息,请参见:j2ee.netbeans.org 。
.