Fügen Sie eine weitere JSP-Datei hinzu

161

Ich versuche gerade, JSP zu lernen. Meine Frage ist, zur Zeit habe ich die Kopf- und Fußzeile der Seite mit folgenden Angaben eingefügt:

<%@include file="includes/header.jsp" %>

und

<%@include file="includes/footer.jsp" %>

Aber jetzt habe ich auch den Seiteninhalt getrennt. Wenn der Benutzer auf eine Seite klickt, z. B. Produkte, muss er die JSP-Datei laden, die sich in Folgendem befindet: includes/pages/products.jsp Der Link zum Benutzer lautet also wie folgt : <a href="index.jsp?p=products">Products</a>.

Also muss ich den p-Wert erhalten und die darauf basierende Seite anzeigen.

Folgendes habe ich bisher getan.

<%
 if(request.getParameter("p")!=null)
 { 
   String p = request.getParameter("p");
%>    

<%@include file="includes/page_name.jsp" %>

<% 
 }
%>

Wie platziere ich den Wert der Variablen "p" an der Stelle von "Seitenname"?

Oder gibt es eine andere Methode, die ich verwenden könnte?

In PHP könnten wir das include()oder verwenden include_once(). Ich stecke ein bisschen in dieser JSP fest. :((

Akhilesh B Chandran
quelle
1
Warum nicht den Seitennamen dort fest codieren? Wie auch immer, Sie suchen nach P, dann wissen Sie, dass die Zielseite p.jsp ist. Gibt es also einen Grund, dies zu komplizieren?
kosa
Danke für Ihre Antwort. Es war ein Beispiel. Eigentlich habe ich die Seite in mehrere unterteilt. Wenn ich beispielsweise eine Produktseite im Administrationsbereich habe, um ein neues Produkt hinzuzufügen, ein Produkt zu bearbeiten, ein Produkt zu suchen, ein Produkt anzuzeigen usw., ist diese in Unterseiten unterteilt. Das Hardcodieren jeder Zeile würde also böse aussehen. Um meinen Namen nur zehnmal anzuzeigen, könnte ich entweder mit einer Schleife drucken oder die zehn Zeilen aufschreiben. Aber ich denke, die Wahl der Schleife ist besser. Ist es nicht? Ich denke, dies könnte die Lösung sein: stackoverflow.com/questions/482788/…
Akhilesh B Chandran

Antworten:

231

Was Sie tun, ist ein statisches Include. Ein statisches Include wird zur Kompilierungszeit aufgelöst und verwendet daher möglicherweise keinen Parameterwert, der nur zur Ausführungszeit bekannt ist.

Was Sie brauchen, ist ein dynamisches Include:

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

Beachten Sie, dass Sie die JSP-EL anstelle von Scriptlets verwenden sollten. Es scheint auch, dass Sie einen zentralen Controller mit index.jsp implementieren. Verwenden Sie dazu stattdessen ein Servlet und senden Sie es von diesem Servlet an die entsprechende JSP. Oder verwenden Sie besser ein vorhandenes MVC-Framework wie Stripes oder Spring MVC.

JB Nizet
quelle
1
Vielen Dank für Ihre Vorschläge. :) Ich habe versucht, jsp: include-Tag zu verwenden. Aber zur Laufzeit gibt es eine Datei nicht gefunden Fehler. Ausnahmedetails : java.io.FileNotFoundException: /includes/&lt;%= p %&gt;.jsp. Sieht so aus, als würde das <%= p %>so verwendet, wie es im Dateipfad ist!
Akhilesh B Chandran
7
Verwenden Sie keine Scriptlets. Verwenden Sie JSP EL: page = "/ includes / $ {param.p}". Oder versuchen Sie es mit page = "<% =" / includes / "+ p%>".
JB Nizet
3
Danke dir. Ich habe es so benutzt: <jsp:include page="<%= "includes/" + p + ".jsp" %>" />und es funktioniert jetzt :)
Akhilesh B Chandran
2
Sehr gute Antwort! Ich habe dieses Muster (zentraler Controller in index.jsp) zu oft gesehen und es führt immer zu Problemen.
Matthias Hryniszak
Sollte das nicht Übersetzungszeit sein? Und ich denke, Sie können damit immer noch Parameter verwenden?
Koray Tugay
26

Sie können solche Parameter verwenden

<jsp:include page='about.jsp'>
    <jsp:param name="articleId" value=""/>
</jsp:include>

und

in about.jsp können Sie den Parameter nehmen

<%String leftAds = request.getParameter("articleId");%>
Vitralyoz
quelle
18

Sie können Include-Anweisungen verwenden

<%
 if(request.getParameter("p")!=null)
 { 
   String p = request.getParameter("p");
%>    

<%@include file="<%="includes/" + p +".jsp"%>"%>

<% 
 }
%>

oder JSP-Aktion einschließen

<%
 if(request.getParameter("p")!=null)
 { 
   String p = request.getParameter("p");
%>    

<jsp:include page="<%="includes/"+p+".jsp"%>"/>

<% 
 }
%>

Die andere Include-Direktive enthält eine Datei während der Übersetzungsphase. Während JSP Include Action zum Zeitpunkt der Anforderung der Seite eine Datei enthält

Ich empfehle Spring MVC Framework als Controller, um Dinge zu manipulieren. Verwenden Sie das URL-Muster anstelle des Parameters.

Beispiel:

www.yourwebsite.com/products

anstatt

www.yourwebsite.com/?p=products

Sehen Sie sich dieses Video Spring MVC Framework an

Jaymelson Galang
quelle
1
Das Video ist geschützt. Bitte teilen Sie es der Öffentlichkeit
AutoMEta
Können Sie überprüfen, ob Ihr erstes Beispiel tatsächlich funktioniert? Ich kann es scheinbar nicht zum Laufen bringen.
Jus12
8

Zur Zeit der Seitenübersetzung wird der Inhalt der in der Include-Direktive angegebenen Datei an der Stelle, an der die JSP-Include-Direktive verwendet wird, so wie sie ist eingefügt. Anschließend wird die Quell-JSP-Seite in eine Java-Servlet-Klasse konvertiert. Die enthaltene Datei kann eine statische Ressource oder eine JSP-Seite sein. Im Allgemeinen wird die JSP-Include-Direktive verwendet, um Header-Banner und -Fußzeilen einzuschließen.

Syntax für das Einschließen einer JSP-Datei:

<%@ include file="relative url">

Beispiel

<%@include file="page_name.jsp" %>
Aravind Cheekkallur
quelle
6

1. <a href="index.jsp?p=products">Products</a>Wenn der Benutzer auf den Link Produkte klickt, können Sie products.jsp direkt aufrufen.

Ich meine, Sie können den Namen der JSP-Datei genauso wie den Parameter Value beibehalten.

<%
 if(request.getParameter("p")!=null)
 { 
   String contextPath="includes/";
   String p = request.getParameter("p");
   p=p+".jsp";
   p=contextPath+p;

%>    

<%@include file="<%=p%>" %>

<% 
 }
%>

oder

2.Sie können eine externe Ressourcendatei mit Schlüssel-Wert-Paaren verwalten. Wie unten

products : products.jsp

customer : customers.jsp

Sie können den Namen der JSP-Datei programmgesteuert aus der Eigenschaftendatei abrufen.

Auf diese Weise können Sie den Namen der JSP-Datei einfach ändern

Balaswamy Vaddeman
quelle
Danke dir. Ich benutze im Moment das Erste. Eigentlich habe ich ein Problem damit!
Akhilesh B Chandran
org.apache.jasper.JasperException: /admin.jsp(239,44) PWC6117: File "/<%=p%>" not found. Hat das bei dir funktioniert?
Akhilesh B Chandran
Dies ist eine pfadbezogene Problemprüfung, wenn die Datei in Ihrem Pfad vorhanden ist. Ich denke, Ihr fehlender Kontextpfad (sollte / admin.jsp enthalten sein). Ich habe mein Szenario nicht simuliert
Balaswamy Vaddeman
1
Ich habe versucht, den Wert von "p" wiederzugeben. Es ist : includes/add.jsp. Dann verwendet dies in Include-Derivat : <%@ include file="includes/add.jsp" %>. Es zeigt den Seiteninhalt. Aber wenn ich stattdessen diese Zeile verwende : <%@ include file="<%=p%>" %>, zeigt es Ausnahme!
Akhilesh B Chandran
Hallo, ich habe das gleiche Problem. Fehler bekommen File "<%=p%>" not found. Wenn ich echten Wert verwenden werde, funktioniert es.
Reddy SK
0

Aus einem Grund verstehe ich noch nicht, nachdem ich <%@include file="includes/footer.jsp" %>in meinen index.jspdann in den anderen JSP-Dateien verwendet habe, wie register.jspich sie verwenden musste <%@ include file="footer.jsp"%>. Wie Sie sehen, musste der vollständige Pfad nicht mehr verwendet werden. STS hatte meinen ursprünglichen Pfad gespeichert.

Lekakos Theodore
quelle