zoukankan      html  css  js  c++  java
  • struts2 处理一个form多个submit

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

    1. < !--[if !supportLineBreakNewLine]--> 
    2. < html action=""  method="post"> 
    3.    
    4. < input type="submit" value="保存" /> 
    5. < input type="submit" value="打印" /> 
    6. < /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)

    1. < %@ page language="java" import="java.util.*" pageEncoding="GBK"%> 
    2. < %@ taglib prefix="s" uri="/struts-tags" %> 
    3. < html> 
    4.   < head> 
    5.     < title>My JSP 'hello.jsp' starting page< /title> 
    6.   < /head> 
    7.     
    8.   < body> 
    9.     < s:form action="submit.action" > 
    10.         < s:textfield name="msg" label="输入内容"/>    
    11.         < s:submit name="save" value="保存" align="left" method="save"/> 
    12.         < s:submit name="print" value="打印" align="left" method="print" />        
    13.     < /s:form> 
    14.   < /body> 
    15. < /html> 

    在more_submit.jsp中有两个submit:保存和打印。其中分别通过method属性指定了要调用的方法:save和print。因此,在Action类中必须要有save和print方法。

    【第2步】实现Action类(MoreSubmitAction)

    1. package action;  
    2.  
    3. import javax.servlet.http.*;  
    4.  
    5. import com.opensymphony.xwork2.ActionSupport;  
    6. import org.apache.struts2.interceptor.*;  
    7.  
    8. public class MoreSubmitAction extends ActionSupport implements ServletRequestAware  
    9. {  
    10.     private String msg;  
    11.     private javax.servlet.http.HttpServletRequest request;  
    12.     // 获得HttpServletRequest对象  
    13.     public void setServletRequest(HttpServletRequest request)  
    14.     {  
    15.         this.request = request;  
    16.     }  
    17.     // 处理save submit按钮的动作  
    18.     public String save() throws Exception  
    19.     {  
    20.         request.setAttribute("result""成功保存[" + msg + "]");  
    21.         return "save";  
    22.     }  
    23.  
    24.     // 处理print submit按钮的动作  
    25.     public String print() throws Exception  
    26.     {  
    27.         request.setAttribute("result""成功打印[" + msg + "]");  
    28.         return "print";  
    29.     }  
    30.     public String getMsg()  
    31.     {  
    32.         return msg;  
    33.     }  
    34.  
    35.     public void setMsg(String msg)  
    36.     {  
    37.         this.msg = msg;  
    38.     }  
    39. }  

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

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

    1. < ?xml version="1.0" encoding="UTF-8" ?> 
    2. < !DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.0.dtd"> 
    5. < struts>      
    6.     < package name="demo" extends="struts-default" > 
    7.         < action name="submit"  class="action.MoreSubmitAction"> 
    8.             < result name="save" > 
    9.                 /result.jsp  
    10.             < /result> 
    11.             < result name="print"> 
    12.                 /result.jsp  
    13.             < /result> 
    14.         < /action>      
    15.     < /package>      
    16. < /struts> 

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

    1. < %@ page pageEncoding="GBK"%> 
    2. < html> 
    3.   < head> 
    4.     < title>提交结果< /title> 
    5.   < /head> 
    6.   < body> 
    7.     < h1>${result}< /h1> 
    8.   < /body> 
    9. < /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

  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/eggbucket/p/2343863.html
Copyright © 2011-2022 走看看