天津清华IT教师推荐文章:
Hello World程序
由于“Hello World”程序名扬四海,“程序中人”无人不知,无人不晓,我等写书之人亦不能免俗,首先给出一个使用Struts 2框架开发的“Hello World”Web程序。
Step1:新建Web项目
在MyEclipse开发环境中,单击菜单【File】→【New】→【Web Project】,如图2-9所示。
|
| (点击查看大图)图2-9 新建Web项目 |
在“New Web Project”窗口中,输入项目的名称,本例中输入的名称是“ch02”,如图2-10所示。
|
| (点击查看大图)图2-10 输入Web项目的相关信息 |
单击“Finish”按钮,完成Web项目的创建。Web项目的结构如图2-11所示。
|
| (点击查看大图)图2-11 Web项目的结构 |
通过MyEclipse的“Web Project”向导创建的Web项目,已经为你搭建好了项目开发的目录结构。src目录下存放Java源文件,源文件编译后会自动输出到WebRoot\WEB-INF\ classes目录下,WebRoot是Web应用程序的根目录,其下的目录结构是按照Java Web应用程序所要求的目录层次结构建立的。
Step2:导入Struts 2类库
在Struts 2安装目录下的lib子目录中,有很多JAR包,不同的应用需要的JAR包是不同的。表2-1给出了开发Struts 2程序最少需要的JAR包。
表2-1 基于Struts 2的Web应用程序所需要的最少类库
文 件 名 | 说 明 |
struts2-core-2.0.11.jar | Struts 2框架的核心类库 |
xwork-2.0.4.jar | XWork类库,Struts 2在其上构建 |
ognl-2.6.11.jar | 对象图导航语言(Object Graph Navigation Language),Struts 2框架使用的一种表达式语言 |
freemarker-2.3.8.jar | Struts 2的UI标签的模板使用FreeMarker编写 |
commons-logging-1.0.4.jar | ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。 |
在MyEclipse中导入JAR包是非常简单的,只需要在Windows的资源管理器中复制这5个JAR包,然后转到MyEclipse开发环境中的ch02项目,在WebRoot\WEB-INF\lib目录上单击鼠标右键,选择【Paste】,或者选中WebRoot\WEB-INF\lib目录,然后同时按下键盘上的“Ctrl+V”组合键,将这5个JAR包复制到项目中,MyEclipse会自动将lib目录下所有的JAR包添加到项目的构建路径中。
如果想要从构建路径中删除某个JAR包,可以在ch02项目上单击鼠标右键,在弹出菜单的底部,选择【Properties】菜单项,出现如图2-12所示的窗口。
在项目属性窗口的左边选中“Java Build Path”,在右边选择“Libraries”标签页,出现如图2-13所示的窗口。
|
| (点击查看大图)图2-12 项目属性窗口 |
|
| (点击查看大图)图2-13 配置项目所依赖的JAR包 |
在图2-13所示的窗口中,选中要从构建路径中删除的JAR包,单击窗口右边的“Remove”按钮。
从构建路径中删除的JAR包仍然存在于项目中,要从项目中彻底删除JAR包,打开“Package Explorer”视图,在项目的WebRoot\WEB-INF\lib目录下,选中要删除的JAR包,单击鼠标右键,从弹出菜单中选择【Delete】菜单项。
Step3:在web.xml文件中配置FilterDispatcher
Struts 2框架是基于MVC模式开发的,它提供了一个核心控制器,用于对所有的请求进行统一处理,这个控制器是由一个名为FilterDispatcher的Servlet过滤器来充当的。
你需要在web.xml文件中配置FilterDispatcher过滤器,指定要映射到FilterDispatcher的URL样式,匹配这个URL样式的所有请求,都将被Web容器交由FilterDispatcher进行处理。
编辑WebRoot\WEB-INF\web.xml文件,添加FilterDispatcher过滤器的配置,web.xml的完整代码如例2-1所示。
例2-1 web.xml
粗体显示的代码是我们添加的内容。
要了解web.xml文件所有配置元素的含义,可参看笔者所著的《Java Web开发详解》附录D。
Step4:编写Action类
一个action就是一段只有特定的URL被请求时才会执行的代码。FilterDispatcher根据请求URL的不同,来执行对应的action。在Struts 2中,action执行的结果(成功或者失败)通常都对应着一个要呈现给用户的result,这个result可以是HTML页面,也可以是一个PDF文件,或者Excel电子表格。所有的result都是通过字符串名字来标识的,FilterDispatcher根据action返回的结果字符串来选择对应的result显示给用户。action与其对应的result是在一个名为struts.xml的配置文件中进行配置的,参见Step6。
在Struts 2中,可以用一个普通的Java类作为Action类,只要这个类提供如下的方法实现即可:
不过,通常情况下,我们所写的action类会选择实现com.opensymphony.xwork2.Action接口,在这个接口中除了定义了上述的execute()方法外,还定义了5个字符串类型的静态常量,如下:
public interface Action { //action执行成功,要向用户显示成功页面,返回SUCCESS常量 public static final String SUCCESS = "success"; //action执行成功,但不需要向用户显示结果页面,使用NONE常量 public static final String NONE = "none"; //action执行失败,要向用户显示失败页面,返回ERROR常量 public static final String ERROR = "error";
//action的执行需要用户输入更多信息,要向用户显示输入页面,返回INPUT常量 public static final String INPUT = "input";
//由于用户没有登录,action不能执行,要向用户显示登录页面,返回LOGIN常量 public static final String LOGIN = "login"; } |
Strtus 2中,所有的action必须返回一个字符串类型的结果代码,以标识要呈现给用户的result。
Action接口中定义的常量字符串,从语义上为你定义好了在action执行的不同情况下应该向用户呈现的result的名字,当然你可以为result取其他的名字,不过这种行为是不建议的,除非上述定义的字符串常量不能满足你的应用需求。
下面我们编写一个Action类HelloAction,实现com.opensymphony.xwork2.Action接口。
在项目的src目录上单击鼠标右键,从弹出菜单中选择【New】→【Package】,输入包名:org.sunxin.struts2.ch02.action。在org.sunxin.struts2.ch02.action包上单击鼠标右键,从弹出菜单中选择【New】→【Class】,出现如图2-14所示的窗口。
|
| (点击查看大图)图2-14 新建Java类 |
在“Name:”处输入类名:HelloWorldAction,单击“Add”按钮,在“Choose Interfaces:”文本框中输入Action,选中“com.opensymphony.xwork2”包中的Action接口,单击“OK”按钮,如图2-15所示。
|
| 图2-15 选择要实现的接口 |
目前的MyEclipse版本还没有提供支持Struts 2开发的插件(对Struts 1有支持),在使用Struts 2框架进行开发时,很多工作都需要自己一步一步去完成,没有开发向导可供使用。
HelloWorldAction的代码如例2-2所示。
例2-2 HelloWorldAction.java
package org.sunxin.struts2.ch02.action; import com.opensymphony.xwork2.Action; public class HelloWorldAction implements Action { private String message;
public String getMessage() { return message; } @Override public String execute() throws Exception { message = "Hello World!"; return SUCCESS; } } |
在HelloWorldAction类中,我们定义了一个字符串类型的message实例变量,并给出了一个JavaBean风格的getter方法——getMessage(),用于获取message字段的内容。在execute()方法中,我们构造了一个问候语“Hello World!”,保存到message字段中,最后返回SUCCESS静态常量(在Action接口中定义),说明action已经成功执行。
Action返回的结果代码不一定非要对应一个要执行的result,例如,Action.NONE结果代码就没有对应任何的result。
Action已经创建完毕,接下来我们编写一个JSP页面,向用户显示问候信息。