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.jsp
homeModelDriven.jsp
请注意,在JSP页面中,我们不需要在HTML标记名称之前添加动作类bean变量名称。
但是,我们需要确保名称与java bean类的变量名相匹配。
执行此操作时,我们将获得以下响应页面,这些都用于实现ModelDriven操作类。
如果您同时研究这两种方法,则无需在JSP页面中进行更改即可轻松实现和维护ModelDriven方法。