Struts 2 - Hello World 示例



正如您从 Struts 2 架构中已经了解到的,当您在 Struts 2 web 应用中点击超链接或提交 HTML 表单时,输入信息会被控制器收集,并发送到一个名为 Action 的 Java 类。Action 执行完成后,结果会选择一个资源来呈现响应。该资源通常是 JSP,但也可以是 PDF 文件、Excel 电子表格或 Java applet 窗口。

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

对于任何 Struts 2 项目,我们都需要创建以下四个组件:

序号 组件及描述
1

Action

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

2

拦截器

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

3

视图

创建 JSP 来与用户交互,获取输入并呈现最终消息。

4

配置文件

创建配置文件来关联 Action、视图和控制器。这些文件包括 struts.xml、web.xml、struts.properties。

我将使用 Eclipse IDE,以便所有必需的组件都将在一个动态 Web 项目下创建。现在让我们开始创建动态 Web 项目。

创建动态 Web 项目

启动 Eclipse,然后选择 **文件 > 新建 > 动态 Web 项目**,并输入项目名称为 **HelloWorldStruts2**,并根据以下屏幕设置其余选项:

Hello World Sturts1

在接下来的屏幕中选择所有默认选项,最后选中 **生成 Web.xml 部署描述符** 选项。这将在 Eclipse 中为您创建一个动态 Web 项目。现在选择 **窗口 > 显示视图 > 项目资源管理器**,您将看到您的项目窗口如下所示:

Hello World Sturts2

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

  • commons-fileupload-x.y.z.jar
  • commons-io-x.y.z.jar
  • commons-lang-x.y.jar
  • commons-logging-x.y.z.jar
  • commons-logging-api-x.y.jar
  • freemarker-x.y.z.jar
  • javassist-.xy.z.GA
  • ognl-x.y.z.jar
  • struts2-core-x.y.z.jar
  • xwork-core.x.y.z.jar

创建 Action 类

Action 类是 Struts 2 应用的关键,我们在大多情况下在 Action 类中实现业务逻辑。因此,让我们在 **Java 资源 > src** 下创建一个名为 HelloWorldAction.java 的 Java 文件,包名为 **com.tutorialspoint.struts2**,内容如下所示。

当用户点击 URL 时,Action 类会响应用户的操作。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 方法。您将业务逻辑放在此方法中,该方法最终返回字符串常量。换句话说,对于每个 URL,您都必须实现一个 Action 类,您可以直接使用该类名作为 Action 名,也可以使用 struts.xml 文件将其映射到其他名称,如下所示。

创建视图

我们需要一个 JSP 来呈现最终消息,当预定义的操作发生时,Struts 2 框架将调用此页面,并在 struts.xml 文件中定义此映射。因此,让我们在 Eclipse 项目的 WebContent 文件夹中创建以下 jsp 文件 **HelloWorld.jsp**。为此,右键单击项目资源管理器中的 WebContent 文件夹,然后选择 **新建 > JSP 文件**。

<%@ 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()** 方法返回。

创建主页

我们还需要在 WebContent 文件夹中创建 **index.jsp**。此文件将作为初始操作 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** 操作将使用 struts.xml 文件映射到 HelloWorldAction 类及其 execute 方法。当用户点击提交按钮时,它将导致 Struts 2 框架运行 HelloWorldAction 类中定义的 execute 方法,并根据该方法返回的值,选择并呈现适当的视图作为响应。

配置文件

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

因此,让我们创建一个名为 **struts.xml** 的文件。由于 Struts 2 要求 struts.xml 位于 classes 文件夹中。因此,在 WebContent/WEB-INF/classes 文件夹下创建 struts.xml 文件。Eclipse 默认情况下不会创建“classes”文件夹,因此您需要自己创建。为此,右键单击项目资源管理器中的 WEB-INF 文件夹,然后选择 **新建 > 文件夹**。您的 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>

关于上述配置文件,需要理解一些内容。在这里,我们将常量 **struts.devMode** 设置为 **true**,因为我们处于开发环境中,需要查看一些有用的日志消息。然后,我们定义一个名为 **helloworld** 的包。

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

下一步是创建一个 **web.xml** 文件,它是任何请求到 Struts 2 的入口点。Struts2 应用的入口点将在部署描述符 (web.xml) 中定义的过滤器。因此,我们将在 web.xml 中定义 org.apache.struts2.dispatcher.FilterDispatcher 类的条目。web.xml 文件需要在 WebContent 下的 WEB-INF 文件夹中创建。当您创建项目时,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)。

启用详细日志

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

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 应用。

执行应用的步骤

右键单击项目名称,然后单击 **导出 > WAR 文件** 以创建 WAR 文件。

然后将此 WAR 部署到 Tomcat 的 webapps 目录中。

最后,启动 Tomcat 服务器,并尝试访问 URL **https://:8080/HelloWorldStruts2/index.jsp**。这将显示以下屏幕:

Hello World Struts4

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

Hello World Struts5

请注意,您可以在 struts.xml 文件中将 **index** 定义为一个 Action,在这种情况下,您可以将 index 页面称为 **https://:8080/HelloWorldStruts2/index.action**。请查看以下如何在 struts.xml 中定义 index 为 Action:

<?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>
广告

© . All rights reserved.