欢迎来到初学者的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架构图
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 类的不同方式。
- 通过实现
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 注解来配置操作类和关联的结果页面。
无论我们如何配置我们的应用程序,最终结果都将是相同的。
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>
请注意表单字段的名称为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 接口的 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 测试
这就是关于 Struts 2 初学者教程的全部内容,请查看下一篇文章,我们将使用注解来创建Struts 2 Web 应用程序,而不使用 struts.xml 配置文件。
Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners