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”属性的标准 getter
和 setter
方法以及返回字符串“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。 可以使用 SEVERE
、WARNING
、INFO
、CONFIG
、FINE
、FINER
、FINEST 或 ALL 设置处理程序的日志级别阈值。
就是这样。 我们已准备好使用 Struts 2 框架运行我们的 Hello World 应用程序。
这里我们使用 IDEA 运行Struts 2。需要配置 Tomcat Server。可以参考 spring mvc 示例 中关于 tomcat 配置的方法。