"本文主要介绍如何在Struts2框架中实现自定义类型转换器,以及Struts2的基本配置和依赖库。"
在Struts2框架中,类型转换是一个关键功能,它允许框架将HTTP请求参数转化为Action类的属性。默认情况下,Struts2提供了基本类型的转换,但对于自定义类型如枚举,需要我们手动定义类型转换器。在描述的示例中,`HelloWorldAction` 使用了一个名为 `Gender` 的枚举类型。当请求参数尝试注入到 `gender` 属性时,由于Struts2不理解枚举类型,因此需要我们提供一个定制的类型转换器。
要创建自定义类型转换器,你需要继承 `org.apache.struts2.util.TypeConverter` 类并覆盖其 `convertValue()` 方法。在这个方法里,你可以处理从字符串到 `Gender` 枚举类型的转换。然后,需要在Action类或者全局配置文件(struts.xml)中注册这个转换器。例如:
```java
public class GenderConverter extends TypeConverter {
@Override
public Object convertValue(String name, Object value, Class toClass, ActionContext context) {
if (value != null && toClass.equals(Gender.class)) {
return Gender.valueOf(value.toString().toUpperCase());
}
return super.convertValue(name, value, toClass, context);
}
}
```
注册转换器可以在Action类中使用注解`@ConversionProperties`或在struts.xml配置文件中进行:
```xml
<!-- 在struts.xml中 -->
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="conversion" class="com.example.GenderConverter"/>
</interceptors>
<default-interceptor-ref name="conversion"/>
<!-- ... -->
</package>
<!-- 或者在Action类上 -->
@Results({@Result(name="success", location="/success.jsp")})
@ConversionProperties({@Conversion(key="gender", converter="com.example.GenderConverter")})
public class HelloWorldAction {
// ...
}
```
关于Struts2的依赖库,开发Struts2应用程序至少需要以下JAR文件:
1. struts2-core-2.x.x.jar:Struts2框架核心库
2. xwork-2.x.x.jar:XWork基础库,Struts2构建在其上
3. ognl-2.6.x.jar:对象图导航语言,Struts2表达式语言
4. freemarker-2.3.x.jar:FreeMarker模板引擎,用于Struts2的UI标签
5. commons-logging-1.1.x.jar:日志包,支持Log4J和JDK1.4+的日志记录
如果需要与第三方框架集成,比如Spring,还需要相应的-plugin JAR文件,如struts2-spring-plugin-2.x.x.jar。
Struts2的启动配置是在`web.xml`中通过Filter进行的。下面的配置示例展示了如何设置Struts2 Filter:
```xml
<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>
```
这个Filter Dispatcher是Struts2的入口点,它负责拦截所有请求,并根据配置文件执行相应操作。从Struts1.x到Struts2的转变,意味着从基于Servlet的架构转向了基于Filter的架构,这带来了更高效、更灵活的请求处理能力。