Heim >Java >javaLernprogramm >Lernen von Jakarta Struts 1.1 (3)
Im ersten Artikel „Einführung in Jakarta Struts“ habe ich das Struts-Framework grob analysiert, die Funktionen besprochen, die es ausführen kann, und auch die verschiedenen Komponenten durchsucht, aus denen Struts besteht. Im zweiten Artikel „Learning Jakarta Struts“ begann ich, die Prozessschritte zur Verwendung von Struts zum Erstellen einer einfachen Anwendung ausführlich zu beschreiben. In diesem Artikel erfahren Sie, wie Sie die Textinformationen in der applicationResource-Datei auf der JSP-Seite über Struts-Tags anzeigen.
Die Action-Klasse ist die Brücke, die die Struts-Architektur und den Geschäftslogikcode in der Anwendung verbindet. Daher sollten Sie die Action-Klasse so klein und einfach wie möglich gestalten, da die Logikverarbeitung in realen Anwendungen durch eine separate Logikschicht abgeschlossen werden sollte. Wenn Sie eine N-Tier-Anwendung entwickeln, möchten Sie auf jeden Fall, dass die Schnittstellen zwischen den Schichten so einfach wie möglich sind. Tatsächlich impliziert die Hauptmethode „perform()“ in der Action-Klasse (execute() in 1.1) in gewisser Weise, dass in dieser Methode etwas getan werden sollte. Wir wissen, dass jede Action-Klasse mit org.apache.struts.action.Action fortfahren muss. In kleinen Anwendungen reicht unsere Action-Klasse wahrscheinlich aus, um org.apache.struts.action.Action fortzusetzen. In einigen spezifischen komplexen Anwendungen habe ich einige gemeinsame Funktionen aus der Action-Klasse zusammengefasst. Erstellen Sie daher meiner Meinung nach eine Basisklasse, um den Code dieser gemeinsamen Funktionen zu implementieren, sodass alle in der Anwendung verwendeten Aktionsklassen nicht direkt org.apache.struts.action.Action fortsetzen, sondern dies fortsetzen, um einige gemeinsame Funktionen zu vervollständigen Die Basisklasse zur Wiederverwendung von Code ist ein ziemlich gutes Design. Ich habe diese Methode in StrutsSample angewendet und eine solche Basisklasse erstellt. Die Methoden dieser Basisklasse können in Aktionsklassen verwendet werden, die komplexe Logik vervollständigen und Anforderungen einfach weiterleiten.
package com.oreilly.actions;
import java.io.IOException;
import java.util.PRoperties;
import java.util.ResourceBundle;
import java.util.MissingResourceException;
java.util.Enumeration importieren;
java.util.Properties importieren;
java.rmi.RemoteException importieren;
javax.ejb.EJBHome importieren;
importieren javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
Diese Klasse wird verwendet Bei der Entwicklung von Struts müssen alle Action-Klassen die Basisklasse erben. Es berücksichtigt einige der Dinge, die in praktischen Anwendungen am wahrscheinlichsten verwendet werden. Was diesen Artikel betrifft, werden einige Methoden in der Klasse, die nicht eng mit Struts zusammenhängen, nur kommentiert und nicht vollständig implementiert. Wenn Sie an Entwicklungsarbeiten beteiligt sind, vervollständigen Sie bitte diese Methoden und wenden Sie diese Klasse an . Es wird Ihre Entwicklung in tatsächlichen Projekten beschleunigen. Beachten Sie, dass unsere Klasse dieselbe ist, da alle Action-Klassen von org.apache.struts.action.Action erben.
Öffentliche abstrakte Klasse AbstStrutsActionBase erweitert Aktion {
/ * Definieren Sie einige
, die in struts-config.xml aufgezeichnet sind * Leiten Sie Flags weiter, die in globalen Anwendungen verwendet werden können */
protected static final String SUCCESS = "success ";
protected static final String FAILURE = "failure";
protected static final String ERROR = "error";
protected static final String LOGIN = "login";
protected static final String CONFIRM = "confirm";
protected Context jndiContext = null;
/**
* Standardkonstruktionsmethode
*/
🎜> /**
Die folgende Methode zum Auffinden von EJB-Instanzen wird nicht vollständig implementiert.
Im Allgemeinen sollte die Action-Klasse eine EJB-Session-Bean (oder einfach eine reguläre JavaBean) aufrufen, die die Geschäftslogik der Anwendung implementiert. Bei großen Projekten müssen Entwickler klare Grenzen zwischen den Ebenen ziehen. In der Action-Klasse sollten wir eine Instanz der Umgebung abrufen, die JNDI-Informationen enthält, und dann ihre Home-Schnittstelle über den JNDI-Namen des EJB abfragen und abrufen. Der Prozess ist nicht einfach, daher ist der folgende Codeausschnitt nur ein kleines Beispiel, das die notwendige Implementierung zeigt.
Parametertyp String, der an die JNDI-Abfrage übergebene Name
Rückgabetyp Object, also die gefundene Home-Schnittstelle
Wenn die Suche fehlschlägt, wird eine NamingException-Ausnahme ausgelöst
Wenn Ressourceninformationen werden abgerufen. Fehler, MissingResourceException wird ausgelöst
*/
public Object lookup( String jndiName)
wirft NamingException, MissingResourceException {
// 为调用EJB对象,通过构建记录JNDI信息的Properties对象
// 来获得初始环境信息
if (jndiContext == null) {
ResourceBundle resources =
ResourceBundle.getBundle(" strutssample.properties");
Properties Properties = new Properties();
properties.setProperty(
Context.INITIAL_CONTEXT_FACTORY,
resource.getString(Context.INITIAL_CONTEXT_FACTORY));
properties.setProperty (
context.provider_url,
ressourcen.getString (context.provider_url)); > properties.setProperty(
Context.SECURITY_CREDENTIALS,
resource.getString(Context.SECURITY_CREDENTIALS));
jndiContext = new InitialContext(properties);
}
注重:在真正的产品中, 我们应该在此处考虑代码的健壮性, 将代码加入到try/catch块内, 并记录所有错误或重要信息到系统log中.而本例中,我们仅仅把异常往外抛,并假定一定会找到EJB对象的home接口并返回.
return (jndiContext.lookup(jndiName));
}
由于Action类将是由Struts来调用的。所以A ction都会做的通用机制,例如记录log信息.在本例中,我们一切从简,将其抽象之.
参数mapping:其类型为ActionMapping, 将在本Action做跳转选择用
. 参数actionForm:由Struts根据本次HTTP请求数据填充完成的ActionForm对象(可选,假如存在请求数据的话)
参数request:此Action所有处理的本次HTTP请求(对象)
res ponse:此Action输出数据所要用到的HTTP响应(对象)
假如有I/O-Fehler: IOException-Fehler: IOException: ServletException: ServletException: ServletException: 本方法处理完请求后按照处理逻辑返回相应的页面导向(对象)
public abstract ActionForward perform(
ActionMapping-Mapping,
ActionForm-Formular,
HttpServletRequest-Anfrage,
HttpServletResponse-Antwort)
wirft IOException, ServletException;
}
在其中记录log.
{
ActionForward forward = null;
// 只是简单的记录一些提示信息到servlet log
getServlet().log(
"AbstStrutsActionBase.perform() [Action Klasse: „
+ this.getClass().getName( )
+ " ]");
getServlet().log(
"AbstStrutsActionBase.perform() [Form Class : "
+ (form == null ? "null" : form.getClass().getName())
+ " ]");
}
然后,我们再编写的每个Action类都Ich habe die AbstStrutsActionBase-Software verwendet依照处理逻辑编写各自的perform方法.让我们用LoginAction为例,看看具体应该怎么应用吧.
package com.oreilly.actions;
import java.io.IOException;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.servlet.ServletException;
import. javax.servlet.http.HttpServletRequest;
im Port javax.servlet. http.HttpServletResponse;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import com.oreilly.forms.LoginForm;
/*
LoginAction 将演示一个Action将如何被Struts架构所调用执行并返回的
*/
public class LoginAction erweitert AbstStrutsActionBase {
Als nächstes folgt die Methode zur Überprüfung des Benutzers. In diesem Beispiel gibt es keine spezifische Implementierung. Eine typische Anwendungslösung besteht jedoch darin, zur Vervollständigung JavaBean oder EJB aufzurufen. Die Suchmethode, die zum Auffinden des EJB verwendet wird (in der Basisklasse abgeschlossen), sollte in dieser Methode aufgerufen werden, die eine Schnittstelle zur Authentifizierung des Benutzers gegenüber der Backend-Datenbank zurückgibt.
Parametertyp String, zu überprüfender Benutzername
Das Obige ist der Inhalt des Lernens von Jakarta Struts 1.1 (3). Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (). www.php.cn) !