Struts 使用大量的类型转换器.例如在Action中存在一个 Integer属性,Struts自动将对应的请求参数转换成Integer属性,而不需要你做任何事情
下面列出部分类型
Integer, Float, Double, Decimal
Date and Datetime
Arrays and Collections
Enumerations
Boolean
BigDecimal
有时候我们需要使用自己的数据类型,这是必须添加自己的转换器来让Struts进行转换.Struts提供了多种接口来自定义类型转换 常用的有两种方式可以实现类型转换,第一种是继承自DefaultTypeConverter,一种是继承自StrutsTypeConverter
第二种方式是对第一种方式的封装,所以使用起来更加简明.下面贴出一个网上的例子:
有这样的一个自定义数据类型Environment
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;
}
}
对应的转换器: 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();
}
}
定义好转换器后,接下来将定义好的转换器注册到应用中.同样,有两种方式注册一个转换器. a.如果转换器只是用于一个特殊的 action,这样创建一个命名为'[action-class]'-converstion.properties属性文件,放置在和action同一目录下.并且在文件中添加
environment=com.tutorialspoint.struts2.EnvironmentConverter,其中environment必须和action中对应的自定义属性名、页面表单属性名一致。
b.同样,可以定义一个全局的转换器供整个应用使用.创建一个名为xwork-conversion.properties属性文件, in theWEB-INF/classes文件夹下,内容为:com.tutorialspoint.struts2.Environment = com.tutorialspoint.struts2.EnvironmentConverter
二、***
***与 struts过滤器、JDK代理同等概念的,通过切面机制 来实现 Action和框架的耦合。和转换器一样,Struts也提供了大量的内置***:
SN | Interceptor & Description |
---|---|
1 | alias Allows parameters to have different name aliases across requests. |
2 | checkbox Assists in managing check boxes by adding a parameter value of false for check boxes that are not checked. |
3 | conversionError Places error information from converting strings to parameter types into the action's field errors. |
4 | createSession Automatically creates an HTTP session if one does not already exist. |
5 | debugging Provides several different debugging screens to the developer. |
6 | execAndWait Sends the user to an intermediary waiting page while the action executes in the background. |
7 | exception Maps exceptions that are thrown from an action to a result, allowing automatic exception handling via redirection. |
8 | fileUpload Facilitates easy file uploading. |
9 | i18n Keeps track of the selected locale during a user's session. |
10 | logger Provides simple logging by outputting the name of the action being executed. |
11 | params Sets the request parameters on the action. |
12 | prepare This is typically used to do pre-processing work, such as setup database connections. |
13 | profile Allows simple profiling information to be logged for actions. |
14 | scope Stores and retrieves the action's state in the session or application scope. |
15 | ServletConfig Provides the action with access to various servlet-based information. |
16 | timer Provides simple profiling information in the form of how long the action takes to execute. |
17 | token Checks the action for a valid token to prevent duplicate formsubmission. |
18 | validation Provides validation support for actions |
使用上面的两个内置***timer 和 params,举例说明如何使用***,只要简单的在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">
<interceptor-ref name="params"/>
<interceptor-ref name="timer" />
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
当然也可以自己根据业务需求写自己的***,进行一些逻辑处理,为了简洁 实现一个***,通常我们实现AbstractInterceptor抽象类如:
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)throws Exception{
/* let us do some pre-processing */
String output = "Pre-Processing";
System.out.println(output);
/* let us call action or next interceptor */
String result = invocation.invoke();
/* let us do some post-processing */
output = "Post-Processing";
System.out.println(output);
return result;
}
}框架自身通过第一次调用ActionInvocation对象的invoke方法开始处理后,每次invoke方法被调用,ActionInvocation记录他的状态
并且执行接下来***。当所有配置的***被调用后来,aciton本身被执行。下面图标展示这个过程:
可以想象,为每个action,配置多个***,将很快变得不可控,为此,可以通过Interceptor-Stack进行管理。例子:
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>该配置放置在<package>节点下面,每一个<interceptor-ref>节点引用一个定义好的***或者interceptor-stack.
特别注意:
struts-default.xml中定义了一系列的***和***链同时也定义了一个默认的***defaultStack,一旦定义了默认的***,该***就会对包中的所有的Action起作用,当然如果你的Action中显式地定义了***,默认***就会失去作用,如果想不让他失去作用,也必须显式地定义系统默认的***。