Struts2教程1:第一个Struts2程序
在本系列教程中我们将学习到Struts2
的各种技术。在本教程中使用的工具和程序库的版本如下:开发工具:MyEclipse6
Web
服务器:Tomcat6
Struts
版本:Struts2.0.11.1
JDK
版本:JDK1.5.0_12
J2EE
版本:Java EE5.0
在本系列教程中Web
工程的上下文路径都是struts2
,如果在Web
根目录有一个index.jsp
文件,则访问路径如下:http://localhost:8080/struts2/index.jsp
由于MyEclipse6
目前并不支持Struts2
,所以我们需要到struts.apache.org
去下载Struts2
安装包。要想正常使用Struts2
,至少需要如下五个包(可能会因为Struts2
的版本不同,包名略有差异,但包名的前半部是一样的)。struts2-core-2.0.11.1.jar
xwork-2.0.4.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
Struts2
虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了Struts1.x
的方式(当然,Struts2
仍然是基于MVC
模式的,也是动作驱动的,可能这是唯一没变的东西)。Struts2
实际上是在Webwork
基础上构建起来的MVC
框架。我们从Struts2
的源代码中可以看到,有很多都是直接使用的xwork(Webwork
的核心技术)
的包。既然从技术上来说Struts2
是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。 如果大家使用过Struts1.x
,应该对建立基于Struts1.x
的Web
程序的基本步骤非常清楚。让我们先来回顾一下建立基于Struts1.x
的Web
程序的基本步骤。1.
安装Struts
。由于Struts
的入口点是ActionServlet
,所以得在web.xml
中配置一下这个Servlet
。2.
编写Action
类(一般从org.apache.struts.action.Action
类继承)。3.
编写ActionForm
类(一般从org.apache.struts.action.ActionForm
类继承),这一步不是必须的,如果要接收客户端提交的数据,需要执行这一步。4.
在struts-config.xml
文件中配置Action
和ActionForm
。5.
如果要采集用户录入的数据,一般需要编写若干JSP
页面,并通过这些JSP
页面中的form
将数据提交给Action
。下面我们就按着编写struts1.x
程序的这五步和struts2.x
程序的编写过程一一对应,看看它们谁更“酷”。下面我们来编写一个基于Struts2
的Web
程序。这个程序的功能是让用户录入两个整数,并提交给一个Struts Action
,并计算这两个数的代数和,如果代码和为非负数,则跳转到positive.jsp
页面,否则跳转到negative.jsp
页面。
【第1步】 安装Struts2
这一步对于Struts1.x
和Struts2
都是必须的,只是安装的方法不同。Struts1
的入口点是一个Servlet
,而Struts2
的入口点是一个过滤器(Filter)
。因此,Struts2
要按过滤器的方式配置。下面是在web.xml
中配置Struts2
的代码:<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
【第2步】 编写Action
类这一步和Struts1.x也必须进行。只是Struts1.x中的动作类必须从Action类中继承,而Struts2.x的动作类需要从com.opensymphony.xwork2.ActionSupport类继承。下面是计算两个整数代码和的Action类,代码如下:
package action;
import com.opensymphony.xwork2.ActionSupport;
public
class FirstAction extends ActionSupport
{
private
int operand1;
private
int operand2;
public String execute() throws Exception
{
if (getSum() >=
0) // 如果代码数和是非负整数,跳到positive.jsp页面
{
return
"positive";
}
else
// 如果代码数和是负整数,跳到negative.jsp页面
{
return
"negative";
}
}
public
int getOperand1()
{
return operand1;
}
public
void setOperand1(int operand1)
{
System.out.println(operand1);
this.operand1 = operand1;
}
public
int getOperand2()
{
return operand2;
}
public
void setOperand2(int operand2)
{
System.out.println(operand2);
this.operand2 = operand2;
}
public
int getSum()
{
return operand1 + operand2; // 计算两个整数的代码数和
}
}
从上面的代码可以看出,动作类的一个特征就是要覆盖execute方法,只是Struts2的execute方法没有参数了,而Struts1.x的execute方法有四个参数。而且execute方法的返回值也不同的。Struts2只返回一个String,用于表述执行结果(就是一个标志)。上面代码的其他部分将在下面讲解。
【第3步】 编写ActionForm类
在本例中当然需要使用ActionForm了。在Struts1.x中,必须要单独建立一个ActionForm类(或是定义一个动作Form),而在Struts2中ActionForm和Action已经二合一了。从第二步的代码可以看出,后面的部分就是应该写在ActionForm类中的内容。所以在第2步,本例的ActionForm类已经编写完成(就是Action类的后半部分)。
【第4步】 配置Action类
这一步struts1.x和struts2.x都是必须的,只是在struts1.x中的配置文件一般叫struts-config.xml(当然也可以是其他的文件名),而且一般放到WEB-INF目录中。而在struts2.x中的配置文件一般为struts.xml,放到WEB-INF"classes目录中。下面是在struts.xml中配置动作类的代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" namespace="/mystruts"
extends="struts-default">
<action name="sum" class="action.FirstAction">
<result name="positive">/positive.jsp</result>
<result name="negative">/negative.jsp</result>
</action>
</package>
</struts>
在<struts>标签中可以有多个<package>,第一个<package>可以指定一个Servlet访问路径(不包括动作名),如“/mystruts”。extends属性继承一个默认的配置文件“struts-default”,一般都继承于它,大家可以先不去管它。<action>标签中的name属性表示动作名,class表示动作类名。
<result>标签的name实际上就是execute方法返回的字符串,如果返回的是“positive”,就跳转到positive.jsp页面,如果是“negative”,就跳转到negative.jsp页面。在<struts>中可以有多个<package>,在<package>中可以有多个<action>。我们可以用如下的URL来访问这个动作:
http://localhost:8080/struts2/mystruts/sum.action
注:Struts1.x的动作一般都以.do结尾,而Struts2是以.action结尾。
【第5步】 编写用户录入接口(JSP页面)
1.
主界面(sum.jsp)
在Web根目录建立一个sum.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>输入操作数</title>
</head>
<body>
求代数和
<br/>
<s:form action="mystruts/sum.action"
>
<s:textfield name="operand1" label=" 操作数1"/>
<s:textfield name="operand2" label=" 操作数2"
/>
<s:submit value="代数和"
/>
</s:form>
</body>
</html>
在sum.jsp中使用了Struts2带的tag。在Struts2中已经将Struts1.x的好几个标签库都统一了,在Struts2中只有一个标签库/struts-tags。这里面包含了所有的Struts2标签。但使用Struts2的标签大家要注意一下。在<s:form>中最好都使用Struts2标签,尽量不要用HTML或普通文本,大家可以将sum.jsp的代码改为如下的形式,看看会出现什么效果:
... ...
求代数和
<br/>
<s:form action="mystruts/sum.action" >
操作数1:<s:textfield name="operand1" /><br/>
操作数2:<s:textfield name="operand1" /><br/>
<s:submit value="代数和" />
</s:form>
... ...
提示一下,在<s:form>中Struts2使用<table>定位。
2.
positive.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"
%>
<html>
<head>
<title>显示代数和</title>
</head>
<body>
代数和为非负整数<h1><s:property value="sum"
/></h1>
</body>
</html>
3.
negative.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"
%>
<html>
<head>
<title>显示代数和</title>
</head>
<body>
代数和为负整数<h1><s:property value="sum"
/></h1>
</body>
</html>
这两个jsp页面的实现代码基本一样,只使用了一个<s:property>标签来显示Action类中的sum属性值。<s:property>标签是从request对象中获得了一个对象中得到的sum属性,如我们可以使用如下的代码来代替<s:property value=”sum”/>:
<%
com.opensymphony.xwork2.util.OgnlValueStack ovs =
(com.opensymphony.xwork2.util.OgnlValueStack)request.getAttribute("struts.valueStack");
out.println(ovs.findString("sum"));
%>
启动Tomcat后,在IE中输入如下的URL来测试这个例子:
http://localhost:8080/struts2/sum.jsp
原文出处:http://www.blogjava.net/nokiaguy/