初学者的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网络应用程序的框架。Struts 2基于OpenSymphony WebWork框架。在开发和配置方面,Struts 2非常灵活,我们将看到使用Struts 2框架开发网络应用程序是多么容易。

Struts 2 架构图

以下图显示了Web应用程序中Struts 2的不同组成部分。

Struts 2的拦截器

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

Struts 2 的 ValueStack 和 OGNL

ValueStack是Struts 2用于处理客户端请求时存储应用程序数据的存储区域。数据存储在ActionContext对象中,使用ThreadLocal来保存特定于特定请求线程的值。对象图导航语言(OGNL)是一种强大的表达式语言,用于操作存储在ValueStack上的数据。正如您在架构图中所看到的,拦截器和结果页面都可以使用OGNL访问存储在ValueStack上的数据。

Struts 2动作

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

    1. 通过实现com.opensymphony.xwork2.Action接口。

 

    1. 通过继承com.opensymphony.xwork2.ActionSupport类。通常用于创建空的action类,以将请求转发到另一个资源。

 

    1. 使用@Action或@Actions注解来注释一个类。

 

    遵循类的命名约定,名称应以Action结尾,并且应该有execute()方法。

Struts 2 结果

结果组件通常是JSP或HTML页面,用于为客户端响应创建视图。Struts 2提供了自己的标签,我们可以在JSP页面中使用这些标签来创建响应。Struts标签是JSP自定义标签的一个很好的例子。

Struts 2的声明式架构与连接

Struts 2 提供了两种配置应用程序中的动作类和结果页面的方法。

    1. Struts XML文件:我们在WEB-INF/classes目录中有一个struts.xml文件,可以在其中配置我们的应用程序动作类和结果页面。

 

    注解:我们可以使用Java注解为类提供元数据信息。可以使用Struts 2约定插件使用@Action和@Result注解对Java类进行注解,以创建配置动作类和相关的结果页面。

无论我们采用何种方式配置我们的应用程序,最终结果始终都是相同的。

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

让我们看看如何创建我们的第一个Struts 2 Hello World应用程序。首先,我们需要的是Struts 2的jar文件,最简单的方法是从Struts 2官方下载页面下载它。但是当你查看下载的存档中的库时,你会看到很多我们的简单应用程序不需要的jar文件。所以我将创建一个maven项目,并只添加struts-core依赖项,所有其他传递依赖的jar文件将自动下载并添加到应用程序中。我们最终的项目结构将如下图所示。在Eclipse中创建一个新的Dynamic Web项目Struts2XMLHelloWorld,然后将其转换为maven项目,如下图所示。你会注意到pom.xml文件被添加到项目的根目录中。我们在Eclipse中的项目设置已经准备好了,让我们按顺序看一下不同的组件。

pom.xml: Pom文件.

打开pom.xml文件并添加struts核心依赖,最终的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依赖部分中显示,如下图所示。

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。

教程-结果页面

我们有三个将被应用程序使用的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>

请注意表单字段的名称为name和pwd,我们将看到它们在Action类中的使用。欢迎.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接口。LoginAction.java

package com.Olivia.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 to hold the form parameters
	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;
	}
	
}

注意行动类也是一个Java Bean,具有与login.jsp相同的变量以及它们的getter和setter方法。Struts将负责将请求参数映射到行动类变量上。

Struts教程 – 配置文件

由于我们正在使用基于 XML 的配置来连接我们的应用程序,所以我们需要创建一个名为 struts.xml 的 Struts 配置文件,并放置在 WEB-INF/classes 目录下。

<?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.Olivia.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 你好世界测试

当我们运行我们的应用程序时,我们会得到以下的响应页面。

下载Struts2的Hello World示例项目

这就是Struts 2入门教程的全部内容。请查看下一篇文章,我们将使用注解来创建Struts 2 Web应用程序,而无需使用struts.xml配置文件。

广告
将在 10 秒后关闭
bannerAds