离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-11-28 11:00:43

实例

因为你学习了 Struts 2 架构,当你在 Struts 2 web 应用程序中点击一个超链接或者提交一个 HTML 表单时,控制器会收集输入并且发送到一个称作 Actions 的 Java 类。当 Action 执行后,结果选择一个资源来显现响应。资源通常是一个 JSP,但是它也可以是一个 PDF 文件,Excel 电子表格或者 Java applet 窗口。

假设你已经建立了开发环境。现在让我们继续建立我们的第一个 Hello World struts2 项目。这个项目的目的是建立一个 Web 应用程序,该项目收集用户的姓名,并且在用户名后面显示 “Hello World”。为了任何的 Struct 2 项目,我们将必须创建四个组件:

序号 组件 & 描述
1 动作

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

2 拦截器

如果需要,则创建拦截器,或者使用已存在的拦截器。这是控制器的部分。

3 视图

创建一个与用户交互的 JSPs,它接受输入并且显示最后的信息。

4 配置文件

创建连接动作,视图和控制器的配置文件。这些文件是 struts.xml,web.xml,struts.properties。

我将使用 Eclipse IDE,所以在一个动态 Web 项目中所有必需的组件都将会被创建。因此,让我们开始创建一个动态 Web 项目。

创建动态 Web 项目

启动你的 Eclipse,然后使用 File > New > Dynamic Web Project,并且输入项目名称为 HelloWorldStruts2,根据下面画面中给出的选项设置其他的选项:

在下面的画面中选择所有的默认选项,最后检查 Generate Web.xml deployment descriptor 选项。这将在 Eclipse 中创建一个动态 web 项目。现在使用 Windows > Show View > Project Explorer,你会看到一些东西在你的项目窗口中,如下所示:

现在从 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 Resources > src 下的包名 com.tutorialspoint.struts2 中创建一个java 文件 HelloWorldAction.java,下面给出它的内容。

当用户点击一个 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” 的执行方法。

Struts 2 框架将创建一个 HelloWorldAction 类的对象并且为了响应用户的动作调用执行方法。你把业务逻辑放在执行方法中,最后返回字符串常量。简单地说为了每个网址,你将必须实现一个动作类,你可以直接使用这个类名作为你的动作名,或者你也可以使用 struts.xml 文件映射到其他的名字,如下所示。

创建视图

我们需要一个 JSP 提交最后的信息,当一个预定义的动作发生时,这个页面会被 Struts 2 框架调用,这种映射将被定义在 struts.xml 文件中。所以让我们在 Eclipse 项目的 WebContent 文件夹中创建下面的 jsp 文件 HelloWorld.jsp。为了做到这个,在项目资源管理器的 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>

标签库指令告诉 Servlet 容器这个页面将使用 Struts 2 的标签,而且这些标签将在 s 之前。 s:property 标签显示动作类属性 "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>

使用 struts.xml 文件将把在上面的视图文件中定义的 hello 动作映射到 HelloWorldAction 类和它的执行方法中。当用户点击提交按钮时,将引起 Struts 2 框架运行在 HelloWorldAction 类中定义的执行方法,根据方法的返回值一个适当的视图将被作为响应进行选择和呈现。

配置文件

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

因此,让我们创建一个名为 struts.xml 的文件。由于 Struts 2 需要在类文件夹下展示 struts.xml。所以在 WebContent/WEB-INF/classes 文件夹下创建 struts.xml 文件。默认的情况下,Eclipse 不会创建 “classes” 文件夹,所以需要自己创建。为了做到这个,在项目资源管理器的 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>

关于上述配置文件有几点需要注意。在这里我们设置常量 struts.devModetrue,是因为我们正工作在程序开发环境中,我们需要看到一些有用的日志信息。然后,我们定义了一个名为 helloworld 的包。当你想要把你的动作分成一组时,创建一个包是有用的。在我们的例子中,我们命名我们的动作为 “hello”,它对应着 URL /hello.action 和通过 HelloWorldAction.class 进行备份。当 URL /hello.action 调用时,HelloWorldAction.class 的执行方法是运行的方法。如果执行方法的结果返回 “success”,然后我们把 HelloWorld.jsp 呈现给用户。

下一步是创建一个 web.xml 文件,它是一个任何对 Struts 2 请求的入口点。Struts2 应用程序的入口点将是一个在部署描述符(web.xml)中定义的过滤器。因此,我们将在 web.xml 中定义一个 oforg.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 为我们的 welcome 文件。然后我们已经配置了 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 应用程序。

执行应用程序

在项目名称上点击右键,并且单击 Export > WAR File 来创建一个 War 文件。然后在 Tomcat 的 webapps 目录下部署这个 WAR。最后,启动 Tomca t服务器和尝试访问 URL http://localhost:8080/HelloWorldStruts2/index.jsp. 将会给出下面的画面:

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

注意,你可以在 struts.xml 文件中定义索引作为一个动作。在这种情况下,你可以调用索引页面 http://localhost:8080/HelloWorldStruts2/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>
上一篇: 体系结构 下一篇: 配置