Struts 2 简明教程

Struts 2 - Hello World Example

您已从 Struts 2 架构中了解到,在 Struts 2 Web 应用程序中单击超链接或提交 HTML 表单时,输入由控制器收集,该控制器将输入发送到名为 Actions 的 Java 类。在执行 Action 后,结果选择资源以呈现响应。该资源通常是 JSP,但它也可以是 PDF 文件、Excel 电子表格或 Java 小程序窗口。

假设您已经构建了开发环境。现在,让我们继续构建我们的第一个 Hello World Struts2 项目。该项目的目标是构建一个收集用户姓名并在用户姓名后显示“Hello World”的 Web 应用程序。

对于任何 Struts 2 项目,我们必须创建以下四个组件 −

Sr.No

Components & Description

1

Action 创建一个动作类,它将包含完整的业务逻辑,并控制用户、模型和视图之间的交互。

2

Interceptors 根据需要创建拦截器或使用现有拦截器。这是控制器的一部分。

3

View 创建一个 JSP 以与用户进行交互,以获取输入并展示最终消息。

4

Configuration Files 创建配置文件以连接动作、视图和控制器。这些文件为 struts.xml、web.xml、struts.properties。

我打算使用 Eclipse IDE,这样所有必需的组件都将创建在动态 Web 项目下。让我们现在开始创建动态 Web 项目。

Create a Dynamic Web Project

启动 Eclipse,然后使用 File > New > Dynamic Web Project 执行,输入项目名称为 HelloWorldStruts2 ,并设置其选项的其余部分,如下一个界面中所示 −

helloworldstruts1

在下一个界面中选择所有默认选项,最后选中 Generate Web.xml deployment descriptor 选项。这将在 Eclipse 中为您创建一个动态 Web 项目。现在使用 Windows > Show View > Project Explorer ,您会看到您的项目窗口如下所示 −

helloworldstruts2

现在,将 struts 2 库文件夹 C:\struts-2.2.3\lib 中的以下文件复制到我们的项目的 WEB-INF\lib 文件夹。为此,您可以简单地将以下所有文件拖放到 WEB-INF\lib 文件夹中。

  1. commons-fileupload-x.y.z.jar

  2. commons-io-x.y.z.jar

  3. commons-lang-x.y.jar

  4. commons-logging-x.y.z.jar

  5. commons-logging-api-x.y.jar

  6. freemarker-x.y.z.jar

  7. javassist-.xy.z.GA

  8. ognl-x.y.z.jar

  9. struts2-core-x.y.z.jar

  10. xwork-core.x.y.z.jar

Create Action Class

Action 类是 Struts 2 应用程序的关键,我们大多数在 action 类中实现业务逻辑。因此,让我们在 Java Resources > src 下创建一个 Java 文件 HelloWorldAction.java,其中含有 com.tutorialspoint.struts2 包的名称,并在其中包含如下内容。

Action 类在用户单击 URL 时响应用户操作。将执行一个或多个 Action 类的,并将返回一个字符串结果。特定 JSP 页面将基于结果中含有的值进行呈现。

package com.tutorialspoint.struts2;

public class HelloWorldAction {
   private String name;

   public String execute() throws Exception {
      return "success";
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

这是一个非常简单的类,其中一个属性称为“name”。我们为“name”属性有标准的 getter 和 setter 方法,并有一个返回字符串“success”的 execute 方法。

Struts 2 框架将为此 HelloWorldAction 类创建一个对象,并在响应用户的操作时调用 execute 方法。您将业务逻辑放入该方法,该方法最终返回 String 常量。换句话说,对于每个 URL,您必须实现一个 action 类,并可以使用类名作为您的 action 名称,或者使用 struts.xml 文件进行映射,如下所示。

Create a View

我们还需要一个 JSP 来显示最终信息,当发生预定义的操作时,此页面将由 Struts 2 框架调用,且此映射将定义在 struts.xml 文件中。因此,让我们在 Eclipse 项目中的 WebContent 文件夹中创建以下 jsp 文件 HelloWorld.jsp 。为此,在 Project Explorer 文件夹中右键单击 WebContent 文件夹,并选择 New >JSP File

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>

   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

taglib 指令告诉 Servlet 容器本页面将使用 Struts 2 标记,且这些标记将 s

s:property 将显示 action 类属性“name”的值,后者由 HelloWorldAction 类中的 getName() 方法返回。

Create Main Page

我们还需要在 WebContent 中创建 index.jsp 。此文件将作为初始 action URL,用户可以单击此 URL 通知 Struts 2 框架调用 HelloWorldAction 类的确定方法并呈现 HelloWorld.jsp 视图。

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>

   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

上面视图文件中定义的 hello action 将使用 struts.xml 文件映射到 HelloWorldAction 类及其 execute 方法。当用户点击“提交”按钮时,这将导致 Struts 2 框架运行 HelloWorldAction 类中定义的 execute 方法,且基于该方法返回的一个值,将选择一个合适的视图并将其呈现为响应。

Configuration Files

我们需要一个映射来关联 URL、HelloWorldAction 类(模型)和 HelloWorld.jsp(视图)。该映射将告诉 Struts 2 框架哪些类将响应用户的操作(URL)、将执行该类的哪些方法,以及将基于该方法返回的字符串结果呈现哪些视图。

因此,让我们创建一个名为 struts.xml 的文件。因为 Struts 2 要求将 struts.xml 放在 classes 文件夹中。因此,在 WebContent/WEB-INF/classes 文件夹下创建 struts.xml 文件。Eclipse 默认不会创建“classes”文件夹,因此您需要自己创建。为此,在 Project Explorer 中右键单击 WEB-INF 文件夹,并选择 New > Folder 。您的 struts.xml 应如下所示:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />

   <package name = "helloworld" extends = "struts-default">
     <action name = "hello"
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

需要对上述配置文件作一点说明。在此,我们将 constants struts.devMode 设为 true ,因为我们正在开发环境中工作并且我们需要看到一些有用的日志消息。然后,我们定义了一个名为 helloworld 的包。

当您想要将 action 放在一起时,创建包非常有用。在我们的示例中,我们将其 action 命名为“hello”,它对应于 URL /hello.action ,并且由 HelloWorldAction.class 支持。当调用 URL /hello.action 时, HelloWorldAction.classexecute 方法就是要运行的方法。如果 execute 方法返回的结果为“success”,那么我们就会将用户带到 HelloWorld.jsp

下一步是创建 web.xml 文件,该文件是 Struts 2 任何请求的入口点。Struts2 应用程序的入口点将是部署描述符 (web.xml) 中定义的一个过滤器。因此,我们会在 web.xml 中定义 org.apache.struts2.dispatcher.FilterDispatcher 类的入口。需要在 WebContent 下的 WEB-INF 文件夹下创建 web.xml 文件。当您创建该项目时,Eclipse 已经为您创建了一个空的 web.xml 文件。因此,我们只需按如下所示对其进行修改:

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>

   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

我们已经将 index.jsp 指定为我们的欢迎文件。然后,我们已经将 Struts2 过滤器配置为在所有 url 上运行(即与 /* 模式匹配的任何 url)。

To Enable Detailed Log

您可以在 WEB-INF/classes 文件夹下创建 logging.properties 文件,从而在使用 Struts 2 时启用完整的日志功能。在您的属性文件中保留以下两行内容:

org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
   java.util.logging.ConsoleHandler

默认的 logging.properties 指定了一个 ConsoleHandler,用于将日志转到 stdout 以及一个 FileHandler。可以使用 SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST 或 ALL 设置处理器的日志级别阈值。

这就完成了。我们已经准备好使用 Struts 2 框架运行我们的 Hello World 应用程序。

Procedure for Executing the Application

右键点击项目名称,然后点击 Export > WAR File 创建一个 War 文件。

然后将这个 WAR 部署在 Tomcat 的 webapps 目录中。

最后,启动 Tomcat 服务器,然后尝试访问 URL http://localhost:8080/HelloWorldStruts2/index.jsp 。这将给你提供以下屏幕 −

helloworldstruts4

输入一个值“Struts2”并提交页面。你应该能看到下一页

helloworldstruts5

注意,你可以在 struts.xml 文件中定义一个 index 为一个动作,而在那种情况下,你就可以像 http://localhost:8080/HelloWorldStruts2/index.action 一样调用 index 页面。检查下面如何定义 index 为一个动作 −

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "index">
         <result >/index.jsp</result>
      </action>

      <action name = "hello"
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>