1. 程式人生 > >一個form,多個submit提交

一個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

相關推薦

一個formsubmit提交

在很多 Web 應用中,為了完成不同的工作,一個 HTML form 標籤中可能有兩個或多個 submit 按鈕,如下面的程式碼所示: < html  action =" "   method ="post" >  < input  type ="sub

用jquery.form實現submit按鈕提交

相關前端程式碼如下: <form id="from1" action="/AjaxTestAutoAction/submit.cspx" method="post"> <p><span>Input:</span> <i

Git 問題一個 master新功能分支怎樣有序地合併和提交

git支援很多種工作流程,我們採用的一般是這樣,遠端建立一個主分支,本地每人建立功能分支,日常工作流程如下: 去自己的工作分支 $ git checkout work 1 工作 …. 提交工作分支的修改 $ git commit -a 1 回到主分支 $ git

一條SQL查詢一個屬性屬性值的情況

cat sele 屬性 clas family 獲取 sql 查詢 group 原先sql獲取角色對應的權限信息: select a.*, group_concat(b.auth_name) as auth_name from sh_role a left join sh_

C語言及程式設計進階例程-2 一個程式檔案

演示:建立多檔案的專案main.c#include <stdio.h> int max(int x,int y); int main( ) { int a,b,c; printf("輸入兩數:"); scanf("%d %d", &a, &b

Jquery--一個form中兩submit事件如何進行區分

一個form表單中,需要有兩個或多個submit操作,如何進行區分呢?                  -----  可以通過修改submit的attr的name值來動態指定需要指定的動作jQuery("#submit_input").attr("name","event

MVC一個form內兩submit按鈕跳轉Controller內不同的Action方法

有次做專案,發現一個問題,不用ajax的話,在一個form裡面 怎麼寫兩個提交按鈕呢,兩個提交按鈕跳轉到不同的action。通過網頁查閱資料,發現一個好用的方法,分享給大家! 後端部分 首先新建一個類,類名 MultiButtonAttribute

按鈕提交一個form表單

class 按鈕 控制 () ctx submit repo rep 事件 多個按鈕提交一個form表單,然後執行控制層不同的方法 在button的onclick事件下可以重寫form的action屬性 <button class="common_button" on

一個form表單中實現submit不同的action

var ctype 編號 表單 顯示 col 格式 action 否則 在button中用JS的事件綁定onclick實現,如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

lvs 一個網卡單個管理ip跨網段VIP解決辦法

lvs keepalived 說明:lvs的vip和realserver的rip是可以跨網段的ifconfig輸出如下:[[email protected]/* */ scripts]# ifconfig eth0 Link encap:Ethernet HWaddr 00:

連表查詢(3)之根據相關條件查詢另外一個表或表的某字段

兩個 mode object 添加 就會 resultmap control var 多個 1、送檢單位 代理商是從代理商表中取得數據 銷售人員從銷售表中取得數據 說一個簡單的思路: sql語句找到連接兩個表的條件,把另外一個表要用到的字段 寫一個 <re

QT之QSignalMapper(可以理解為轉發器按鈕綁定到一個Edit上且能分辨。每個單獨連接的話反而麻煩)

this 不同的 lan each b2c etc gpo 知識點 span QT之QSignalMapper QT之QSignalMapper 簡述 效果圖 上代碼 相關知識點文章 結尾 簡述 QSign

Apollo配置中心解惑(一):關於一個portal管理環境要求環境相互之間不影響獨立

pan program encoding character 建立 環境部署 fat == 127.0.0.1 關於作者的回答很官方,不太懂: https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC

一個tomcat部署專案(同埠專案不同訪問路徑)

使用tomcat的自動部署。(適用於檔案和war包,不需要重啟tomcat服務) 自定義web部署檔案。(只適用於檔案形式的,需要重啟tomcat服務) 一,自動部署 步驟: 瀏覽器輸入127.0.0.1:8080(如果你安裝時,改了埠的話,更改成你設定的埠),

一個頁面有script標籤時執行順序

JavaScript直譯器在執行指令碼時,是按塊執行的。通俗地說,就是瀏覽器在解析HTML文件流時,如果遇到一個script標籤,則JavaScript直譯器會等到這個程式碼塊都載入完成後,先對程式碼塊進行預編譯,然後再執行。執行完畢後,瀏覽器會繼續解析下面的HTML文件流,同時JavaSc

一個Activity中Fragment個別fragment實現沉浸式狀態列

                如上圖,同一個activity(NoActionBar)有多個fragment的情況下,只有"我的"模組需要設定為沉浸式的狀態列,而其他fragmen

【laravel】 複雜表單請求驗證類實現一個類對應表單

一、序言 laravel 中提供了兩種驗證請求資料的方法,第一種方法適用於簡單的驗證,表單驗證和業務邏輯放在一起,顯得業務程式碼臃腫,而且重複的驗證規則基本也是複製貼上,程式碼也不好看,這是關鍵。本篇教程就不說這個了,需要了解的請戳這裡。第二種就是建立請求驗證類,下面就詳細說

Java:假設車庫有3車位(可以通過boolean[]陣列來表示車庫)可以停車一個程式模擬使用者開車離開停車入庫的效果。注意:車位有車時不能停車。

假設車庫有3個車位(可以通過boolean[]陣列來表示車庫)可以停車,寫一個程式模擬多個使用者開車離開,停車入庫的效果。注意:車位有車時不能停車。 1)使用阻塞佇列來實現(BlockingQueue<T>) Producer類 package com.多執行緒停車問

【laravel】 複雜表單請求驗證類實現一個類對應表單

一、序言 laravel 中提供了兩種驗證請求資料的方法,第一種方法適用於簡單的驗證,表單驗證和業務邏輯放在一起,顯得業務程式碼臃腫,而且重複的驗證規則基本也是複製貼上,程式碼也不好看,這是關鍵

SQL 用條件進行排序;以及根據一個條件的進行排序

1、先說第一個用多個條件進行排序      ORDER BY name,age       (多條件排序,還有條件可以再加在後面)      ORDER BY name desc,age&nb