Struts入門教程

歡迎來到Struts初學者教程。Struts是最早的框架之一,用於構建Java Web應用程序。Java Web應用程序

Struts教程

Struts是MVC設計模式的最初實現,並隨著Java和Java EE技術的最新增強而不斷演變。Struts教程旨在提供有關Struts 2的基本信息,以及我們如何創建第一個“Hello World” Struts 2應用程序。

Struts 2

Apache Struts 2是一個開源的、行業標準的、靈活可擴展的框架,用於構建Java EE Web應用程序。Struts 2基於OpenSymphony WebWork框架。Struts 2在開發和配置方面非常靈活,我們將看到使用Struts 2框架開發Web應用程序有多麼容易。

Struts 2 架构图

下图显示了在Web应用程序中使用的Struts 2 的不同组件。

Struts 2 拦截器

Struts 拦截器类似于Servlet 过滤器,在请求被处理之前和之后执行。它们用于执行不同操作的公共操作。例如日志记录、会话验证、向响应添加常见标头等。

Struts 2 ValueStack 和 OGNL

ValueStack 是 Struts 2 中用於存儲應用程序數據的存儲區域,以處理客戶端請求。數據存儲在使用 ActionContext 對象的 ThreadLocal 中,以便具有特定於特定請求線程的值。 Object-Graph Navigation Language(OGNL)是一種功能強大的表達式語言,用於操作存儲在 ValueStack 上的數據。正如您在架構圖中看到的那樣,拦截器和結果頁可以使用 OGNL 訪問存儲在 ValueStack 上的數據。

Struts 2 Action

處理客戶端請求的 Struts 2 Action 組件。Struts 2 提供了不同的方法來創建 Action 類。

  1. 通過實現 com.opensymphony.xwork2.Action 接口。
  2. 通過擴展 com.opensymphony.xwork2.ActionSupport 類。通常用於創建空的 Action 類,以將請求轉發到另一個資源。
  3. 使用 @Action@Actions 注釋標記一個類。
  4. 按照類的命名約定,名稱應以 Action 結尾並且應該具有 execute() 方法。

Struts 2 結果

結果組件通常是用於為客戶端響應創建視圖的 JSP 或 HTML 頁面。Struts 2 提供了自己的標籤,我們可以在 JSP 頁面中使用這些標籤來創建響應。Struts 標籤是 JSP 自定義標籤的很好的例子。

Struts 2 声明式架构和連接

Struts 2 提供了兩種配置應用程序的方法,用於操作類和結果頁面。

  1. Struts XML 文件:我們在 WEB-INF/classes 目錄中有一個 struts.xml 文件,我們可以在其中配置應用程序的操作類和結果頁面。
  2. 註解:我們可以使用 Java 註解提供有關類的元數據信息。Struts 2 慣例插件可以用於使用 @Action 和 @Result 註解對 Java 類進行標註,以創建配置操作類和相關結果頁面。

無論我們使用哪種方式來配置我們的應用程式,最終結果都將是相同的。

Struts 教程 – Hello World XML 基於應用程式

讓我們來看看如何創建我們的第一個Struts 2 Hello World應用程序。首先,我們需要Struts 2的jar文件,最簡單的方法是從Struts 2官方下載頁面下載。但是,當你檢查下載的存檔中的庫時,你會發現有很多我們簡單應用程序不需要的jar文件。所以我將創建一個maven項目,只添加struts-core依賴,所有其他傳遞依賴的jar文件將自動下載並添加到應用程序中。我們最終的項目結構將如下圖所示。 在Eclipse中創建一個名為Struts2XMLHelloWorld的新的動態Web項目,然後將其轉換為maven項目,如下圖所示。 您將注意到pom.xml文件被添加到項目的根目錄中。我們在Eclipse中的項目設置已經準備就緒,讓我們按順序查看不同的組件。

pom.xml

打開pom.xml文件並添加struts core依賴,最終的pom.xml文件將如下所示。

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>Struts2XMLHelloWorld</groupId>
	<artifactId>Struts2XMLHelloWorld</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<dependencies>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.3.15.1</version>
		</dependency>
	</dependencies>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.3</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
		</plugins>
		<finalName>${project.artifactId}</finalName>
	</build>
</project>

請注意,我已經覆蓋了finalName元素,以避免在進行Maven構建時將版本號添加到WAR文件中。其他部分是由Eclipse自動添加的,我們唯一需要的依賴是struts2-core,其當前版本為2.3.15.1(截至2013年9月10日)。只需對應用程序進行Maven構建,就會看到很多JAR文件添加到應用程序lib目錄中,並在Maven Dependencies部分顯示,如下圖所示。

Struts 2 web.xml配置

我們需要將org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter過濾器添加到Web應用程序中,並提供我們希望Struts處理客戶端請求的URL模式。我們的web.xml如下所示;

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xmlns="https://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
	<display-name>Struts2XMLHelloWorld</display-name>
	
	<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>

對於Struts 2版本低於2.1.3,filter-class為org.apache.struts2.dispatcher.FilterDispatcher

Struts教程 – 結果頁面

我們有三個JSP頁面將被應用程序使用,我們使用Struts 2標籤來創建我們的JSP頁面。login.jsp

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<%-- Using Struts2 Tags in JSP --%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Page</title>
</head>
<body>
<h3>Welcome User, please login below</h3>
<s:form action="login">
	<s:textfield name="name" label="User Name"></s:textfield>
	<s:textfield name="pwd" label="Password" type="password"></s:textfield>
	<s:submit value="Login"></s:submit>
</s:form>
</body>
</html>

請注意表單字段名稱是namepwd,我們將看到它們在Action類中的使用方式。welcome.jsp

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Welcome Page</title>
</head>
<body>
<h3>Welcome <s:property value="name"></s:property></h3>
</body>
</html>

請注意struts標籤s:property,我們可以使用它來獲取請求屬性,名稱與login.jsp中的相同。error.jsp

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Error Page</title>
</head>
<body>
<h4>User Name or Password is wrong</h4>
<s:include value="login.jsp"></s:include>
</body>
</html>

這是一個簡單的JSP頁面,我們在響應中添加錯誤消息並包含登錄頁面。

Struts教程-Action類

我們的應用程序只有一個Action類,我們在其中實現了Struts 2 Action接口。LoginAction.java

package com.journaldev.struts2.action;

import com.opensymphony.xwork2.Action;

public class LoginAction implements Action {
	
	@Override
	public String execute() throws Exception {
		if("pankaj".equals(getName()) && "admin".equals(getPwd()))
		return "SUCCESS";
		else return "ERROR";
	}
	
	// Java Bean 用於保存表單參數
	private String name;
	private String pwd;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}

請注意,action類也是一個Java Bean,具有與login.jsp相同的變量及其getter和setter方法。Struts將負責將請求參數映射到action類的變量。

Struts教程-配置文件

由於我們使用基於XML的配置來連線我們的應用程式,因此我們需要創建一個名為struts.xml的Struts配置文件,並放在WEB-INF/classes目錄下。struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"https://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

<package name="user" namespace="/User" extends="struts-default">
	<action name="home">
		<result>/login.jsp</result>
	</action>
	<action name="login" class="com.journaldev.struts2.action.LoginAction">
	<result name="SUCCESS">/welcome.jsp</result>
	<result name="ERROR">/error.jsp</result>
	</action>

</package>

</struts>

對於動作“home”,沒有動作類,只有一個結果,因此請求將被轉發到login.jsp頁面。對於動作“login”,LoginAction是動作類,如果execute()方法返回“SUCCESS”,則請求將由welcome.jsp處理,如果返回“ERROR”,則請求將被轉發到error.jsp頁面。namespace=“/User”非常重要,並且在URL中用於訪問動作類,它用於創建不同的模塊。因此,我們可以使用URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action來訪問我們的應用程式。請注意,URL以.action結尾,這是Struts 2動作的默認後綴,就像Struts 1中的.do一樣。

Struts教程 – Struts 2 Hello World測試

當我們運行我們的應用程序時,我們會得到以下的響應頁面。

下載 Struts2 Hello World 範例項目

這就是關於 Struts 2 初學者教程的全部內容,請查看下一篇文章,我們將使用註釋方式來創建 Struts 2 Web 應用程式,而無需使用 struts.xml 配置文件。

Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners