随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

Struts2教程2:处理一个form多个submit

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Struts2教程1:第一个Struts2程序

  在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit按钮,如下面的代码所示:

<html action=""  method="post">
 
<input type="submit" value="保存" />
<input type="submit" value="打印" />
</html>

由于在<form>中的多个提交按钮都向一个action提交,使用Struts2 Actionexecute方法就无法判断用户点击了哪一个提交按钮。如果大家使用过Struts1.x就会知道在Struts1.2.9之前的版本需要使用一个LookupDispatchAction动作来处理含有多个submitform。但使用LookupDispatchAction动作需要访问属性文件,还需要映射,比较麻烦。从Struts1.2.9开始,加入了一个EventDispatchAction动作。这个类可以通过java反射来调用通过request参数指定的动作(实际上只是判断某个请求参数是不存在,如果存在,就调用在action类中和这个参数同名的方法)。使用EventDispatchAction必须将submitname属性指定不同的值以区分每个submit。而在Struts2中将更容易实现这个功能。

当然,我们也可以模拟EventDispatchAction的方法通过request获得和处理参数信息。但这样比较麻烦。在Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执行不同的方法(默认执行的是execute方法)。使用这种方式也需要通过请求参来来指定要执行的动作。请求参数名的格式为

action!method.action

注:由于Struts2只需要参数名,因此,参数值是什么都可以。

下面我就给出一个实例程序来演示如何处理有多个submitform

【第1步】实现主页面(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 page</title>
  
</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属性指定了要调用的方法:saveprint。因此,在Action类中必须要有saveprint方法。

【第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;
    }
}

上面的代码需要注意如下两点:

saveprint方法必须存在,否则会抛出java.lang.NoSuchMethodException异常。

Struts2 Action动作中的方法和Struts1.x Actionexecute不同,只使用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中将在saveprint方法中写到request属性中的执行结果信息取出来,并输出到客户端。

启动Tomcat后,在IE中执行如下的URL来测试程序:

    http://localhost:8080/moresubmit/more_submit.jsp

大家也可以直接使用如下的URL来调用saveprint方法:

调用save方法:http://localhost:8080/moresubmit/submit!save.action

调用print方法:http://localhost:8080/moresubmit/submit!print.action

源代码:http://www.itpub.net/attachment.php?aid=520773


下一篇:Struts2教程3:struts.xml常用配置解析





Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2008-04-16 09:18 银河使者 阅读(53315) 评论(41)  编辑  收藏 所属分类: Struts2 原创

评论

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

使用dmi也可以实现.另外问一下result里面的name属性可以自定义.有什么原则?
2008-07-19 21:36 | aidirac

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

result里面的属性可以是任何值,不能是execute,还有其它几个actionsupport定义的方法名,否则会抛出异常,
2008-07-19 21:56 | 银河使者

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

实现多submit的方法非常多,这只是其中之一,在struts1.2.9以后的struts1.x版本中提供了一个action来处理,原理是通过判断某个请求参数是否为null来处理(这个请求参数就是某个submit的name属性值)
2008-07-19 21:58 | 银河使者

# re: Struts2教程2:处理一个form多个submit[未登录]  回复  更多评论   

public class MoreSubmitAction extends ActionSupport implements ServletRequestAware

这个就是一个action处理不同的请求,类似于strtus1.2中的dispachaction 呵呵o(∩_∩)o... 还有你说的多个submit大题小做了 还有更简单的方法 可以把<input type="submit" value="打印"> 改成不同的按钮,在onclick事件中动态改变action就可以了 超简单 <input type="button" value="打印" onclick="print();">

<script>
function print(){
document.forms.testForm.action="你要转到的action";
document.forms.testForm.submit();//提交表单
}
</script>

你的教程写的很棒,支持楼主额!赞一个,狂顶!!!!!!!!(*^__^*) 嘻嘻……
2008-08-18 01:55 | 小毅

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

没错,用javascript也是一种方法。不过我的教程只在演示struts 2关于这方面的功能,并不是为了实现而实现。 用javascript适合于所有的语言、所有的web系统。
2008-08-18 09:24 | 银河使者

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

学习了
的确很好啊!!
2008-10-22 16:06 | lyshyhaungli

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

感谢楼主!一直支持!
2008-11-12 15:28 | luo

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

x写的 很好
2008-11-26 14:07 | bb

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

可能在按钮的action属性来指定要提交的东西!
2008-12-17 10:53 | zhongmingweixp

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

写的很好, 顶,顶,顶,顶,顶,顶,顶,顶,顶,顶,顶.........
2009-01-19 13:44 | java_xu

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

本例中依然有编码问题,在表单中填入中文,提交后无法显示。我添加了一个filter进行调用request.setCharacterEncoding("GBK") , 并且将该filter配置在FilterDispatcher之前,但是依然无效。不解,希望博主指教。
2009-01-21 17:37 | Hadis

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@Hadis
是这样的,Struts 2默认采用了UTF-8编码(可以在struts.properties或struts.xml文件中修改这一设置),而我用的是GBK,把你的程序都改成UTF-8试试。实在不行,把你做的例子发给我,我的mail是asklining@126.com,我看看。发过来时别忘了留言。
2009-01-21 17:49 | 银河使者

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

我把more_submit.jsp的pageEncoding改成UTF-8 可以显示中文了
但是为什么这个时候使用过滤器设置request的编码无效了呢?
2009-01-21 18:49 | Hadis

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@Hadis
是这样的,过滤器是对Servlet的,而Struts 2是通过拦截器来处理action的,当客户端发送请求时,首先这个请求会被struts 2的过滤器拦截(在web.xml文件中可以看到处理action的struts 2过滤器),并进行分析,如果是action,则进行Struts 2的处理流程,也就是调用相应的struts 2拦截器,最后会调用action类的execute方法。在这个过程中,和web.xml中配置的其他过滤器一点关系都没有,因为在web.xml文件中配置的过滤器并不会过滤action,而处理action的是由struts2的拦截器完成的。

如果客户端发送的是非action的请求,则struts2会将其交由Servlet引擎来处理,这时过滤器才有效。

如果非要在程序中设置request的编码,可以在struts 2的拦截器中设置。
2009-01-21 19:20 | 银河使者

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

filter不是针对请求url的吗?针对符合filter-mapping的url进行处理,当链上的所有fliter都处理结束的时候发送到请求的servlet,对吧?你的意思是不是说,因为页面请求的资源是一个action,所以struts2的filter得到请求之后并不发送到过滤链上。struts2是如何保证自己的filter优先处理请求呢?我还有好多问题想请教如果方便的话希望博主可以加我的QQ:89477048
2009-01-21 21:04 | Hadis

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

"Filters with matching URL patterns are placed in the chain in the order in which they are declared in the DD"这一句是我从head first上面copy的,我把自己的requestEncodingFliter声明在struts2的FilterDispatcher前面,这样应该是我的过滤器先处理请求将之编码改变为GBK,为什么是无效的呢?
2009-01-21 21:12 | Hadis

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@Hadis

一般FilterDispatcher可设为"/*"以结果所有的请求,当然,也可以设为*.action,只截获action请求,

不知你客户端的jsp页面是GBK,还是utf-8,就算你在自己的过滤器中设了GBK,在执行FilterDispathcer时仍然按着Struts 2的设置来处理,就是说,还是会设成utf-8。你可以在自己的过滤器中在设置完request的gbk编码后,使用request.getParameter方法来自己读一下请求参数的值,看看是不是乱码!
2009-01-21 21:21 | 银河使者

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

十分感谢博主的提示~!!
2009-01-21 21:54 | Hadis

# re: Struts2教程2:处理一个form多个submit[未登录]  回复  更多评论   

希望能把标签生成的html和js部分贴出来就好,这样更方便理解
2009-03-12 23:05 | yxy

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@yxy
这个没什么不好理解的,只是通过url来通知服务端调用哪个方法。
2009-03-13 08:38 | 银河使者

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

sdsfg

2009-09-09 15:49 | f

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

教程非常好!
2010-03-09 10:19 | man

# re: Struts2教程2:处理一个form多个submit[未登录]  回复  更多评论   

很通俗,很好,很容易看懂,多谢
2010-07-20 20:53 | 枫叶

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

org.apache.struts2.interceptor. ServletRequestAware

2010-07-26 15:36 | 淘宝网女装皇冠店

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

博主,问一个弱智问题,${result}为什么取不到属性值?
2010-11-03 10:52 | micahel

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

buxing a :ljh0242@163.com
2011-03-22 09:28 | ljj

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

问一下,如果想使用超链接,通过js提交form跳转该如何写呢,我在firefox里试可以,但在ie中却不行,能进入action,但页面只是刷一下,没有跳到相应的页面
2011-04-27 10:51 | ssjtt

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

真的是个好东西 啊 谢谢楼主了啊啊
2011-05-31 21:40 | ealge

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

转到的result页面依然显示是${result}..为什么呢?
2011-08-31 20:15 | ysj

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

Struts has detected an unhandled exception:

Messages: No result defined for action ygh.struts.moresubmit.action.MoreSubmitAction and result success

2011-11-13 09:48 | ygh

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@银河使者
你可以使用<c:out value="${result}" />
2011-11-24 09:39 | 刀伤

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

对楼主把提交的方法写在jsp标签里表示不满。
<s:submit name="save" value="保存" align="left" method="save"/>
<s:submit name="print" value="打印" align="left" method="print" />



我觉得写在这里更合理些
<struts>
<package name="demo" extends="struts-default" >
<action name="submit" class="action.MoreSubmitAction" method = " 这里 ">
<result name="save" >
2012-06-21 14:29 | lukia

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

学习了
2013-09-10 10:37 | 鱼儿

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

楼主已经写得很详细了, 补充一点:
可以带参数调用print方法:
http://localhost:8080/moresubmit/submit!print.action?msg=参数
这样更便于调试
2014-02-07 16:33 | 吕小布

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

为什么我照着做,返回的是No result defined for action action.MoreSubmitAction and result success
2014-03-07 22:07 | Fylee

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

不错
2014-04-02 00:12 | shunshine

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

博主你好,如果method是用在jsp表单那执行会出现错误,应该是没有传回相应的method,我将method放在struts.xml的action里面并指定一个method就可以实现,不过两个按钮只显示一个值
2014-04-02 11:09 | anymore

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

博主您好,请教个问题。

调用save方法:http://localhost:8080/moresubmit/submit!save.action

我配置的是/* 不是*.action

请问我直接地址栏输入应该怎么写?
2014-06-04 11:34 | yoursair

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@ygh
哥们,我之前也报你这个错,后经发现<constant name="struts.enable.DynamicMethodInvocation" value="true" /> value必须要是true,如果是false,就不能动态配置了 所以报错
2014-06-24 11:05 | clear

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@clear
请问这个代码是写在哪里呢?struts.xml?
2014-08-13 11:24 | leietal

# re: Struts2教程2:处理一个form多个submit  回复  更多评论   

@clear
加上去已解决了,在struts.xml文件中打不出这个标签。。。
2014-08-13 11:43 | leietal

只有注册用户登录后才能发表评论。


网站导航: