青岛佳世客网上购物:Struts2教程2:处理一个form多个submit

来源:百度文库 编辑:九乡新闻网 时间:2024/05/17 05:13:32
哈佛校训此刻打盹,你将做梦;而此刻学习,你将圆梦。

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

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

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

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

"  method="post">
 




由于在

中的多个提交按钮都向一个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步】实现主页面(more_submit.jsp)


<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

  
    My JSP 'hello.jsp' starting page
  
  
  
    
          
        
              
    
  

在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的代码如下:


    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    
        
            
                /result.jsp
            
            
                /result.jsp
            
            
        

【第4步】编写结果页(result.jsp)


<%@ page pageEncoding="GBK"%>

  
    提交结果
  
  
    

${result}


  

在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

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


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





乐博Android客户端(支持多帐号的新浪微博)发布。

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


华章培训网视频教程:实现Android版的多功能日历

《Android/OPhone开发完全讲义》(本书版权已输出到台湾)

 样章和目录下载
 互动网 当当网  卓越亚马逊

《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》

script.txt文件下载

 样章下载
 互动网



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

评论

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

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

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

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

# re: Struts2教程2:处理一个form多个submit2008-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大题小做了 还有更简单的方法 可以把改成不同的按钮,在onclick事件中动态改变action就可以了 超简单



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

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

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

# re: Struts2教程2:处理一个form多个submit2008-10-22 16:06lyshyhaungli

学习了
的确很好啊!!  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2008-11-12 15:28luo

感谢楼主!一直支持!  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2008-11-26 14:07bb

x写的 很好  回复  更多评论  

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

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

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

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

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

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

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

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

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

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

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

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

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

如果非要在程序中设置request的编码,可以在struts 2的拦截器中设置。  回复  更多评论  

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

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

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

"Filters with matching URL patterns are placed in the chain in theorder in which they are declared in the DD"这一句是我从headfirst上面copy的,我把自己的requestEncodingFliter声明在struts2的FilterDispatcher前面,这样应该是我的过滤器先处理请求将之编码改变为GBK,为什么是无效的呢?  回复  更多评论  

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

@Hadis

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

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

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

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

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

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

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

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

# re: Struts2教程2:处理一个form多个submit2009-09-09 15:49f

sdsfg

  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2010-03-09 10:19man

教程非常好!  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit[未登录]2010-07-20 20:53枫叶

很通俗,很好,很容易看懂,多谢  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2010-07-26 15:36淘宝网女装皇冠店

org.apache.struts2.interceptor. ServletRequestAware

  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2010-11-03 10:52micahel

博主,问一个弱智问题,${result}为什么取不到属性值?  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2011-03-22 09:28ljj

buxing a :ljh0242@163.com  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2011-04-27 10:51ssjtt

问一下,如果想使用超链接,通过js提交form跳转该如何写呢,我在firefox里试可以,但在ie中却不行,能进入action,但页面只是刷一下,没有跳到相应的页面  回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2011-05-31 21:40ealge

真的是个好东西 啊 谢谢楼主了啊啊   回复  更多评论  

# re: Struts2教程2:处理一个form多个submit2011-08-31 20:15ysj

转到的result页面依然显示是${result}..为什么呢?  回复  更多评论