初学者的Struts教程

欢迎来到初学者的Struts教程。Struts是构建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 中,以便具有特定于特定请求线程的值。对象图导航语言(OGNL)是一种强大的表达式语言,用于操作存储在 ValueStack 上的数据。正如架构图中所示,拦截器和结果页面都可以使用 OGNL 访问存储在 ValueStack 上的数据。

Struts 2 Action

Struts 2 Action 组件处理客户端请求。Struts 2 提供了创建 Action 类的不同方式。

  1. 通过实现 com.opensymphony.xwork2.Action 接口。
  2. 通过扩展 com.opensymphony.xwork2.ActionSupport 类。通常用于创建空的操作类,将请求转发到另一个资源。
  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 注解来配置操作类和关联的结果页面。

无论我们如何配置我们的应用程序,最终结果都将是相同的。

Struts教程 – Hello World基于XML的应用程序

让我们看看如何创建我们的第一个Struts 2 Hello World应用程序。首先,我们需要的是Struts 2 jar文件,最简单的方法是从Struts 2官方下载页面下载。但是当你检查下载的存档中的libs时,你会看到很多我们简单应用程序不需要的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应用程序中,并提供URL模式,以便我们希望Struts处理客户端请求。我们的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>

对于低于2.1.3版本的Struts 2版本,过滤器类是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 类

我们的应用程序只有一个实现了 Struts 2 Action 接口的 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”,没有 Action 类,只有一个结果,因此请求将被转发到 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 动作的默认后缀,就像.do是 Struts 1 的一样。

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