1. 程式人生 > >Struts2呼叫Action的兩種方法以及引數處理

Struts2呼叫Action的兩種方法以及引數處理

  在Struts2的框架下,Action的配置資訊寫在struts.xml中,用來處理來自頁面的請求。

一.Action呼叫

  1.通過表單呼叫

    表單呼叫是最為常見的呼叫方法,只要搞清表單與Action之間的對應方法即可完成呼叫:

<form action="authorsearch" method="get">
	input author's name:<input type="text" name="author.authorname">
	<input type="submit" value="search">
</form>

    這是一個簡單的表單,其中action屬性即可說明該表單所對應的action,在struts.xml中只要有如下配置即可完成呼叫:
<action name="authorsearch" class="lab2.AuthorSearch">
            <result name="success">/WEB-INF/content/authorsearchresult.jsp</result>
            <result name="error">/WEB-INF/content/error.jsp</result>
</action>

    很明顯,action的name屬性必須要和表單中的action屬性一致。

  2.通過超連結呼叫

  如果想實現點選某個文字或圖片後在後臺執行Java程式碼,就要使用超連結呼叫Action:

<td><a href="./showdetails.action?bookname.title=${l.title}">${l.title }</a></td>

  其中showdetails為struts.xml下的另一Action:

<action name="showdetails" class="lab2.ShowDetails">
            <result name="success">/WEB-INF/content/details.jsp</result>
            <result name="error">/WEB-INF/content/error.jsp</result>
</action>


  顯然,使用超連結時我們使用了相對URL,以上程式碼中的"./showdetails.action"即為相對URL。要注意的是,使用這種方法是必須明確struts.xml中Action所在package的namespace屬性,這裡我的設定為"/",即專案根資料夾,如果是其他目錄,還需要在"/XX.action"前加上該目錄。

二.引數處理

  注意觀察上面的表單和超連結,便能發現author.authorname以及bookname.title這樣的變數,它們的作用是向後臺的Java程式碼傳遞引數。在表單的例子中,author.authorname的值為使用者輸入,而超連結中的"${l.title }"為jsp的EL表示式,這些都是需要交給後臺處理的引數,需要通過Action傳送到後臺,下面用表單的例子說明。

  在後臺對應第一個Action的類為AuthorSearch,程式碼如下:

public class AuthorSearch implements Action {

	private Author author;
	
	@Override
	public String execute() throws Exception {
		//do something
		return null;
	}
}

  Author的定義如下:

public class Author {
	private int authorid;
	private String authorname;
	private String age;
	private String country;
		
	public int getAuthorid() {
		return authorid;
	}

	public void setAuthorid(int authorid) {
		this.authorid = authorid;
	}

	public String getAuthorname() {
		return authorname;
	}

	public void setAuthorname(String authorname) {
		this.authorname = authorname;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}
}

  在程式碼執行時,Struts2框架會“自動”為author.authorname賦值,其值為表單中使用者所輸入的內容,這是如何實現的呢?原來在底層,Struts2框架是這樣實現的:
  1.呼叫request.getParameterNames()方法獲取所有的引數名。我們在JavaEE的API文件中可以看到這個方法的描述:

 

  2.對以上方法返回的每個String執行Action.getMethod("set" + String的首字母大寫)。例如上面舉例的表單中我們的引數名為author.authorname,執行後所呼叫的method為author.setAuthorname(),而在Author類中,該方法正是authorname的setter方法,由此便完成了對author.authorname的賦值。

  所以,當出現Error setting expression 'author.authorname' with value ['XXX', ]的錯誤時,我們就要檢查是否為authorname設定了符合要求的setter方法以及前端的引數名是否與後臺的變數名匹配。

相關推薦

Struts2呼叫Action方法以及引數處理

  在Struts2的框架下,Action的配置資訊寫在struts.xml中,用來處理來自頁面的請求。 一.Action呼叫   1.通過表單呼叫     表單呼叫是最為常見的呼叫方法,只要搞清表單與Action之間的對應方法即可完成呼叫: <form actio

前臺向後臺傳值的方法 以及 從後臺獲取數據的方法

list 獲取數據 data border asc req rip attr 訂單 1、前臺向後臺傳值方法一: 表單提交的方式: 1 <form action="${path }/manage/logon.do" method="post" id="logonFo

執行緒(呼叫方法、全域性變數共享、執行緒數量)

1 # -*- coding:utf-8 -*- 2 # Author:Sure Feng 3 4 5 import threading 6 import time 7 8 9 num = 0 10 11 12 def sing(): 13 # 執行緒間共享全域性變

建構函式 的呼叫方法

#include <iostream> using namespace std; class A { private: public:     A()/*{cout<<"Con

android獲取圖片尺寸的方法以及bitmap的縮放

//Uri.parse("file://"+result.getImage().getCompressPath())) String path=uri.getPath(); Log.e("圖片路徑",path+""); Spa

Java中ArrayList的排序方法以及遍歷的程式碼

方法一: 在類的定義中實現Comparable介面中的compareTo()方法,然後呼叫Collections.sort()進行排序: import java.util.Scanner

struts2開發action 的三方法以及通配符、路徑匹配原則、常量

ucc ces pan ide exce 三種 void 動態方法 div struts2開發action 的三種方法 1、繼承ActionSupport public class UserAction extends ActionSupport {

Javascript 呼叫C# 程式碼並傳遞引數方法

             Javascript呼叫C#程式碼的方法網上介紹了很多種方法,也很詳細,但沒有向C#傳遞引數的方法。今天剛好用到,搞了半天才搞出來(其實我很笨)。下面說一下具體實現的方法。 一、使用HiddenField 控制元件。      HiddenField

vs 2017 製作Dll檔案的方法以及呼叫Dll檔案的方法

近來學習製作Dll檔案,看了幾個視訊教程,看了網上的例子,看了msdn上的例子。現在做個總結,以便來日回顧,同時也希望以大家相互交流學習。注意1:用 method 1 named "Using Load - Time Dynamic Linking" 呼叫dll檔案,需要將相

jsp值傳到後臺Struts2中的action方法

login orm end 通過 實例化 eth log 名稱 選擇 Action接收表單傳遞過來的參數有3種方法: 如,登陸表單login.jsp: 1 <form action="login" method="post" name="form1"> 用戶名

簡單的實現圖片預覽, 通過原生ajax以及 jQuery方法實現圖片預覽,有更好的辦法可以留言喔................

XML HP OS image end php代碼 append sda ext 1.原生寫ajax實現圖片預覽:   結構:     <input type="file">       <img src="" > JavaScri

Jmeter引數化的方法

有兩種方式可以進行引數化 一、通過使用者引數的方法 1、右鍵前置處理器–》使用者引數 2、在使用者引數介面新增變數 3、在HTTP請求頁面新增引數 這樣引數就新增成功了!! 二、通過CSV Data Set Config配置 當然得提前準備你的

呼叫jni的方法javah和RegisterNatives

前言: 呼叫jni的有兩種方法: 一種是通過javah 自動生成jni檔案 一種是載入類庫的時候,呼叫JNIEnv 指標的RegisterNatives方法註冊native方法 RegisterNatives方式有3種好處 1、jni種函式命名自由,不必像javah

java呼叫WebService介面的一方法引數為XML的字串

String xmlinfo = "<data>.......</data>";//xml引數 try { String url = "http://******/Server

ionic2 從子頁面返回帶引數方法

1、使用 Modal 代替 NavController 的 push 方法,然後在子頁面通過 dismiss 方法關閉時可攜帶引數返回母頁面。 在母頁面中: getDetailNews(id) { let newsModal = this.modalCtrl.cr

vs C++ 靜態庫 生成以及使用的方法

C++靜態庫的生成 1、 vs專案配置:選擇 靜態庫 2、 新建標頭檔案 add.h 3、 新建標頭檔案 add.cpp 4、 執行“生成解決方案”,工程DEBUG目錄如下: C++靜態庫的使用 方法一 1、 新建 win32控制檯應用程式 2、 專案屬性-->c/c

dedecms 呼叫欄目(分類)的文章數量的方法

dede統計欄目文章數這一功能還是比較實用的,本文為大家介紹兩種實現方法,大家可以根據需求自由選擇,喜歡的朋友可以參考下 方法一: 涉及到檔案:include/common.func.php 在include/common.func.php最下面也就是

java呼叫內部類的方法

package com.fpi.safety; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Iterator; import java.util.List; p

android 呼叫webservice(方法

   首先介紹下網上常用的webservice呼叫方法,例子很多,我就不詳細介紹了,簡單說下流程: // 建立soapObject物件,引數為名稱空間和呼叫方法名,也就是soap_action. 這個可以在WSDL中獲取.SoapObject object = new So

1.如何避免野指標2.獲取字串的方法以及malloc,calloc,ralloc的使用注意點3.二維三維陣列4.陣列和函式的區別

一:野指標: char *ptr; 定一個指標,沒有賦值,用NULL。 char *ptr = NULL 即表示指向空,不能再做賦值,不能對0地址操作訪問。 //#define NULL (void *)o 如果出現段錯誤,看看對NULL有沒有賦值。 如何避免野指標而不