上面我们了解关于Struts的一些基本知识。Struts使用基于MVC设计模式的Model 2架构。下面我们来运行第一个Struts应用程序,来让你快速入门。
1.5.1 获取和安装Jakarta Struts项目
在前面,我们获取了最新版本的Struts包。接下来,我们为了执行这个应用做一些准备工作。
(1) 在应用目录<CATALINA_HOME>/webapps/下建立自己一个应用目录MyStruts
(2) 复制Struts的JAR文件到<CATALINA_HOME>/webapps/MyStruts/WEB-INF/lib目录下,jar文件列表如下:
Struts.jar
commons-beanutils.jar
commons-collections.jar
commons-dbcp.jar
commons-digester.jar
commons-logging.jar
commons-pool.jar
commons-services.jar
commons-validator.jar
(3) 在<CATALINA_HOME>/webapps/MyStruts/WEB-INF/下创建web.xml,在文件中添加如下代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
</web-app>
(4) 创建一个strut-config.xml文件,复制到<CATALINA_HOME>/webapps/MyStruts /WEB-INF/ 目录下。struts-config.xml是Struts应用的部署描述文件。它用来把MVC组件组合在一起。它通常被放置在<CATALINA_HOME>/webapps/ webappname/WEB-INF/目录下,我们将会频繁的使用到它。空的struts-config.xml如下:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config
PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<message-resources
parameter="MyStruts.ApplicationResources"/>
</struts-config>
注意:如果你使用Struts 1.1 b1版本,在struts-config.xml文件中你需要添加<message-resources />元素。现在我们只是简单的创建struts-config.xml文件,对于每个元素的详细介绍我们将放在后面章节“国际化你的struts应用”。在这章我们将创建struts应用中所有必须的组件。当你开始设计和开发你的Struts应用时,你必须安装和培植你的struts组件。
1.5.2 创建你的第一个Struts应用
现在可以开发Struts应用了。我们的应用由查询学生号码的简单的JSP页面来完成,它将返回被查询学生的名称。我们会通过这个例子来说明在创建Struts应用中必须执行哪些步骤。因为Struts技术来源于MVC设计模式,所以在所有基于Struts的开发中,你可以遵循MVC模式这种标准来进行处理。处理方式为:从视图开始,控制器对象操纵模型组件来为视图服务。
这个处理过程通过下面步骤来实现:
(1) 定义并创建实现某一功能的相关视图,它们是应用中的用户接口。在struts-config.xml这个struts配置文件中所有的ActionForm 就是我们要创建的视图。
(2) 创建控制器组件。
(3) 在struts-config.xm文件中定义视图,控制器之间的关系。
(4) 在web.xml文件中配置启动struts的一些必要信息。
(5) 启动应用。
上述步骤只是对Struts开发做了概要描述,在接下来的章节我们将会对这些步骤进行比较细致的描述。下面我们来一一了解。
1. 创建视图
在创建struts应用的视图时(也就是上面所说的MVC模式的V层),我们会先创建一个包含Struts标签的JSP文件。
当前有三个主要的struts标签,Bean, HTML和Logic。在第5章我们会集中关注在这几个标签库上,但这章我们在视图中主要关注于HTML标签库。在开始我们的应用时,我们首先要需要描述视图接口。在下面的应用中有两个视图:query.jsp和result.jsp。
(1) query视图
query视图有query.jsp文件来表现,是我们第一个看到的视图。它用来查询学生和提交
请求到相应的Action中。query.jsp源文件如下:
<%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <html> <head> <title>MyStruts Struts Application</title> </head> <body> <table width="500" border="0" cellspacing="0" cellpadding="0"> <tr> <td> </td> </tr> <tr bgcolor="#36566E"> <td height="68" width="48%"> <div align="left"> <img src="images/hp_logo_MyStruts.gif" width="220" height="74"> </div> </td> </tr> <tr> <td> </td> </tr> </table> <html:form action="search.do" name="searchForm" type="MyStruts.SearchForm" > <table width="45%" border="0"> <tr> <td>Symbol:</td> <td><html:text property="symbol" /></td> </tr> <tr> <td colspan="2" align="center"><html:submit /></td> </tr> </table> </html:form> </body> </html>
如你看到的query视图,除了form标签外,它就象一个包含数据集合的HTML页面。HTML页面中我们把FORM标签改为用Struts标签<html:form />来替换。
2. 创建控制器组件
ActionForm用来保存视图中表单输入参数的实际数值(也就是上面所说的MVC模式的C层)。如我们在前面章节提到的,当一个<html:form />标签被提交,Struts框架把对应的数据组装到ActionForm实例中。Struts框架通过JavaBean影射,因此ActionForm中的成员变量必须遵守JavaBean的命名规则。举例如下:
private String symbol;
public void setSymbol(String symbol);
public String getSymbol();
在这个例子中有一个简单成员变量symbol。在获取或设置成员变量的数值时必须带有前缀set和get,在set和get后面的成员变量的第一个字符必须为大写。列表3-2是ActionForm的源代码
SearchForm.java.
package MyStruts; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; public class SearchForm extends ActionForm { private String symbol = null; public String getSymbol() { return (symbol); } public void setSymbol(String symbol) { this.symbol = symbol; } public void reset(ActionMapping mapping, HttpServletRequest request) { this.symbol = null; } }
在这个类中没有特殊的东西,它只是简单的继承org.apache.struts.action.ActionForm,以及每个ActionForm实例对每个成员变量必须实现的get,set方法。在这个ActionForm bean中有一个特殊的reset()方法。每一个使用SearchForm的请求都会执行reset()方法。这个方法的目的是为了重置SearchForm的成员变量,以便下一个应用使用。
注意:reset()方法ActionMapping类来被引用。关于ActionMapping类我们暂时可以忽略,将在后面章节中有详细的描述。
编译SearchForm类,移到<CATALINA_HOME>/webapps/MyStruts/WEB-INF/classes/ MyStruts目录下,在<CATALINA_HOME>/webapps/MyStruts/WEB-INF/struts-config.xml文件中添加<form-bean name="searchForm" type="MyStruts.SearchForm"/>这是为了让Struts应用知道SearchForm如何被引用。
(2) result视图
我们最后的视图是result.jsp。视图在用户成功的寻找到学生信息后显示。它是没有特殊struts功能的非常简单的JSP页面。
result.jsp源程序如下:
----------------------------------------------------
<html>
<head>
<title>MyStruts Struts Application</title>
</head>
<body>
<table width="500" border="0" cellspacing="0" cellpadding="0">
<tr>
<td> </td>
</tr>
<tr bgcolor="#36566E">
<td height="68" width="48%">
<div align="left">
<img src="images/hp_logo_MyStruts.gif" width="220" height="74">
</div>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td>
姓名 : <%= request.getAttribute("name") %>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
</body>
</html>
-----------------------------------------------------------------
上面的JSP中包含简单一个简单的代码行,它用HttpServletRequest获取特定的学生的姓名。这个姓名数据通过Action对象中的HttpServletRequest实例来设置。
3. 创建控制组件
在Struts应用中,控制器由两个组件组成(也就是上面所说的MVC模式的M层)。这两个组件是org.apache.struts.action.ActionServlet和org.apache. struts.action.Action类。在大多数的Struts应用只存在一个org.apache.struts.action.ActionServlet实现(实例),但存在多个org.apache.struts.action.Action实现(多个继承实例)。org.apache.struts.action.ActionServlet用来控制客户端请求和决定哪个org.apache.struts.action.Action实例来处理请求。在我们创建的简单应用中,缺省的ActionServlet已经足以满足我们的应用需求了,你不需要再实现特定的org.apache.struts.action.ActionServlet。
控制器的第二个组件是org.apache.struts. action.Action,和ActionServlet不同的是Action类在你的应用中必须扩展。这个类是你业务逻辑的开始部分。
例如我们寻找指定的学生的姓名。我们会创建一个从org.apache.struts.action.Action扩展的SearchAction。代码如下:
SearchAction.java
------------------------------------------------------------
package MyStruts;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class SearchAction extends Action {
protected String getName (String symbol) {
if ( symbol.equalsIgnoreCase("S0001") ) {
return “SUN”;
}
return null;
}
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
String name = null;
/
// Default target to success
String target = new String("success");
if ( form != null ) {
// Use the SearchForm to get the request parameters
SearchForm searchForm = (SearchForm)form;
String symbol = searchForm.getSymbol();
name = getName (symbol);
}
// Set the target to failure
if (name == null ) {
target = new String("failure");
}
else {
request.setAttribute("name ", name);
}
// Forward to the appropriate View
return (mapping.findForward(target));
}
}
-----------------------------------------------------------------
我们注意到SearchAction类有两个方法:getName () and execute()。getName ()方法会返回一个姓名(如果提交的学生号代码为“S0001”)。request.setAttribute("name ", name);方法从ActionClass传递对象到View组件,以使JSP文件可以通过它们取回所对应的对象(<%= request.getAttribute("name") %>)。execute() 方法是SearchAction的主函数,在所有的Action类中必须被实现 。
4. 整合struts-config.xml文件
struts-config.xml配置文件是整个 框架的主心骨。web.xml文件定义了一个请求到来应向何处转发后,后面的工作就全权
(1) 创建Web应用的配置文件
对于Struts应用,它的配置文件web.xml应该对ActionServlet类进行配置,此外,还应该声明Web应用所使用的Struts标签库,本例中声明使用了三个标签库: Struts Bean、Struts HTML和Struts Logic标签库。web.xml的源代码。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<display-name>myStruts Application</display-name>
<!-- Standard Action Servlet Configuration -->
<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>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- The Usual Welcome File List -->
<welcome-file-list>
<welcome-file>hello.jsp</welcome-file>
</welcome-file-list>
<!-- Struts Tag Library Descriptors -->
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
</web-app>