初学者的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类。
-
- 通过实现com.opensymphony.xwork2.Action接口。
-
- 通过继承com.opensymphony.xwork2.ActionSupport类。通常用于创建空的action类,以将请求转发到另一个资源。
-
- 使用@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教程 – 基于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配置文件。