本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:
struts2教程1:第一个struts2程序
在很多web应用中,为了完成不同的工作,一个html form标签中可能有两个或多个submit按钮,如下面的代码所示:
<html action="" method="post">
<input type="submit" value="保存" />
<input type="submit" value="打印" />
html>
由于在中的多个提交按钮都向一个action提交,使用struts2 action的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步】实现凯发k8网页登录主页面(more_submit.jsp)
<%@ page language="java" import="java.util.*" pageencoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>my jsp 'hello.jsp' starting pagetitle>
head>
<body>
<s:form action="submit.action" >
<s:textfield name="msg" label="输入内容"/>
<s:submit name="save" value="保存" align="left" method="save"/>
<s:submit name="print" value="打印" align="left" method="print" />
s:form>
body>
html>
在more_submit.jsp中有两个submit:保存和打印。其中分别通过method属性指定了要调用的方法:save和print。因此,在action类中必须要有save和print方法。
【第2步】实现action类(moresubmitaction)
package action;
import javax.servlet.http.*;
import com.opensymphony.xwork2.actionsupport;
import org.apache.struts2.interceptor.*;
public class moresubmitaction extends actionsupport implements servletrequestaware
{
private string msg;
private javax.servlet.http.httpservletrequest request;
// 获得httpservletrequest对象
public void setservletrequest(httpservletrequest request)
{
this.request = request;
}
// 处理save submit按钮的动作
public string save() throws exception
{
request.setattribute("result", "成功保存[" msg "]");
return "save";
}
// 处理print submit按钮的动作
public string print() throws exception
{
request.setattribute("result", "成功打印[" msg "]");
return "print";
}
public string getmsg()
{
return msg;
}
public void setmsg(string msg)
{
this.msg = msg;
}
}
上面的代码需要注意如下两点:
save和print方法必须存在,否则会抛出java.lang.nosuchmethodexception异常。
struts2 action动作中的方法和struts1.x action的execute不同,只使用struts2 action动作的execute方法无法访问request对象,因此,struts2 action类需要实现一个struts2自带的拦截器来获得request对象,拦截器如下:
org.apache.struts2.interceptor. servletrequestaware
【第3步】配置struts2 action
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="demo" extends="struts-default" >
<action name="submit" class="action.moresubmitaction">
<result name="save" >
/result.jsp
result>
<result name="print">
/result.jsp
result>
action>
package>
struts>
【第4步】编写结果页(result.jsp)
<%@ page pageencoding="gbk"%>
<html>
<head>
<title>提交结果title>
head>
<body>
<h1>${result}h1>
body>
html>
在result.jsp中将在save和print方法中写到request属性中的执行结果信息取出来,并输出到客户端。
启动tomcat后,在ie中执行如下的url来测试程序:
http://localhost:8080/moresubmit/more_submit.jsp
大家也可以直接使用如下的url来调用save和print方法:
调用save方法:http://localhost:8080/moresubmit/submit!save.action
调用print方法:http://localhost:8080/moresubmit/submit!print.action
源代码:
下一篇:struts2教程3:struts.xml常用配置解析
《android开发完全讲义(第2版)》(本书凯发k8网页登录的版权已输出到台湾)
《android高薪之路:android程序员面试宝典 》
新浪微博: 昵称:李宁_lining