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 存储应用程序数据以处理客户端请求的存储区域。数据存储在使用ThreadLocalActionContext
的对象中,以便获得特定于特定请求线程的值。对象图导航语言(OGNL) 是一种强大的表达语言,用于操作存储在 ValueStack 上的数据。如您在架构图中看到的,拦截器和结果页面都可以使用 OGNL 访问存储在 ValueStack 上的数据。
Struts 2 动作
Struts 2 Action 组件处理客户端请求。Struts 2 提供了创建 Action 类的不同方法。
- 通过实现
com.opensymphony.xwork2.Action
接口。 - 通过扩展
com.opensymphony.xwork2.ActionSupport
类。通常用于创建空操作类以将请求转发到另一个资源。 - 使用@Action或@Actions注释来注释一个类。
- 按照类的命名约定,名称应该以Action结尾,并且应该具有 execute() 方法。
Struts 2 结果
结果组件通常是 JSP 或 HTML 页面,用于创建客户端响应视图。Struts 2 提供了自己的标签,我们可以在 JSP 页面中使用这些标签来创建响应。Struts 标签是JSP 自定义标签的绝佳示例。
Struts 2 声明式架构和连接
Struts 2 提供了两种方法来配置我们的应用程序的动作类和结果页面。
- Struts XML 文件:我们在 WEB-INF/classes 目录中有struts.xml文件,我们可以在其中配置我们的应用程序操作类和结果页面。
- 注释:我们可以使用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 中创建一个新的动态 Web 项目Struts2XMLHelloWorld,然后将其转换为 maven 项目,如下图所示。你会注意到 pom.xml 文件已添加到项目的根目录中。我们在 Eclipse 中的项目设置已准备就绪,让我们按顺序查看不同的组件。
pom.xml
打开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 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 版本,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>
请注意表单字段名称是name和pwd,我们将看到它们在 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 接口。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 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 配置文件,该文件应命名为struts.xml并位于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访问我们的应用程序。请注意,URL以.actionhttps://localhost:8080/Struts2XMLHelloWorld/User/home.action
结尾,这是Struts 2操作的默认后缀,就像Struts 1的.do一样。
Struts 教程 - Struts 2 Hello World 测试
当我们运行我们的应用程序时,我们得到以下响应页面。
下载 Struts2 Hello World 示例项目
这就是 Struts 2 初学者教程的全部内容,请查看下一篇文章,我们将使用注释来创建Struts 2 Web 应用程序,而无需使用 struts.xml 配置文件。