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常用配置解析




WebService(Axis2)视频教程与QQ交流群发布

《银河系列原创教程》发布


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

评论

# re: Struts2教程2:处理一个form多个submit 2008-07-19 21:36 aidirac

使用dmi也可以实现.另外问一下result里面的name属性可以自定义.有什么原则?  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2008-07-19 21:56 银河使者

result里面的属性可以是任何值,不能是execute,还有其它几个actionsupport定义的方法名,否则会抛出异常,  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2008-07-19 21:58 银河使者

实现多submit的方法非常多,这只是其中之一,在struts1.2.9以后的struts1.x版本中提供了一个action来处理,原理是通过判断某个请求参数是否为null来处理(这个请求参数就是某个submit的name属性值)  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit[未登录] 2008-08-18 01:55 小毅

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>

你的教程写的很棒,支持楼主额!赞一个,狂顶!!!!!!!!(*^__^*) 嘻嘻……  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2008-08-18 09:24 银河使者

没错,用javascript也是一种方法。不过我的教程只在演示struts 2关于这方面的功能,并不是为了实现而实现。 用javascript适合于所有的语言、所有的web系统。   回复  更多评论   

# 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 2008-11-26 14:07 bb

x写的 很好  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2008-12-17 10:53 zhongmingweixp

可能在按钮的action属性来指定要提交的东西!  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2009-01-19 13:44 java_xu

写的很好, 顶,顶,顶,顶,顶,顶,顶,顶,顶,顶,顶.........  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2009-01-21 17:37 Hadis

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

# re: Struts2教程2:处理一个form多个submit 2009-01-21 17:49 银河使者

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

# re: Struts2教程2:处理一个form多个submit 2009-01-21 18:49 Hadis

我把more_submit.jsp的pageEncoding改成UTF-8 可以显示中文了
但是为什么这个时候使用过滤器设置request的编码无效了呢?  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2009-01-21 19:20 银河使者

@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的拦截器中设置。  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2009-01-21 21:04 Hadis

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

# re: Struts2教程2:处理一个form多个submit 2009-01-21 21:12 Hadis

"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,为什么是无效的呢?  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2009-01-21 21:21 银河使者

@Hadis

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

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

# re: Struts2教程2:处理一个form多个submit 2009-01-21 21:54 Hadis

十分感谢博主的提示~!!  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit[未登录] 2009-03-12 23:05 yxy

希望能把标签生成的html和js部分贴出来就好,这样更方便理解  回复  更多评论   

# re: Struts2教程2:处理一个form多个submit 2009-03-13 08:38 银河使者

@yxy
这个没什么不好理解的,只是通过url来通知服务端调用哪个方法。  回复  更多评论   



标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-24 09:04 编辑过



<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

公告

我的其他blog

http://nokiaguy.cnblogs.com
http://blog.csdn.net/nokiaguy

我的著作



正在读的书




常用链接

留言簿(18)

我参与的团队

随笔分类(537)

随笔档案(201)

相册

android

CSDN

eclipse

ibm

Java EE

Linux

Web

关注的网站

喜欢的Blog

图书出版

开发工具

操作系统

源码资源

编程语言

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行