struts2教程2:处理一个form多个submit -凯发k8网页登录

随笔 - 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>

由于在中的多个提交按钮都向一个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步】实现凯发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属性指定了要调用的方法: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

源代码:


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





android开发完全讲义(第2版)(本书凯发k8网页登录的版权已输出到台湾)



android高薪之路:android程序员面试宝典


新浪微博:   昵称:李宁_lining

posted on 2008-04-16 09:18 银河使者 阅读(53217) 评论(41)     所属分类: struts2 原创

# re: struts2教程2:处理一个form多个submit  回复     

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

# 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大题小做了 还有更简单的方法 可以把 改成不同的按钮,在onclick事件中动态改变action就可以了 超简单



你的教程写的很棒,支持楼主额!赞一个,狂顶!!!!!!!!(*^__^*) 嘻嘻……
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 |

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# 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 |

# 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 |

# 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 |

# 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 |

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

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

sdsfg

2009-09-09 15:49 |

# re: struts2教程2:处理一个form多个submit  回复     

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

# 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 |

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

# 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 |

# re: struts2教程2:处理一个form多个submit  回复     

@银河使者
你可以使用
2011-11-24 09:39 |

# re: struts2教程2:处理一个form多个submit  回复     

对楼主把提交的方法写在jsp标签里表示不满。





我觉得写在这里更合理些




2012-06-21 14:29 |

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

楼主已经写得很详细了, 补充一点:
可以带参数调用print方法:
!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 |

# re: struts2教程2:处理一个form多个submit  回复     

不错
2014-04-02 00:12 |

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

博主您好,请教个问题。

调用save方法:!save.action

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

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

# re: struts2教程2:处理一个form多个submit  回复     

@ygh
哥们,我之前也报你这个错,后经发现 value必须要是true,如果是false,就不能动态配置了 所以报错
2014-06-24 11:05 |

# re: struts2教程2:处理一个form多个submit  回复     

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

# re: struts2教程2:处理一个form多个submit  回复     

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

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


网站导航:
              
相关文章:
 
网站地图