Struts 2 Hello World Beispiel mit Anmerkungen und ohne struts.xml Datei

Dies ist der zweite Artikel in der Serie der Struts 2 Tutorials. Wenn Sie direkt hierher gekommen sind, empfehle ich, auch den früheren Beitrag anzusehen. Struts 2 Tutorial für Anfänger. Im letzten Tutorial haben wir uns die Struts 2 Architektur, ihre Komponenten angeschaut und eine einfache Struts 2 Webanwendung mit XML-basierter Konfiguration (struts.xml) erstellt. In diesem Tutorial werden wir in einem Beispiel mit Anmerkungen sehen, wie wir die Struts-Konfigurationsdatei komplett mit Annotationen oder Namenskonventionen vermeiden können.

Struts 2 Konvention Konzept

Struts 2 verwendet zwei Methoden, um die Aktionsklassen und Ergebnisklassen zu finden. Wir müssen die struts2-convention-plugin API verwenden, um eine dieser Methoden zu nutzen. Wenn Sie eine normale Webanwendung haben, können Sie deren Jar-Datei herunterladen und in das Lib-Verzeichnis der Webanwendung einfügen. Für Maven-Projekte können Sie einfach die Abhängigkeit wie unten hinzufügen.

 <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-convention-plugin</artifactId>
            <version>2.3.15.1</version>
        </dependency>

1. Scanning: Bei dieser Methode geben wir das Paket an, das nach Aktionsklassen gescannt werden soll. Die Konfiguration muss in der web.xml für den Struts 2 Filter erfolgen, wie unten.

<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.journaldev.struts2.actions</param-value>
            </init-param>
        </filter>

Struts 2 wird Aktionsklassen auf folgende Weisen finden:

  • Jede Klasse, die mit @Action oder @Actions Annotationen annotiert ist.
  • Jede Klasse, die das Action-Interface implementiert oder die ActionSupport-Klasse erweitert.
  • Jede Klasse, deren Name mit Action endet und die execute() Methode enthält. Für diese Klassen wird eine Namenskonvention verwendet, um Aktion und Ergebnisse zu bestimmen.

2. Namenskonvention: Struts 2 wird automatisch eine Aktion für Klassen erstellen, deren Namen mit Action endet. Der Aktionsname wird bestimmt, indem das Action-Suffix entfernt und der erste Buchstabe in Kleinbuchstaben umgewandelt wird. Wenn also der Klassenname HomeAction ist, dann wird die Aktion „home“ sein. Wenn diese Klassen nicht mit @Result annotiert sind, um das Ergebnis zu liefern, dann werden die Ergebnisseiten im WEB-INF/content-Verzeichnis gesucht und der Name sollte {aktion}-{rückgabe_string}.jsp sein. Wenn also die HomeAction-Aktionsklasse „success“ zurückgibt, wird die Anfrage an die Seite WEB-INF/content/home-success.jsp weitergeleitet. Die Verwendung der Namenskonvention allein kann sehr verwirrend sein und wir können nicht dieselbe JSP-Seite für andere Aktionsklassen verwenden. Deshalb sollten wir versuchen, dies zu vermeiden und eine auf Annotationen basierende Konfiguration zu verwenden.

Jetzt sind wir bereit, unsere Hello World Struts 2-Anwendung mit Annotationen zu erstellen und wir werden keine Struts 2-Konfigurationsdatei haben. Erstellen Sie ein dynamisches Webprojekt in Eclipse Struts2AnnotationHelloWorld und konvertieren Sie es in ein Maven-Projekt.

Maven-Konfiguration

Wir haben struts2-core und struts2-convention-plugin Abhängigkeiten in der pom.xml hinzugefügt, der endgültige pom.xml Code ist:

<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>

Deployment Descriptor Konfiguration

<?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.journaldev.struts2.actions</param-value>
            </init-param>
        </filter>

        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    </web-app>

Beachten Sie das init-param Element, in dem wir das Paket der Aktionsklassen angeben, das von Struts 2 gescannt werden wird.

Ergebnisseiten

Wir haben drei Ergebnisseiten in unserer Anwendung. login.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>

error.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>

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>Welcome Page</title>
</head>
<body>
<h3>Welcome <s:property value="name"></s:property></h3>
</body>
</html>

Jetzt erstellen wir unsere Aktionsklassen, die wir mit Annotationen konfigurieren, um Aktions- und Ergebnisseiten festzulegen.

Aktionsklassen mit Annotationen

package com.journaldev.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 pankaj
 *
 */

@Namespaces(value={@Namespace("/User"),@Namespace("/")})
@Result(location="/login.jsp")
@Actions(value={@Action(""),@Action("home")})
public class HomeAction extends ActionSupport {
}

Beachten Sie, dass HomeAction eine leere Klasse ist, deren einziger Zweck es ist, die Anfrage an die login.jsp-Seite weiterzuleiten.

package com.journaldev.struts2.actions;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Namespaces;
import org.apache.struts2.convention.annotation.Result;

/**
 * Notice the @Action annotation where action and result pages are declared
 * Also notice that we don't need to implement Action interface or extend ActionSupport
 * class, only we need is an execute() method with same signature
 * @author pankaj
 *
 */
@Action(value = "login", results = {
        @Result(name = "SUCCESS", location = "/welcome.jsp"),
        @Result(name = "ERROR", location = "/error.jsp") })
@Namespaces(value={@Namespace("/User"),@Namespace("/")})
public class LoginAction {

    public String execute() throws Exception {
        if("pankaj".equals(getName()) && "admin".equals(getPwd()))
            return "SUCCESS";
        else return "ERROR";
    }
    
    //Java Bean to hold the form parameters
    private String name;
    private String pwd;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

Beachten Sie die Verwendung von @Action, @Actions, @Result, @Namespace und @Namespaces Annotationen, deren Nutzung selbsterklärend ist. Wenn wir jetzt unsere Anwendung ausführen, erhalten wir folgende Antwortseiten.

Wenn Sie den letzten Beitrag gelesen haben, in dem wir dieselbe Anwendung mit struts.xml-Konfiguration entwickelt haben, werden Sie bemerken, dass es fast gleich ist. Der einzige Unterschied ist die Art und Weise, wie wir unsere Aktionsklassen und Ergebnisseiten in unserer Anwendung verdrahten.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: