Tutorials  /  Java

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

Ccentron Redaktion · Januar 2024 ·5 Min. Lesezeit ·Java, Tutorial

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.

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

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

VM

Passende Infrastruktur bei centron

Java-Anwendungen im Dauerbetrieb: ccloud³ VMs ab 3,12 € im Monat mit vollem Root-Zugriff, stundengenau abgerechnet. Cloud Server mieten →

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:

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

Code
<?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"
        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

Code
<%@ 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

Code
<%@ 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

Code
<%@ 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

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

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

Struts Hello World Annotation login Struts Hello World Annotation home Struts Hello World Annotation error

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.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie Java
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren