Struts2學習---基本配置,action,動態方法調用,action接收參數

首先我們先來直接配置,然后再來講原理:?
第一步:jar包的引入:?
我們可以到struts2的官網上下載:?
http://struts.apache.org/download.cgi#struts2513

然后解壓將里面的app文件夾下的示例war文件解壓,將里面的struts.xml復制到我們新創建的src目錄下(特別說一下,struts2最新的Struts 2.5.13版本壓縮包里面沒有示例的blank示例文件,我是在2.3.34里面獲得的)

配置文件大概是這樣的:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts><constant name="struts.enable.DynamicMethodInvocation" value="false" /><constant name="struts.devMode" value="true" /><package name="default" namespace="/" extends="struts-default"><action name="hello"><result>/Hello.jsp</result></action></package>
</struts>    

?以上的配置文件是經過我的修改的,所以比較簡潔,因為我們第一步實現action并沒有那么復雜。

第二步,我們需要在web.xml中配置過濾器,將struts組件插入進來。?
配置文件大概是這樣:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>testStruts2</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

然后我們在根目錄下創建一個jsp文件:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>hello<br></body>
</html>

里面不需要太多東西,我們只是做一個簡單的測試。

然后我們將項目部署到tomcat中,啟動。

然后用瀏覽器訪問:?
http://localhost:8080/testStruts2/hello?
瀏覽器就會跳轉到我們寫好的Hello.jsp頁面。

我們接著講原理

首先,瀏覽器發出一個url,這個url首先發送到服務器,也就是我們的tomcat,發到tomcat過后,將交給web.xml,然后進入過濾器,通過過濾器將這個請求發送給StrutsPrepareAndExecuteFilter來處理,

StrutsPrepareAndExecuteFilter調用主配置文件struts.xml中的namespace看是否與namespace吻合,找到與之吻合的package,然后找對應的action的name,然后轉到對應的頁面。

其實上面過程還省略了一些過程:?

就是一個請求到了action的name的時候并不會直接轉到我們的頁面,而是會轉到action對應的類,

上面的struts省略了這一步,但是struts2幫我們默認執行了這一個過程,如果我們補充這個過程的話應該這樣:

<action name="hello" class="testStruts2.HelloAction">
package testStruts2;import com.opensymphony.xwork2.ActionSupport;public class HelloAction extends ActionSupport{public String  execute() {return SUCCESS;}
}

在struts2的主配置文件action中添加一個class=“”,并在項目的testStruts2中添加一個action類,這個action類可以有三種方法來寫,但是都要包含execute方法。?
我們給出剩下的兩種action類書寫方式:

package testStruts2;import com.opensymphony.xwork2.ActionSupport;public class HelloAction{public String  execute() {return "success";}
}
package testStruts2;import com.opensymphony.xwork2.ActionSupport;public class HelloAction implements Action{public String  execute() {return SUCCESS;}
}

以上的兩種方法,一個是不繼承和實現任何方法,但是包含一個execute方法,返回一個success字符串,另一個實現Action方法,返回SUCCESS。
Action里面已經封裝了一些變量,所以實現這個接口的類可以直接返回SUCCESS,同時我們還要知道ActionSupport也實現了Action,并且里面還封裝了大量的方法,這個以后我們將慢慢用到。
以上三種action書寫方式,建議使用第一種,因為我們以后將要經常使用到ActionSupport里面封裝的方法。

經過上面這個的Action返回一個success,然后StrutsPrepareAndExecuteFilter,將action里面的result里的頁面返回給瀏覽器。

?

如果留意的同學,還會發現我們從官網下載下來的blank范例里面action里面還有些其他的屬性,對就是method。

動態方法調用:

定義一個action并不一定實現Action接口,同時也可以不執行execute方法,我們只要將action里面的method屬性改為要執行的方法就行,就像這樣:

<action name="hello" class="testStruts2.HelloAction" method="ADD">

同時我們action里面的方法也要改為ADD,但是返回值類型一定要為String

package testStruts2;
public class HelloAction {public String ADD() {return "success";}
}

這樣對于不同的請求,我們可以根據需要在同一個Action類中用不同的方法處理。?
這樣可以減少創建Action類,并且安全,但是也會造成一個Action類太過龐雜。?
動態方法調用有三種方式,上面的算式一種。

?

繼續我們來說第二種:?
用“!”嘆號方式(不推薦使用)?
這種方法怎么使用呢?

<action name="helloadd" class="testStruts2.HelloAction" ><result>/Hello.jsp</result>
</action>

就是這樣,理論上我們再Action類中含有execute方法不會產生什么影響,但是如果我們將Action類中的方法改為String Add()呢?
就會報錯,所以就用到可!了,我們的url地址應該為:
http://localhost:8080/testStruts2/hello/helloadd!ADD
這樣就會找到ADD方法了。
但是還要注意一點的是我們要將動態方法調用打開:

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

這里默認是關閉的,我們將它改為true就行了。

第三種就是通配符配置了:?

首先我們需要將上面的DMI改為false(不改也可以運行,但是建議改)。

<action name="hello_*" class="testStruts2.HelloAction" method="{1}"><result>/Hello_{1}.jsp</result></action>

然后就是這樣:用*代替未知的url
這里的{1}表示第一個 * 代表的內容 使用通配符可能有好幾個 * ,我們可以根據*的順序用{2}{3}…依次表示
http://localhost:8080/testStruts2/hello/hello_ADD.action用這個url來訪問我們的ADD方法,

當我們需要其他DELETE(刪除的時候)?
只需要輸入http://localhost:8080/testStruts2/hello/hello_DELETE.action?
并在Action類里面添加DELETE方法和添加響應的Hello_DELETE.jsp頁面。

使用通配符簡化了我們好多的配置,原來需要在配置文件中配置好多個action,現在只需要用通配符就可以解決這些,只需要添加響應的Action類(方法)和jsp頁面就行了。

?

<action name="*_*" class="testStruts2.{1}HelloAction" ><result> /{1}_{2}_hello.jsp</result>
</action>

?

上面的是兩個通配符的范例,如果請求是這樣:
http://localhost:8080/testStruts2/hello/hello_DELETE.action
它就能夠根據{1}找到對應的Action類,根據{2}找到對應的方法。
是不是很簡便?(這樣的做法叫做約定優于配置)?

?

action接收參數:

?  我們怎么樣用struts接受客戶端發過來的參數呢?下面列舉四種方法:?

  ①屬性參數輸入

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts><constant name="struts.enable.DynamicMethodInvocation" value="false" /><constant name="struts.devMode" value="true" /><package name="default" namespace="/" extends="struts-default"><action name="user" class="testStruts1.userAction"><result>/user.jsp</result></action></package>
</struts>    

上面是配置文件,沒什么好說的,和之前大同小異。?

我們接下來看看Action類:

package testStruts1;import com.opensymphony.xwork2.ActionSupport;public class userAction extends ActionSupport{String username;public userAction() {}public userAction(String username) {super();this.username = username;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String execute() {System.out.println(username);return SUCCESS;} 
}

首先這個類要符合javabean的命名規則,我們再Action類中添加了一個username屬性,并含有它的set get方法,并在execute里面將接收到的username輸出到控制臺來證實實驗。

當我們將項目部署到服務器上后,在瀏覽器中輸入一下URl:?
http://localhost:8080/testStruts1/user.action?username=aa?
控制臺便會將接受到的username參數輸出。

我們可以看到上面使用Action類的屬性來接收參數的,struts通過我們給出的set get 方法幫助我們完成賦值。

②同樣我們也可以定義一個實體類來來接收這些信息(官方叫DomainModel):?

例如?
這個是我們提交的信息:

<form action="login" method="post">用戶名:<input type="text" name="user.username"><br>密碼<input type="password" name="user.password"><br><input type="submit" value="登錄"></form>
/*input里面一定要使用user.username和user.password和實體類對應,或者使用struts2提供的標簽,否則會出錯(不要問我是怎么知道的 哭臉.jpg)*/

這個是實體類:

package entity;public class User {String username;String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
package testStruts1;import com.opensymphony.xwork2.ActionSupport;import entity.User;public class userAction extends ActionSupport{User user;//不需要new對象,struts2幫我們完成了public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String execute() {if(user.getUsername().equals("username")&&user.getPassword().equals("password")) {return SUCCESS;}return ERROR;} 
}
/*struts.xml*/<action name="login" class="testStruts1.userAction"><result name="success">/user.jsp</result><result name="error">/error.jsp</result></action>

?③還有一種使用DTO(date transfer object)數據傳輸對象來進行傳輸。?
這種方式主要是應對提交的參數和我們的實體對象不匹配的狀況:

比如用戶注冊的時候會輸入第二次密碼來進行確認,我們將接受兩個密碼,所以在這個類中我們接收三個參數:username ,password,confirmPassword。?

然后在Action類的execute方法中使用DTO對象來對User對象進行賦值:

User user = new User();//這里就需要我們實例化了,因為struts實例化的機會被下面的玩意搶了。
  DTO dto ;public String execute(){user.setUserName(dto.getUserName());  user.setUserPassword(dto.getUserPassword());  //后面再利用user實例來進行一系列的操作。
}

當然現在我們有更為先進的技術就是我們完全可以用js來在客戶端確認是否相同,然后將數據傳輸過來。

?

④還有一種叫方法:ModelDriven

public class userAction extends ActionSupport implements ModelDriven<User>{User user = new User();//這里需要自己new對象
    @Overridepublic User getModel() {return user;}public void setUser(User user) {this.user = user;}public User getModel() {return user;}public String execute() {if(user.getUsername().equals("username")&&user.getPassword().equals("password")) {return SUCCESS;}return ERROR;} 
}

就是這樣,實現ModelDriven接口,并實現getModel方法,直接獲得這個模型對象user。怎么實現這樣的原理的呢?
是通過一個缺省的攔截器ModelDrivenInterceptor這里面判斷一個Action對象是否實現ModelDriven,如果實現就返回這個User對象,并將User對象push到valueStack中(valueStack后邊介紹)。

?

?

版權聲明:本文為博主原創文章,如需轉載請表明出處。 https://blog.csdn.net/qq_39266910/article/details/78485739

?

轉載于:https://www.cnblogs.com/chengshun/p/9772835.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396531.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現對數組找最大最小數

實現對數組找最大最小數 在用js的過程中我們往往會需要找到一個數組里最大或最小的數&#xff0c; 但是我們不能直接用Math.max(Arr)或Math.min(Arr)&#xff0c;因為max&#xff08;&#xff09;里面不能填數組&#xff0c;只能填連續的數。 那我們該怎么辦呢&#xff1f; 一定…

開源免費 低代碼平臺開源_行動透明:免費代碼營現已開源

開源免費 低代碼平臺開源by freeCodeCamp通過freeCodeCamp 行動透明&#xff1a;免費代碼營現已開源 (Transparency in Action: Free Code Camp is Now Open Source) We’re thrilled to announce that Free Code Camp is now fully open-source. Now you can fork our code b…

vc mysql init 崩潰_故障分析 | 崩潰恢復巨慢原因分析

作者&#xff1a;xuty本文來源&#xff1a;原創投稿*愛可生開源社區出品&#xff0c;原創內容未經授權不得隨意使用&#xff0c;轉載請聯系小編并注明來源。一、現象有個 MySQL 5.7 開發庫異常掛掉后&#xff0c;奔潰恢復一直處于如下位置&#xff0c;且持續了 2 小時左右才起來…

surfaceview結束后怎么處理_污泥壓濾機處理后的污泥怎么處置

在污泥處理處置中&#xff0c;污泥壓濾機處理污泥只是對污泥進行脫水&#xff0c;并沒有實現污泥資源化處置。再進行污泥“減量化、無害化、資源化”處理時&#xff0c;許多企業用污泥壓濾機對污泥脫水處理后就不知道怎么繼續處置了&#xff0c;從而使污泥餅無處可去&#xff0…

js數組詳解

1&#xff0c;什么是數組數組是值得有序集合&#xff0c;每個值叫做一個元素&#xff0c;而每個元素在數組中有一個位置&#xff0c;以數字表示&#xff0c;稱為索引。js的數組是無類型的&#xff0c;數組元素可以是任意類型&#xff0c;同一個數組中的不同元素可能是對象或數組…

[轉載]linux內存映射mmap原理分析

轉自&#xff1a;http://blog.csdn.net/yusiguyuan/article/details/23388771 內存映射&#xff0c;簡而言之就是將用戶空間的一段內存區域映射到內核空間&#xff0c;映射成功后&#xff0c;用戶對這段內存區域的修改可以直接反映到內核空間&#xff0c;同樣&#xff0c;內核空…

判斷一個指針有沒有free_Free Code Camp的每個人現在都有一個檔案袋

判斷一個指針有沒有freeby freeCodeCamp通過freeCodeCamp Free Code Camp的每個人現在都有一個檔案袋 (Everyone at Free Code Camp now has a Portfolio) Note: we originally published this on our now-defunct blog in January of 2015.注意&#xff1a;我們最初是在2015年…

冒泡、快速排序小結

1.冒泡排序 (1) 比較領近的兩個數 (2) 如果左邊的比右邊的數字大&#xff0c;則交換位置 (3) 向右移動一位&#xff0c;繼續比較相鄰的兩個數 排序示例&#xff1a; 一輪排序結束后&#xff0c;最大值的位置已經移動最右端&#xff0c;再次如此循環&#xff0c;最終經過n-1次則…

python中until函數_等待應用程序窗口:python中的pywinauto.timings.WaitUntilPasses

我試圖在pywinauto中使用waituntilpasses來給應用程序時間打開一個新窗口.我已使用SWAPY識別窗口詳細信息.為了進行測試,我手動打開了子窗口,因此WaitUntilPasses應該立即看到該窗口,但是沒有看到.語法顯示為OK,因為我可以找到并打印find_windows的輸出,如下所示&#xff1a;xx…

synchronized 異常_由淺入深,Java 并發編程中的 Synchronized

synchronized 作用synchronized 關鍵字是 Java 并發編程中線程同步的常用手段之一。1.1 作用&#xff1a;確保線程互斥的訪問同步代&#xff0c;鎖自動釋放&#xff0c;多個線程操作同個代碼塊或函數必須排隊獲得鎖&#xff0c;保證共享變量的修改能夠及時可見&#xff0c;獲得…

mysql正則通配符全解_mysql正則表達式與通配符

擴展正則表達式的一些字符是&#xff1a; “.”匹配任何單個的字符。 一個字符類“[...]”匹配在方括號內的任何字符。例如&#xff0c;“[abc]”匹配“a”、“b”或“c”。為了命名字符的一個范圍&#xff0c;使用一個“-”。“[a-z]”匹配任何小寫字母&#xff0c;而“[0-9…

dos常用文件操作命令

1、DIR 含義&#xff1a; 顯示指定目錄下的文件和子目錄列表 類型&#xff1a; 內部命令 格式&#xff1a; DIR[drive:][path][filename][/p][/w][/A[[:]attributes]][/O[[:]sortorder]][/S][/B][/L] 舉例&#xff1a; DIR DIR D:\px2 DIR D:\px2\*.txt DIR /A:D /O:D 2、COPY…

使您的Java代碼聞起來很新鮮

by Marco Massenzio由Marco Massenzio 使您的Java代碼聞起來很新鮮 (Make your Java code smell nice and fresh) A few years ago I joined a startup working on a cloud enterprise service that was originally built by an offshore team.幾年前&#xff0c;我加入了一家…

MySQL時間戳與日期格式的相互轉換

MySQL時間戳與日期格式的相互轉換&#xff0c;PHP時間戳與日期格式的相互轉換 MySQL: 獲取當前時間SELECT NOW(); // 2018/10/11 14:22:51 時間日期格式轉換成時間戳格式&#xff0c;UNIX_TIMESTAMP()SELECT UNIX_TIMESTAMP(NOW()); // 1539238930 時間戳格式轉換成時間日期格式…

Linux內存分配機制之伙伴系統和SLAB

轉載請注明原文地址&#xff1a;http://www.cnblogs.com/ygj0930/p/6539590.html 內核內存管理的一項重要工作就是如何在頻繁申請釋放內存的情況下&#xff0c;避免碎片的產生。這就要求內核采取靈活而恰當的內存分配策略。通常&#xff0c;內存分配一般有兩種情況&#xff1a…

this.$modal.confirm 自定義按鈕關閉_自定義函數,讓你玩轉Excel得心應手

讓“自動更正”輸入統一的文本&#xff0c;你是不是經常為輸入某些固定的文本,如《電腦報》而煩惱呢?那就往下看吧。1.執行“工具→自動更正”命令,打開“自動更正”對話框。2.在“替換”下面的方框中輸入“pcw”(也可以是其他字符,“pcw”用小寫),在“替換為”下面的方框中輸…

php mysql 排名算法_MySQL PHP:優化排名查詢和計數子查詢

這是原始數據,并希望根據得分(count(tbl_1.id))對它們進行排名.[tbl_1]id | name1 | peter2 | jane1 | peter2 | jane3 | harry3 | harry3 | harry3 | harry4 | ron因此,制作臨時表(tbl_2)來計算每個id的分數.SELECT id, name, COUNT( id ) AS scoreFROM tbl_1GROUP BY idORDER…

CCF-CSP 最大的矩形

問題描述在橫軸上放了n個相鄰的矩形&#xff0c;每個矩形的寬度是1&#xff0c;而第i&#xff08;1 ≤ i ≤ n&#xff09;個矩形的高度是hi。這n個矩形構成了一個直方圖。例如&#xff0c;下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。請找出能放在給定直方圖里面積最大的矩…

Stack Overflow 2016年對50,000名開發人員進行的調查得出的見解

Today, Stack Overflow released the results of their 2016 survey of more than 50,000 developers.今天&#xff0c;Stack Overflow發布了他們2016年對50,000多名開發人員進行的調查的結果。 I’ve combed through this big document to bring you the most surprising ins…

web管理

1.站點根目錄下查找是否被放置webshell***根據語句判斷是不是PHP***腳本# find /storage/www/ -name "*.php" | xargs grep-in --color "eval("# grep -i --include*.php -r system\s*\( /storage/www/2.統計訪問日志中來自同ip出現的次數分析盜鏈、***、機…