带有注释且没有struts.xml文件的Struts 2 Hello World示例
在本教程中,我们将看到如何使用注释或者命名约定完全避免使用struts配置文件。
Struts 2公约概念
Struts 2使用两种方法来找出动作类和结果类。
我们需要使用struts2-convention-plugin API来使用任何这些方法。
如果您有普通的网络应用程序,则可以下载其jar文件并将其放在网络应用程序的lib目录中。
对于Maven项目,您可以像下面这样简单地添加它的依赖项。
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.3.15.1</version> </dependency>
- 扫描:在这种方法中,我们指定需要扫描操作类的程序包。
需要在web.xml中为Struts 2过滤器完成配置,如下所示。
Struts 2可以通过以下方法找到动作类:任何带有@Action或者@Actions标注的类。
任何实现Action接口或者扩展ActionSupport类的类。
名称以Action结尾且包含execute()方法的任何类。
对于这些类,使用命名约定来确定操作和结果。命名约定:Struts 2将自动为以Action结尾的类名称创建action。
通过删除动作后缀并将首字母转换为小写来确定动作名称。
因此,如果类名称为HomeAction,则操作将为" home"。
如果未使用@Result注释这些类以提供结果,则将结果页放入WEB-INF/content目录,名称应为{action}-{ return_string} .jsp。
因此,如果HomeAction操作类返回"成功",则请求将转发到WEB-INF/content/home-success.jsp页面。
单独使用命名约定可能会造成很大的混乱,我们不能将同一JSP页面用于其他操作类。
因此,我们应该尝试避免这种情况,并使用基于注释的配置。
现在,我们准备使用注释创建Hello World struts 2应用程序,而我们将没有struts 2配置文件。
在Eclipse Struts2AnnotationHelloWorld中创建一个动态Web项目,并将其转换为Maven项目。
最终项目如下图所示。
Maven配置
我们在pom.xml中添加了struts2-core和struts2-convention-plugin依赖项,最终的pom.xml代码为:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>actionPackages</param-name> <param-value>com.theitroad.struts2.actions</param-value> </init-param> </filter>
部署描述符配置
<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>Struts2AnnotationHelloWorld</groupId> <artifactId>Struts2AnnotationHelloWorld</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>
请注意init-param元素,其中提供了Struts 2扫描的动作类包。
结果页
我们的应用程序中有三个结果页面。
login.jsp
<?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>Struts2AnnotationHelloWorld</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>actionPackages</param-name> <param-value>com.theitroad.struts2.actions</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
error.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <%-- Using Struts2 Tags in JSP --%> <%@ taglib uri="/struts-tags" prefix="s"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <title>Login Page</title> </head> <body> <h3>Welcome User, please login below</h3> <s:form action="login"> <s:textfield name="name" label="User Name"></s:textfield> <s:textfield name="pwd" label="Password" type="password"></s:textfield> <s:submit value="Login"></s:submit> </s:form> </body> </html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <title>Error Page</title> </head> <body> <h4>User Name or Password is wrong</h4> <s:include value="login.jsp"></s:include> </body> </html>
现在,让我们创建Action类,我们将对其进行注释以配置操作和结果页面。
带注释的动作类
<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <title>Welcome Page</title> </head> <body> <h3>Welcome <s:property value="name"></s:property></h3> </body> </html>
注意,HomeAction是一个空类,仅用于将请求转发到login.jsp页面。
package com.theitroad.struts2.actions; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.Namespaces; import org.apache.struts2.convention.annotation.Result; import com.opensymphony.xwork2.ActionSupport; /** * An empty class for default Action implementation for: * * <action name="home"> * <result>/login.jsp</result> * </action> * HomeAction class will be automatically mapped for home.action * Default page is login.jsp which will be served to client * @author hyman * */ @Namespaces(value={@Namespace("/User"),@Namespace("/")}) @Result(location="/login.jsp") @Actions(value={@Action(""),@Action("home")}) public class HomeAction extends ActionSupport { }
注意使用@ Action,@ Actions,@ Result,@ Namespace和@Namespaces批注,其用法不言自明。