Struts 2 第一个示例

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

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

我们必须为任何 Struts 2 项目创建以下四个组件

序号 组件 说明
1 Action 创建一个动作类,它将包含完整的业务逻辑并控制用户、模型和视图之间的交互。
2 Interceptors 如果需要,创建拦截器,或使用现有的拦截器。 这是控制器的一部分。
3 View 创建一个 JSP 来与用户交互从而获取输入并呈现最终消息。
4 Configuration Files 创建配置文件来耦合操作、视图和控制器。 这些文件是 struts.xml、web.xml、struts.properties。

我们将使用 IDEA,以便在动态 Web 项目下创建所有必需的组件。 我们从 Struts 2 环境安装 一节已经创建了一个项目,我们直接使用那个项目。

创建 Action 类

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

当用户单击 URL 时,Action 类响应用户操作。 执行 Action 类的一个或多个方法并返回 String 结果。 根据结果的值,呈现特定的 JSP 页面。

package com.jiyik.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”属性的标准 gettersetter 方法以及返回字符串“success”的执行方法。

Struts 2 框架将创建一个 HelloWorldAction 类的对象并调用执行的方法来响应用户的操作。 我们将业务逻辑放入此方法中,该方法最终返回 String 常量。 换句话说,对于每个 URL,我们必须实现一个操作类,可以直接使用该类名称作为我们的操作名称,也可以使用 struts.xml 文件映射到其他名称。

创建视图

我们需要一个 JSP 来呈现最终信息,当发生预定义的操作时,Struts 2 框架将调用此页面,并且此映射将在 struts.xml 文件中定义。 因此,让我们在项目的 web 文件夹中创建以下 jsp 文件 hello.jsp

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

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, ${name}
   </body>
</html>

taglib 指令告诉 Servlet 容器该页面将使用 Struts 2 标记,并且这些标记将以 s 开头。

s:property 标记显示动作类属性“name>”的值,该值由 HelloWorldAction 类的 getName() 方法返回。

创建主页

我们还需要在 web 文件夹中创建 index.jsp。 该文件将用作初始操作 URL,用户可以单击该 URL 以告知 Struts 2 框架调用 HelloWorldAction 类的已定义方法并呈现 hello.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">请输入你的姓名</label><br/>
  <input type = "text" name = "name"/>
  <input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>

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

配置文件

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

因此,让我们创建一个名为 struts.xml 的文件。 由于 Struts 2 要求 struts.xml 存在于 classes 文件夹中。 因此,在 Web/WEB-INF/classes 文件夹下创建 struts.xml 文件。 默认情况下,IDEA 不会创建“classes”文件夹,因此我们需要自己创建。 struts.xml 应该看起来像

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
        <constant name = "struts.devMode" value = "true" />
        
    <package name="helloworld" namespace="/" extends="struts-default">
        <action name="hello" class="com.jiyik.struts2.action.HelloWorldAction">
            <result name="success">/hello.jsp</result>
        </action>
    </package>

</struts>

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

当我们想将操作组合在一起时,创建一个包很有用。在我们的示例中,我们将操作命名为“hello”,它对应于 URL /hello.action,并由 HelloWorldAction.class 支持。 HelloWorldAction.class 的 execute 方法是调用 URL /hello.action 时运行的方法。如果执行方法的结果返回“成功”,那么我们将用户带到 hello.jsp。

下一步是创建一个 web.xml 文件,它是对 Struts 2 的任何请求的入口点。Struts2 应用程序的入口点将是部署描述符 (web.xml) 中定义的过滤器。因此,我们将在 web.xml 中定义 org.apache.struts2.dispatcher.DefaultActionSupport 类的条目。 web.xml文件需要在 Web 下的 WEB-INF 文件夹下创建。在创建项目时,IDEA 已经为我们创建了一个框架 web.xml 文件。所以,让我们修改如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.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.DefaultActionSupport
        </filter-class>
    </filter>

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

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

启用详细日志

通过在 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。 可以使用 SEVEREWARNINGINFOCONFIGFINEFINER 、FINEST 或 ALL 设置处理程序的日志级别阈值。

就是这样。 我们已准备好使用 Struts 2 框架运行我们的 Hello World 应用程序。

Struts2 运行示例

这里我们使用 IDEA 运行Struts 2。需要配置 Tomcat Server。可以参考 spring mvc 示例 中关于 tomcat 配置的方法。

查看笔记

扫码一下
查看教程更方便