4.2 第一个Struts2程序
本节将介绍如何使用Struts2来开发Web应用,还是用一个Hello Reader的例子来说明Struts2的基础配置和结构。
4.2.1 配置web.xml
Struts2的配置非常简单,在web.xml中配置Struts2提供的过滤器,并设置为所有的请求(/*)都要经过这个过滤器,如实例4-1所示。
【实例4-1】关于Struts2的配置文件:web.xml
01 <?xml version="1.0" encoding="UTF-8"?> 02 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 03 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 04 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 05 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 06 <welcome-file-list> 07 <welcome-file>index.jsp</welcome-file> 08 </welcome-file-list> 09 <display-name>Struts Blank</display-name> 10 <filter> 11 <!--添加filter--> 12 <filter-name>struts2</filter-name> 13 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 14 </filter> 15 <filter-mapping> 16 <filter-name>struts2</filter-name> 17 <url-pattern>/*</url-pattern> 18 </filter-mapping> 19 </web-app>
【代码剖析】在上述代码中,首先通过标签<filter>设置了Struts2框架的过滤器,然后通过标签<filter-mapping>设置过滤器映射。
注意
在Struts1.x中,web.xml配置了一个全局的Servlet来执行分发,而在Struts2中是一个过滤器(Filter)。
4.2.2 编写JSP界面
在使用Struts2提供的标签库之前,需要在JSP中引入这个标签库,前缀定义为“s”,如实例4-2所示。例子中用到了一个“property”标签来显示message这个属性值。
【实例4-2】关于页面文件:helloreader.jsp
01 <%@ taglib prefix="s" uri="/struts-tags"%> 02 <html> 03 <head> 04 <title>Hello Reader!</title> 05 </head> 06 <body> 07 <!--使用property标签来获取Action中的属性, 直接显示在页面中--> 08 <h2> 09 <s:property value="message" /> 10 </h2> 11 </body> 12 </html>
【代码剖析】从上述代码可以发现,Struts2标签库的引用方法简单,只需一句,而在Struts1.x版本中标签库是分散在几个tld文件中,要分别导入。
4.2.3 编写Action类
Action类是最基本的逻辑处理单元,在MVC模式中分发器分发给不同的Action类,来处理请求。在Struts2中Action类不必再实现Action接口,可以是任何类。但一般的还是需要继承ActionSupport类,后文中会讲到。因为ActionSupport提供了很多很好的基本功能,如错误信息处理等,如实例4-3所示。
【实例4-3】关于实现业务逻辑的Action:HelloReader.java
01 package tutorial; 02 import com.opensymphony.xwork2.ActionSupport; 03 //第一个Struts Action类直接继承ActionSupport 04 public class HelloReader extends ActionSupport { 05 public static final String MESSAGE = "Hello Reader ! I'm from Struts2"; 06 // Struts框架将调用此方法, 如果在配置文件中未直接指定execute()为默认方法 07 public String execute() throws Exception { 08 setMessage(MESSAGE); 09 return SUCCESS; 10 } 11 // 唯一的属性, 将被自动赋值并打印 12 private String message; 13 public void setMessage(String message) { //设置属性的getter和setter方法 14 this.message = message; 15 } 16 public String getMessage() { 17 return message; 18 } 19 }
【代码剖析】在上述代码中首先定义了message属性,然后为该属性设置了getter和setter方法,最后又在execute()方法中通过调用setMessage()方法设置了属性值。
说明
ActionSupport类的包名中出现了“xwork2”,xwork是WebWork的前身,因为Struts2是由WebWork发展而来,所以还留有WebWork的痕迹。可能在以后的版本中会逐渐把包名都统一为“Struts2”。
4.2.4 在配置文件中添加映射
Struts2的配置文件是struts.xml,所有请求和分发以及其他配置都在这个文件中定义,struts.xml文件应该放在WEB-INF目录下。在Struts1.x中这个文件的文件名为struts-config.xml,而在WebWork中这个文件名为xwork.xml。
如实例4-4所示,配置了一个名称为HelloReader的action,处理类是tutorial.HelloReader,处理后的结果转到HelloReader.jsp。
【实例4-4】关于Struts2框架的配置文件:struts.xml
01 <!DOCTYPE struts PUBLIC 02 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 03 "http://struts.apache.org/dtds/struts-2.0.dtd"> 04 <struts> 05 <package name="tutorial" extends="struts-default"> 06 <action name="HelloReader" class="tutorial.HelloReader"> 07 <result>/helloreader.jsp</result> 08 </action> 09 <!--添加actions到这里--> 10 </package> 11 </struts>
【代码剖析】在上述代码中通过标签<action>配置了类HelloReader,然后通过<result>标签设置运行成功后的转向页面。