1. 程式人生 > >(一)教你學會Struts2使用及封裝

(一)教你學會Struts2使用及封裝

大家好,今天給大家帶來的是Struts2的使用。文章共四篇,最後一篇完整整合SSH框架。每篇文章都用心在寫,然後呈現給大家。方便大家共同學習。如若有誤,敬請指出!今天學習的效果圖如下:通過登入介面登入成功後跳轉到主介面,登入失敗則跳到原介面重新輸入。後續文章將包括AOP增強,各類配置檔案的完善。


一:Struts的下載及匯入:

Struts的官網下載地址:點選進入官網
下載後解壓得到其中的8個jar包。如下圖,servlet-api.jar除外,此jar是tomcat的jar包。將此9個包匯入複製到webcontent/web-INF/lib目錄下。它會自動將包加入到src目下的web app Libraries。

二:SSH專案結構及分包

SSH專案分包結構如下如:

三:Struts原理介紹

Struts框架通過URL請求中的action字尾來判斷是哪種action,比如login.action或者loginout.action,loginin.action。檢查URL中是否存在帶有action字尾,然後對其進行擷取,比如login.action將會擷取login作為具體行為。擷取之後便會將該請求中的引數對進行實體物件封裝。比如獲取帳號密碼,會匿名封裝一個物件,同時提供execute方法,用來處理請求成功或者失敗。

四:Struts簡單例項

在action包下新建一個登入類LoginAction。預設實現
LoginAction類三種寫法:
  • 不繼承任何類也不實現任何介面
  • 繼承ActionSupport類(推薦此方法),提供了許多預設方法,比如國際化資訊方法,資料校驗,預設處理使用者請求,方便擴充套件
  • 實現Action介面,通過implements

1.編寫LoginAction

package com.struts.test.web.action;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.opensymphony.xwork2.ActionContext;
import com.struts.test.Config;
import com.struts.test.pojos.User;

public class LoginAction extends ActionSupport{
	private String username;//使用者名稱
	private String userpassword;//使用者密碼

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getUserpassword() {
		return userpassword;
	}

	public void setUserpassword(String userpassword) {
		this.userpassword = userpassword;
	}

	public String execute(){
		if("790710371".equals(username)&&"123".equals(userpassword)){
			//獲取當前的時間戳
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String date = format.format(new Date());
		ActionContext context  = ActionContext.getContext();
		context.getSession().put(Config.KEY_LOGIN_TIME,date);//儲存當前登入的時間戳
		context.getSession().put(Config.KEY_CURRENT_USER,new User(username,userpassword));//儲存當前使用者
			return "success";//登入成功跳轉到主介面
		}
		return "input";
	}
}

2.新增web.xml中的struts2的核心過濾器

web.xml在建立專案時候勾選自動生成。新增<filter>過濾器和過濾器對映<filter-mapping>標籤,具體請參照下面程式碼。
<?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_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>strutstest</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>

3.編寫struts2的配置檔案struts.xml

建立該檔案時,並不會主動生成dtd宣告,我們可以直接複製下面的宣告或者直接從其他專案工程中。在下面的程式碼中有一個<struts>標籤,內含<package>包標籤。一般extends直接寫預設的struts-default,namespace如果不寫的話,訪問URL的時候直接專案名/xxx.action?action=xxx。如果填寫namespace的話,訪問URL的時候為專案名/名稱空間?action=xxx。 <package>:包含package名稱,extends繼承,填寫預設;名稱空間,根據實際情況命名。建議不為空。
<action>:包含action名稱,class類名,即該action所對應的類名。比如action為login,即LoginAction。此處需要類全名(包+類名)。 按住ctrl把滑鼠移動到class上面,滑鼠箭頭變成手型,並且可以點進去即代表配置正確。 <result>:請求結果的處理,通常為jsp介面或者action。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC  
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
"http://struts.apache.org/dtds/struts-2.3.dtd">  
<struts>
	<package name="loginout" extends="struts-default" namespace="/admin">
		<action name="login" class="com.struts.test.web.action.LoginAction">
		<result name="success">/admin/main.jsp</result>
		<result name= "input">/admin/login.jsp</result>
		</action>	
	</package>
</struts>
result標籤的完整寫法如下:

跳轉到jsp:

通過dispatcher的方式轉發,預設的就是dispatcher,所以不寫type的時候預設是dispatcher轉發。

<result name="success" type="dispatcher">/admin/main.jsp</result>
或者重定向
<result name="success" type="redirect">/admin/main.jsp</result>

跳轉到action:

同包下的action跳轉:

chain方式(action鏈式)
<result type="chain" name="success">other_action_name</result>
或者重定向
<result type="redirect"name="success">other_action_name</result>

不同包的action跳轉:

<result type="rediretAction">
	<param name="actionName">loginout</param><!--要跳轉的action的名稱-->
	<param name="namespace">port</param><!--要跳轉的action的名稱空間-->
</result>

4.URL訪問

 上面說了訪問分為action訪問和jsp訪問,URL的兩種方式。本文的URL採用
http://localhost:8002/strutstest/admin/login.action?action=login&username=790710371&userpassword=123
訪問規則:域名(或者ip:埠)+專案名+名稱空間/xxx.action?action=xxx&引數鍵1=引數值&引數鍵2=引數值2&...

五:Struts封裝使用

 在實際專案中,我們通常需要對整體進行專案的封裝,以便減少繁縟重複地程式碼,降低不必要的代價。所以我們需要編寫Action基類類BaseAction。通常基類中都是把每個業務類中共有的方法抽象出來。本文采用反射呼叫執行任意action從而實現在一個Action檔案內實現多個action呼叫。比如LoginAction實現登出等與登入有關的功能,我們只需要新增loginout等方法就可以了。而不需要重新建立LoginOut類繼承ActionSupport。這樣就簡單多了。
package com.struts.test.web.action;

import java.lang.reflect.Method;

import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport{
	private String action;//從URL中得到的action,比如login.action?action=login

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}
	public String execute(){
		try {
			return invokeMethod(getAction());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return INPUT;
	}
	private String  invokeMethod(String  action) throws Exception{
		Class[] c=null;
		Method  method = this.getClass().getMethod(action, c);
		Object[] o = null;
		String s = (String)method.invoke(this, o);
		return s;
	}
}

改良後的LoginAction:

 專案中我們只需要繼承基類BaseAction即可,大大減少工作量。
package com.struts.test.web.action;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.opensymphony.xwork2.ActionContext;
import com.struts.test.Config;
import com.struts.test.pojos.User;

public class LoginAction extends BaseAction{
	private String username;//使用者名稱
	private String userpassword;//使用者密碼

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getUserpassword() {
		return userpassword;
	}

	public void setUserpassword(String userpassword) {
		this.userpassword = userpassword;
	}
	public String login(){
		if("790710371".equals(username)&&"123".equals(userpassword)){
		//獲取當前的時間戳
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String date = format.format(new Date());
		ActionContext context  = ActionContext.getContext();
		context.getSession().put(Config.KEY_LOGIN_TIME,date);//儲存當前登入的時間戳
		context.getSession().put(Config.KEY_CURRENT_USER,new User(username,userpassword));//儲存當前使用者
			return "success";
		}
		return "input";
	}
}
右鍵login.jsp選擇run as server執行,結果如下圖:
升級後的action比之前的更完美直觀,不再有execute出現啦!
本文到此就結束了,謝謝大家閱讀!有什麼問題歡迎給我留言!

相關推薦

學會Struts2使用封裝

大家好,今天給大家帶來的是Struts2的使用。文章共四篇,最後一篇完整整合SSH框架。每篇文章都用心在寫,然後呈現給大家。方便大家共同學習。如若有誤,敬請指出!今天學習的效果圖如下:通過登入介面登入

socket 網絡編程高速入門編寫基於UDP/TCP的服務client通信

unix fflush ins tracking ng- main ack ndt accept 由於UNIX和Win的socket大同小異,為了方便和大眾化,這裏先介紹Winsock編程。 socket 網絡編程的難點在入門的時候就是對基本函數的了解和使用,由於

使用TexturePacker工具對素材打包

max cin 位置 sans BE ack neighbour www. xtu TexturePacker是一款把若幹資源圖片拼接為一張大圖的工具。設計師制作遊戲的時候,為了提高圖片載入渲染速度,往往把很多小圖拼接成一張大圖,一次載入,減少I/O,提高渲染速度。這個好懂

對象——創建對象操作

dao 運算 config des abc prot .config 如果 tps 創建對象 1.字面量 var obj = {x:1,y:2}; var obj2 = { x:1, y:2, o:{ z:3, n:4

數組——數組創建操作

shift hle 等價 func nsh like 索引 arr delet 創建數組 1. 字面量 var BAT = [‘Alibaba‘,‘Tencent‘,‘Baidu‘]; var students = [{name:‘ydt‘,age:23},{name:‘y

springcloud架構搭建 Eureka服務器搭建配置

yml 任務 到你 檢查 -- pro asi profile 啟動 springcloud架構搭建(一) Eureka服務器搭建及配置今天開始準備學習一下springcloud的相關知識以及環境部署,並且搭建一套springcloud分布式框架: 本文只針對剛開始接觸或者

RxJava 沈思錄認為 RxJava 真的好用嗎?

list 理念 public 圖片文件 ide 方便 復制 等於 ret 本人兩年前第一次接觸 RxJava,和大多數初學者一樣,看的第一篇 RxJava 入門文章是扔物線寫的《給 Android 開發者的 RxJava 詳解》,這篇文章流傳之廣,相信幾乎所有學習 RxJa

NFS筆記NFS伺服器工作原理詳細配置

一、NFS工作原理 1、什麼是NFS伺服器   NFS就是Network File System的縮寫,它最大的功能就是可以通過網路,讓不同的機器、不同的作業系統可以共享彼此的檔案。   NFS伺服器可以讓PC將網路中的NFS伺服器共享的目錄掛載到本地端的檔案系統中,而在本地端的系統中來

從Zygote說到ViewZygote的啟動流程執行機制

前言 計劃寫一個系列文章,從 Zygote 開始,說到 Activity,再到 View 的顯示及事件分發等,意在把 Android 開發中最核心的一些的知識點串成線,看看 Android 是怎麼把它們組織到一起的,希望能寫好。 本文是第一篇,以“Zygote 的啟動流程及執行機制”為題, 將打通“虛擬機

python標準庫常用模組-----------------------------time模組詳解相關演示程式碼

要想了解time模組,我們需要首先了解一下時間的三種表現形式: 1.時間戳:當前距離1970年的秒數 2.格式化的字串:即2018年9月11日的這種表現形式 3.struct_time:元組時間,以元組的形式顯示時間,一共有九個元素 下面來介紹一下它具體的方法及示例程

web安全系列:XSS 攻擊基礎原理

跨站指令碼攻擊(XSS)是客戶端指令碼安全的頭號大敵。本文章深入探討 XSS 攻擊原理,下一章(XSS 攻擊進階)將深入討論 XSS 進階攻擊方式。 本系列將持續更新。 XSS 簡介 XSS(Cross Site Script),全稱跨站指令碼攻擊,為了與 CSS(Cascading Style Sheet)

jmeter教程:url、uri協議初識

jmeter是用純java語言實現的一個,用於介面、及效能測試的工具。關於jmeter的誕生,純屬歪打正著,就像當初unix系統的誕生,也是屬於歪打正著。有關的故事,可以自己去網上查。jmeter教程,原先在公司也寫過一些,不過,原先也只是用於公司內部分享用的,教程裡面的例子,也是用的公司的專案。現

Oracle 技巧總結:行轉列 列裝行

1.行轉列 oracle中行轉列 語法結構select listagg(column1, ',') within group(order by column2) from X;  如下圖所示: listagg(attr1, attr2):第一個引數是要行轉列的那個欄位

複習之JavaScript基本語法——三種引入方式load、write事件

JavaScript是什麼 JavaScript一種直譯式指令碼語言,是一種動態型別、弱型別、基於原型的語言,內建支援型別。它的直譯器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的指令碼語言。 JavaScript的作用 JavaScript

Java多執行緒:執行緒基礎建立

(一)、執行緒的生命週期 新建狀態: 使用 new 關鍵字和 Thread 類或其子類建立一個執行緒物件後,該執行緒物件就處於新建狀態。它保持這個狀態直到程式 start() 這個執行緒。 就緒狀態: 當執行緒物件呼叫了start()方法之後,該執行緒就進入就緒

SpringBoot+Mybatis:BaseDao的簡單抽取使用

一、BaseDao的抽取 使用SSM建立一個空的開發環境,並配置好 .XML檔案,這裡就不詳細給出了;特別注意的是SpringBoot現在還不支援阿里的Druid連線池,所以使用Driud需要手動新增配置。進入正題: 1、新建 BaseDao的介面   這裡就簡單的寫了幾個增、

步步學會browserify

本文來自網易雲社群作者:孫聖翔注意文章需要邊看邊練習,不然你可能忘得速度比看的還快。Browserifybrowserify的官網是http://browserify.org/,他的用途是將前端用到的眾多資源(css,img,js,...) 打包成一個js檔案的技術。比如在h

作業系統課程設計:linux核心編譯新增系統呼叫

1.實驗目的 通過實驗,熟悉Linux作業系統的使用,掌握構建與啟動Linux核心的方法;掌握使用者程式如何利用系統呼叫與作業系統核心實現通訊的方法,加深對系統呼叫機制的理解;進一步掌握如何向作業系統核心增加新的系統呼叫的方法,以擴充套件作業系統的功能。 2.實

Python的程式碼更加pythonic

關鍵詞:python; pythonic pythonic就是讓你的程式碼更加具有python特色,通常是利用python獨有的一些語法實現的。pythonic的程式碼往往更加簡潔、優美和高效,不信你接著往下瞧: 比如,交換兩個變數的值,通常的做法是 而pyt

代理模式深入學習——動態代理的實現解析

關於代理模式,就在不久的前的幾天,大概是8月17日左右,我帶領的小組還曾經被分配任務去給大家講解代理模式,總共給了兩天時間,但是, 依然,我們有很多問題沒有解決。比如動態代理的一些問題等