Frage

home.jsp

<jsp:useBean id="username" class="java.lang.String" scope="application"/>

<%
      username="Jitendra";
%>

<jsp:include page="include.jsp"/>

include.jsp

<%=username%>

Dies gibt einen Fehler, der mit der Aufschrift „Benutzername“ inclus.jsp und definiert ist, obwohl der Rahmen der Bean -Anwendung…

War es hilfreich?

Lösung

In Bezug auf Ihr Problem ist alles, was Sie lokal mit den altmodischen Drehbüchern erklären nicht verbunden mit a jsp:useBean. Außerdem ist es, eine lokale Skriptlet -Variable zu deklarieren, ist nicht Auf den mitgelieferten Seiten sichtbar, müssen Sie sie ausdrücklich in den Antragsbereich einfügen. Wie die Verwendung von Drehbuchläufen ist a Schlechte Praxis. Ich empfehle, es überhaupt zu vergessen.

Erstellen Sie in Ihrem speziellen Fall einfach eine real Java Bean, um die Daten zu halten. Das heißt, eine Klasse mit einem (impliziten) Standardkonstruktor und privaten Eigenschaften, die von öffentlichen Gettern/Setter entlarvt werden. Hier ist ein grundlegendes Beispiel:

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Dann können Sie eine Servlet -Klasse verwenden, um Anfragen vorzubereiten. Sie können Servlet's verwenden doGet() Methode dafür.

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    User user = new User();
    user.setName("Jitendra");
    request.setAttribute("user", user); // Store in request scope.
    request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}

Kartieren Sie diesen Servlet in web.xml auf an url-pattern von zum Beispiel /show. Dieses Servlet sollte dann von zugänglich sein von http://example.com/context/show und sein doGet() würde sofort ausgeführt werden.

Ändern/erstellen Sie dann die JSP -Datei show.jsp In was du platzierst /WEB-INF um den direkten Zugriff zu verhindern (damit Kunden nicht auf darauf zugreifen können http://example.com/context/show.jsp aber "gezwungen", den Servlet anzurufen) mit der folgenden Zeile:

<p>User name: ${user.name}</p>

Das ${user} Bezieht sich auf das Objekt, das jedem Anforderungs-/Sitzungs-/Anwendungsattributschlüssel zugeordnet ist user. Das tut hinter den Kulissen jspContext.findAttribute("user"). Als die zurückgekehrt User Instanz entspricht der javabäischen Spezifikation, die ${user.name} wird die aufrufen getName() Methode auf der User Instanz und die El werden sein Ergebnis zeigen.

Oh, ich sollte hinzufügen, du tust es nicht brauchen jsp:useBean Dazu hat das Servlet bereits die gewünschte Bohne in den Bereich erstellt und gestellt.

Ich empfehle jedoch, mit einem anständigen JSP/Servlet -Tutorial/Buch zu beginnen. Beispiele:

Hoffe das hilft.

Andere Tipps

Ihr Code ist "böse", weil a java.lang.String ist nicht wirklich eine Bohne. Bezeichnenderweise gibt es keine "Set" -Methode, um seinen Text zu ändern (das ist beabsichtigt, es soll unveränderlich sein).

Die Art und Weise, wie Sie auf Beans zugreifen, besteht darin, eine zu deklarieren und dann seine Eigenschaften (dh die Namen hinter den Methoden Get () und set () zu verwenden, um sie zu ändern. Sie können die tatsächliche Bean -Instanz nicht direkt ändern, nur seine Werte.

Auf Tomcat 6, home.jsp wird in den Servlet -Code übersetzt:

java.lang.String username = null;
synchronized (application) {
  username = (java.lang.String) _jspx_page_context.getAttribute("username", 
                                                  PageContext.APPLICATION_SCOPE);
  if (username == null){
    username = new java.lang.String();
    _jspx_page_context.setAttribute("username", username,
                                                  PageContext.APPLICATION_SCOPE);
  }
}

username="Jitendra"; 

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, 
                                                 "include.jsp", out, false);

Obwohl das Verhalten gleich ist, hängt der genau generierte genaue Code von der Implementierung des Anwendungsservers ab.

Der Umfang des Lokalen username Variable erstreckt sich nicht in das Servlet, aus dem erzeugt wird include.jsp. Sie setzen den Wert "Jitendra" nicht in den Anwendungsbereich ein und setzen nur den Wert der lokalen Variablen.

Wie andere betont haben, macht eine unveränderliche Schnur keine sehr gute Bohne.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top