Struts 2 Action对象支持和ModelDriven示例

时间:2020-02-23 14:36:03  来源:igfitidea点击:

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方法。