`
ghyghoo8
  • 浏览: 189943 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Struts2中action 处理一个form多个submit

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

< html  action =" "   method ="post" >

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



由于在 <form>中的多个提交按钮都向一个 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 "   %>
< 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属性指定了要调用的方法: 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

源代码:http://www.itpub.net/attachment.php?aid=520773
分享到:
评论

相关推荐

    struts2学习教程

    struts2学习教程包括:第一个Struts2程序,处理一个form多个submit,struts.xml常用配置解析,使用validate方法验证数据,使用Validation框架验证数据,在Action类中获得HttpServletResponse对象的四种方法,上传...

    struts2文件上传下载

    struts2文件上传与下载, &lt;s:form name="Myform" action="/fileManage/upload" method="post" enctype="multipart/form-data" theme="simple" &gt; &lt;s:fielderror&gt;&lt;/s:fielderror&gt; 文件"&gt;&lt;/s:file&gt; &lt;s:submit...

    struts2 标签换行

    如下代码:&lt;s:form action="login2"&gt; 用户名" name="username"/&gt; 密码" name="password"/&gt; &lt;s:submit label="提交"/&gt;&lt;/s:form&gt;我们看着以上的代码跟HTML的差不了多少,但是因为struts2表单默认将表单内的每一个元素...

    用Struts2新建一个应用的方法步骤

    用Struts2新建一个应用的方法步骤用Struts2新建一个应用的方法步骤: 1.首先新建一个Web Project。File——new——Web Project,在Project Name中输入一个合法的名字。例如:struts2 2. 单击采单Window——...

    struts2 标签库 帮助文档

    action:直接调用一个Action,根据executeResult参数,可以将Action的处理结果包含到页面中。 bean:创建一个JavaBean实例。。 date:格式化输出一个日期属性。 debug:生成一个调试链接,当单击该链接时,可以看到...

    用js模拟struts2的多action调用示例

    最近修了几个struts2.1升级到2.3后动态方法调用失效的bug,深有感悟, 但是我那种原始方法有一个局限,就是在submit那里写下的action不起作用,就算启动了动态方法调用也不行(我想应该是struts2.3的一个bug),所以...

    深入浅出Struts2(附源码)

    作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...

    struts2中一个表单中提交多个请求的例子(多个提交按钮)

    在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit按钮,Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执行不同的方法(默认执行的是execute方法)

    struts2_demo.rar_Java编程_Java_

    处理一个form多个submit第五个故事,关于struts2.0的验证框架第六个故事,关于struts2.0的多文件上传第七个故事,关于struts2.0的单个文件上传第八个故事,关于struts2.0的批量处理第九个故事,关于struts2.0里的get...

    一个简单的struts例子

    一个简单的struts例子,; charset=GBK"%&gt; &lt;%@ taglib prefix="s" uri="/struts-tags"%&gt; &lt;html&gt; &lt;body&gt; &lt;s:form action="h2"&gt; 输入你的名字"/&gt; &lt;s:submit value="确认"/&gt; &lt;/s:form&gt; &lt;/body&...

    struts1.x上传实例

    &lt;form-bean name="actionForm" type="org.apache.struts.action.DynaActionForm"&gt; &lt;form-property name = "filedata" type = "org.apache.struts.upload.FormFile" /&gt; &lt;/form-bean&gt; &lt;/form-beans&gt; &lt;action-...

    Struts原理、开发及项目实施

    Struts的工作原理,如下图2所示: &lt;br/&gt; 控制:通过图2大家可以看到有一个XML文件Struts-config.xml,与之相关联的是Controller,在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet...

    Myeclipse开发struts+hibernate+spring新手入门--环境配置---项目开发示例

    建立一个jsp文件,取名为:login.jsp 代码如下: &lt;% @ taglib uri = " http://struts.apache.org/tags-bean " prefix = " bean " %&gt; &lt;% @ taglib uri = " http://struts.apache.org/tags-...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。书中...

    低清版 大型门户网站是这样炼成的.pdf

    2.1.5 struts 2的业务控制器action实现 39 2.1.6 struts 2的处理结果result 45 2.1.7 功能强大的表达式语言ognl 47 2.1.8 struts 2的运行流程分析—helloworld 48 2.1.9 struts 2的异常处理 52 2.2 struts 2...

    dangdang和smartstruts2.rar

    8、写一个struts.xml 包含use.xml 1)跳转到 /user/register_form.jsp &lt;action name="register" class="action.user.RegistFormAction"&gt; &lt;result name="form"&gt;/user/register_form.jsp &lt;/action&gt;完善action。 ...

    Java Oracle分页处理

    //保存一个PaginationBean的对象,用于在页面中调用其中的属性,判断页面的跳转 request.setAttribute("page", page.getPagePagination()); //用于其他页面调用PaginationBean的对象 request.getSession...

    基于Struts+Hibenater

    &lt;form action="userManage.do?method=login" method="post"&gt; 姓名: &lt;td&gt;&lt;input type="text" name="username" /&gt; 密码: &lt;td&gt;&lt;input type="password" name="password" /&gt;...

Global site tag (gtag.js) - Google Analytics