Struts 2 简明教程

Struts 2 - Type Conversion

根据协议,HTTP 请求中的所有内容都被视为 String 。这包括数字、布尔值、整数、日期、十进制数和所有其他内容。然而,在 Struts 类中,您可拥有任何数据类型的属性。

Struts 如何自动连接您的属性?

Struts 使用各种类型转换器来完成繁重的工作。

例如,如果您在 Action 类中拥有一个整数属性,那么 Struts 将自动把请求参数转换成整数属性,而您无需进行任何操作。默认情况下,Struts 配有一些类型转换器

如果您正在使用下面列出的任何转换器,那么您不必担心 -

  1. Integer, Float, Double, Decimal

  2. Date and Datetime

  3. Arrays and Collections

  4. Enumerations

  5. Boolean

  6. BigDecimal

当您使用自己的数据类型时,必要时可添加自己的转换器,以让 Struts 了解如何在显示前转换那些值。考虑以下 POJO 类 Environment.java

package com.tutorialspoint.struts2;

public class Environment {
   private String name;

   public  Environment(String name) {
      this.name = name;
   }

   public String getName() {
      return name;
   }

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

这是一个非常简单的类,它有一个名为 name 的属性,因此此类并没有什么特别之处。让我们创建一个包含系统信息的另一个类 SystemDetails.java

为了执行此练习,我已将环境硬编码为“开发”并将操作系统硬编码为“Windows XP SP3”。

在实时项目中,您将从系统配置中获取此信息。

让我们看看以下操作类 -

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

public class SystemDetails extends ActionSupport {
   private Environment environment = new Environment("Development");
   private String operatingSystem = "Windows XP SP3";

   public String execute() {
      return SUCCESS;
   }

   public Environment getEnvironment() {
      return environment;
   }

   public void setEnvironment(Environment environment) {
      this.environment = environment;
   }

   public String getOperatingSystem() {
      return operatingSystem;
   }

   public void setOperatingSystem(String operatingSystem) {
      this.operatingSystem = operatingSystem;
   }
}

接下来,我们创建一个简单的 JSP 文件 System.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>System Details</title>
   </head>

   <body>
      Environment: <s:property value = "environment"/><br/>
      Operating System:<s:property value = "operatingSystem"/>
   </body>
</html>

让我们通过 struts.xml 连接 system.jspSystemDetails.java 类。

SystemDetails 类有一个简单的 execute () 方法,它返回字符串“ SUCCESS ”。

<?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 = "system"
            class = "com.tutorialspoint.struts2.SystemDetails"
            method = "execute">
         <result name = "success">/System.jsp</result>
      </action>
   </package>
</struts>
  1. 右击项目名称并单击 Export &gt; WAR File 以创建一个 WAR 文件。

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

  3. 最后,启动 Tomcat 服务器并尝试访问 URL http://localhost:8080/HelloWorldStruts2/system.action 。这将生成以下屏幕 -

helloworldstruts17

上面输出有什么问题?Struts 知道如何显示和转换字符串“Windows XP SP3”和其他内置数据类型,但它不知道如何处理 Environment 类型属性。它只是简单地调用了类中 toString() 方法

为了解决这个问题,我们现在创建一个简单的 TypeConverter 然后为 Environment 类进行注册。

创建一个名为 EnvironmentConverter.java 的类,其中包含以下内容。

package com.tutorialspoint.struts2;

import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;

public class EnvironmentConverter extends StrutsTypeConverter {
   @Override
   public Object convertFromString(Map context, String[] values, Class clazz) {
      Environment env = new Environment(values[0]);
      return env;
   }

   @Override
   public String convertToString(Map context, Object value) {
      Environment env  = (Environment) value;
      return env == null ? null : env.getName();
   }
}

EnvironmentConverter 扩展了 StrutsTypeConverter 类,并通过覆写 convertFromString()convertToString() 这两个方法,告诉 Struts 如何将 Environment 转换为 String,反之亦然。

现在让我们在应用程序中使用此转换器之前先注册此转换器。注册转换器有两种方法。

如果仅在特定操作中使用此转换器,那么您需要创建一个属性文件,该文件的名称需指定为 '[action-class]'converstion.properties

在本例中,我们创建一个名为 SystemDetails-converstion.properties 的文件,其中包含以下注册项:

environment = com.tutorialspoint.struts2.EnvironmentConverter

在以上示例中,“environment”是 SystemDetails.java 类中属性的名称,并且我们告诉 Struts 使用 EnvironmentConverter 来转换此属性。

但是,我们不会执行此操作。相反,我们将全局注册此转换器,以便可以在整个应用程序中使用它。为此,在 WEBINF/classes 文件夹中创建一个名为 xwork-conversion.properties 的属性文件,并包含以下行

com.tutorialspoint.struts2.Environment = \
   com.tutorialspoint.struts2.EnvironmentConverter

这只是全局注册转换器,以便 Struts 在遇到类型为 Environment 的对象时可以自动执行转换。现在,如果重新编译并重新运行该程序,则你会得到更好的输出,如下所示:

helloworldstruts18

显然,现在的结果会更好,这意味着我们的 Struts 转换器运行良好。

这就是你可以创建多个转换器并注册它们以根据你的需求使用的方式。