在http请求中的一切都被视为一个string由协议。这包括数字,布尔值,整数,日期,小数和一切。每一件事情是一个字符串,将根据http。然而,struts类可以有任何数据类型的属性。struts的自动装配属性?
struts使用了多种类型转换器在幕后做繁重。例如,如果action类的属性有一个整数,struts的自动转换请求参数的整数属性没有做任何事情。默认情况下,struts的一些类型转换器。下面列出了他们中的一些,如果您正在使用其中任何一个,那么你有什么可担心的:
integer, float, double, decimal
date and datetime
arrays and collections
enumerations
boolean
bigdecimal
有些时候,当使用自己的数据类型,它是需要添加自己的转换,使struts知道如何将这些值,然后显示。考虑以下pojo类environment.java。
package com.h3.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.h3.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>
让我们编写 system.jsp,systemdetails.java类在struts.xml一起使用。 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.h3.struts2.systemdetails" method="execute"> <result name="success">/system.jsp</result> </action> </package> </struts>
右键点击项目名称,并单击 export > war file 创建一个war文件。然后部署此war在tomcat的webapps目录下。最后,启动tomcat服务器和尝试访问url http://localhost:8080/helloworldstruts2/system.action。这会给出以下画面:
上面的输出有什么错? struts 知道如何显示字符串“windows xp sp3”等内置数据类型转换,但它不知道用environmenttype属性做什么。所以,它只是被称为类的tostring()方法。为了解决这个问题,现在让我们创建并注册一个简单的typeconverter环境类。创建一个类名为environmentconverter.java以下。
package com.h3.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 类,如何将环境为一个 string,反之亦然通过重写两个的方法 convertfromstring()和 converttostring()并通知了struts。现在,让我们注册这个转换器之前,我们我们在我们的应用程序。有两种方法来注册一个转换器。如果转换器将只用于在一个特定的动作,那么将需要创建一个属性文件需要被命名为 '[action-class]'-converstion.properties,所以,在我们的例子中,我们创建一个名为systemdetails下面的注册 converstion.properties 输入:
environment=com.h3.struts2.environmentconverter
在上面的例子中,“environment”的名字是在systemdetails.java 类的一个属性,告诉要使用struts environmentconverter从这个属性的转换。但是,我们不打算这样做,相反,我们要在全局范围内注册这个转换器,因此,它可以在整个应用程序。要做到这一点,创建一个属性文件名为 xwork-conversion.properties 在 web-inf/classes文件夹下面一行:
com.h3.struts2.environment = com.h3.struts2.environmentconverter
这简单的注册全局转换器,这样的struts可以自动做转换每次遇到一个对象类型的环境。现在,如果重新编译并重新运行该程序,会得到更好的输出如下:
很显然,现在的结果是更好的,这意味着我们的struts的转换工作正常。这是可以创建多个转换器和按要求注册后才能使用。