Struts 2 Action对象支持和ModelDriven示例
Java bean属性是Action类的一部分。
实际上,这并不是一个很好的设计,因为在大多数情况下,我们希望使用bean类来保存应用程序元素数据,并且希望在整个应用程序中使用它们。
Struts 2提供了两种不同的方法,通过它们我们可以将Java Bean属性与操作类分开,从而将相同的Java Bean与不同的操作类,业务逻辑或者在不同的JSP页面中重复使用。
这些方法是–对象支持的动作类和ModelDriven动作类。
我们将通过简单的struts 2 Web应用程序来理解这两种方法。
我们的最终项目将如下图所示。
我正在使用注释来创建操作类,这就是为什么没有struts.xml文件的原因。
另外,我已经将动态Web项目转换为maven,并在pom.xml中添加了struts 2依赖项,这就是为什么在lib目录中看不到任何struts jar的原因。
在继续介绍这两种方法的动作类之前,我们将研究Web应用程序的通用组件。
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts2FormDataExample</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
pom.xml
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Struts2FormDataExample</groupId>
<artifactId>Struts2FormDataExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.15.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.15.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>
具有某些属性和getter-setter方法的通用Java Bean。
package com.theitroad.struts2.beans;
public class User {
private String userID;
private String password;
private String userName;
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
现在,让我们转到对象支持和ModelDriven操作类的实现。
- 对象支持的动作类对于对象支持的动作类,我们需要更改动作类以及请求和响应HTML/JSP页面。
在动作类中,我们必须为java bean添加一个类级别的变量。
动作类是不言自明的,唯一需要注意的是User bean" user"的变量名。
我们必须在请求和响应页面中使用相同的名称。
让我们看一下请求和响应JSP页面。loginObject.jsp
请注意,文本字段名称为user.userID和user.password。
显然,第一部分与Action类中的User变量相同,第二部分与User类中的变量相同。
您是否注意到在Action类的execute()方法中,我们正在设置userName变量值,我们将在响应JSP中使用它页面。
现在,当我们执行上述操作时,我们将获得以下响应页面。
这些都是针对对象驱动的操作类的实现,让我们转到模型驱动的操作类的实现。
- ModelDriven动作类对于ModelDriven动作类,我们必须实现
com.opensymphony.xwork2.ModelDriven接口。
该接口使用Java泛型进行了类型参数化,我们需要将类型作为bean类提供。
ModelDriven接口仅包含一个我们需要实现并返回Bean对象的方法getModel()。
要注意的另一个重要点是,动作类应该为Bean提供一个类级别的变量,我们需要对其进行实例化。
我们的ModelDriven动作类如下所示。
我们的请求和结果页面看起来像下面的代码。loginModelDriven.jsphomeModelDriven.jsp
请注意,在JSP页面中,我们不需要在HTML标记名称之前添加动作类bean变量名称。
但是,我们需要确保名称与java bean类的变量名相匹配。
执行此操作时,我们将获得以下响应页面,这些都用于实现ModelDriven操作类。
如果您同时研究这两种方法,则无需在JSP页面中进行更改即可轻松实现和维护ModelDriven方法。

