Struts2框架搭建教程Word下载.docx
《Struts2框架搭建教程Word下载.docx》由会员分享,可在线阅读,更多相关《Struts2框架搭建教程Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
![Struts2框架搭建教程Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/16/47b8a7d5-34cc-4338-ab26-771ad808c776/47b8a7d5-34cc-4338-ab26-771ad808c7761.gif)
由于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程序。
这个程序的功能是让用户录入两个整数,并提交给一个StrutsAction,并计算这两个数的代数和,如果代码和为非负数,则跳转到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>
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;
operand2;
String
execute()
throws
Exception
if
(getSum()
>
=
0)
//
如果代码数和是非负整数,跳到positive.jsp页面
return
"
positive"
;
}
else
如果代码数和是负整数,跳到negative.jsp页面
negative"
getOperand1()
void
setOperand1(int
operand1)
System.out.println(operand1);
this.operand1
getOperand2()
}
setOperand2(int
operand2)
System.out.println(operand2);
this.operand2
getSum()
operand1
+
计算两个整数的代码数和
从上面的代码可以看出,动作类的一个特征就是要覆盖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"
//struts.apache.org/dtds/struts-2.0.dtd"
struts>
name="
struts2"
namespace="
/mystruts"
extends="
struts-default"
action
sum"
class="
action.FirstAction"
result
/positive.jsp<
/result>
/negative.jsp<
/action>
/package>
/struts>
在<
标签中可以有多个<
package>
,第一个<
可以指定一个Servlet访问路径(不包括动作名),如“/mystruts”。
extends属性继承一个默认的配置文件“struts-default”,一般都继承于它,大家可以先不去管它。
action>
标签中的name属性表示动作名,class表示动作类名。
result>
标签的name实际上就是execute方法返回的字符串,如果返回的是“positive”,就跳转到positive.jsp页面,如果是“negative”,就跳转到negative.jsp页面。
中可以有多个<
,在<
。
我们可以用如下的URL来访问这个动作:
8080/struts2/mystruts/sum.action
注:
Struts1.x的动作一般都以.do结尾,而Struts2是以.action结尾。
【第5步】编写用户录入接口(JSP页面)
主界面(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"
textfield
operand1"
label="
操作数1"
/>
operand2"
操作数2"
submit
value="
代数和"
/s:
form>
/body>
/html>
在sum.jsp中使用了Struts2带的tag。
在Struts2中已经将Struts1.x的好几个标签库都统一了,在Struts2中只有一个标签库/struts-tags。
这里面包含了所有的Struts2标签。
但使用Struts2的标签大家要注意一下。
中最好都使用Struts2标签,尽量不要用HTML或普通文本,大家可以将sum.jsp的代码改为如下的形式,看看会出现什么效果:
......
求代数和
formaction="
>
操作数1:
textfieldname="
/>
操作数2:
submitvalue="
提示一下,在<
中Struts2使用<
table>
定位。
positive.jsp
显示代数和<
代数和为非负整数<
h1>
property
/h1>
negative.jsp
代数和为负整数<
这两个jsp页面的实现代码基本一样,只使用了一个<
property>
标签来显示Action类中的sum属性值。
标签是从request对象中获得了一个对象中得到的sum属性,如我们可以使用如下的代码来代替<
propertyvalue=”sum”/>
:
%
com.opensymphony.xwork2.util.OgnlValueStackovs=
(com.opensymphony.xwork2.util.OgnlValueStack)request.getAttribute("
struts.valueStack"
);
out.println(ovs.findString("
));
启动Tomcat后,在IE中输入如下的URL来测试这个例子:
8080/struts2/sum.jsp
Struts2教程2:
处理一个form多个submit
在很多Web应用中,为了完成不同的工作,一个HTMLform标签中可能有两个或多个submit按钮,如下面的代码所示:
--[if!
supportLineBreakNewLine]-->
html
method="
post"
input
type="
submit"
保存"
打印"
由于在<
中的多个提交按钮都向一个action提交,使用Struts2Action的execute方法就无法判断用户点击了哪一个提交按钮。
如果大家使用过Struts1.x就会知道在Struts1.2.9之前的版本需要使用一个LookupDispatchAction动作来处理含有多个submit的form。
但使用LookupDispatchAction动作需要访问属性文件,还需要映射,比较麻烦。
从Struts1.2.9开始,加入了一个EventDispatchAction动作。
这个类可以通过java反射来调用通过request参数指定的动作(实际上只是判断某个请求参数是不存在,如果存在,就调用在action类中和这个参数同名的方法)。
使用EventDispatchAction必须将submit的name属性指定不同的值以区分每个submit。
而在Struts2中将更容易实现这个功能。
当然,我们也可以模拟EventDispatchAction的方法通过request获得和处理参数信息。
但这样比较麻烦。
在Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执行不同的方法(默认执行的是execute方法)。
使用这种方式也需要通过请求参来来指定要执行的动作。
请求参数名的格式为
action!
method.action
由于Struts2只需要参数名,因此,参数值是什么都可以。
下面我就给出一个实例程序来演示如何处理有多个submit的form:
【第1步】实现主页面(more_submit.jsp)
My
JSP
'
hello.jsp'
starting
page<
submit.action"
msg"
输入内容"
save"
align="
left"
print"
在more_submit.jsp中有两个submit:
保存和打印。
其中分别通过method属性指定了要调用的方法:
save和print。
因此,在Action类中必须要有save和print方法。
【第2步】实现Action类(MoreSubmitAction)
javax.servlet.http.*;
org.apache.struts2.interceptor.*;
MoreSubmitAction
ActionSupport
implements
ServletRequestAware
msg;
javax.servlet.http.HttpServletRequest
request;
获得HttpServletRequest对象
setServletRequest(HttpServletRequest
request)
this.request
处理save
submit按钮的动作
save()
request.setAttribute("
result"
成功保存["
msg
]"
处理print
print()
成功打印["
getMsg()
setMsg(String
msg)
this.msg
上面的代码需要注意如下两点:
save和print方法必须存在,否则会抛出java.lang.NoSuchMethodException异常。
Struts2Action动作中的方法和Struts1.xAction的execute不同,只使用Struts2Action动作的execute方法无法访问request对象,因此,Struts2Action类需要实现一个Struts2自带的拦截器来获得request对象,拦截器如下:
org.apache.struts2.interceptor.ServletRequestAware
【第3步】配置Struts2Action
struts.xml的代码如下:
demo"
action.MoreSubmitAction"
/result.jsp
prin