Marcin Kapusta

Marcin Kapusta iOS
Developer/Software
Developer/Music
Producer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Witajcie.

Chciałbym spytać w jaki najprostszy i efektywny sposób przekazywać dane w jsp.
Np. mam plik

karta.jsp, w którym ładuje dane z bazy oraz includuje inne pliki jsp w następujący sposób:


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


Odnośnie tego zastanawiam się jak przekazać dane, które załadowałem z bazy danych tak, aby były dostępne i widoczne dla pliku .jsp, który jest includowany. Wiem, że mogę ponownie załadować dane w tym pliku, ale przecież to byłoby bardzo nieefektywne.
Piotr Skoczek

Piotr Skoczek SonarMind, Java
Developer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Nie pisałem dużo w JSP, ale wydaje mi się, że jednym z rozwiązań byłoby umieszczenie tych danych w obiekcie Session. session.setAttribute("MySession",sessionSet);
a następnie odwołanie się do nich, w includowanej stronie. Natomiast nie wiem, czy to jest efektywne rozwiązanie i czy nawiązujesz sesje w tym przypadku. Było też coś z przekazywaniem parametrów, ale niestety nie pamiętam :)
Marcin Kapusta

Marcin Kapusta iOS
Developer/Software
Developer/Music
Producer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Wiem, że są to pewnie jakieś podstawy. Do tej pory robiłem tylko w PHP strony, a teraz muszę mały projekcik wykonać w jsp. Dobrze w ogóle się do tego zabieram?

Ktoś mi mówił, żeby ładować dane tylko w Servlecie, obrobić je, a następnie robić forward do pliku jsp, który jest warstwą prezentacyjną/widokową.

Jeśli tak, to jak w servlecie zapisać dane, które załadowano z bazy danych w taki sposób, aby później plik jsp mógł z tego skorzystać przy renderowaniu strony.
Dariusz Marcinek

Dariusz Marcinek Architekt IT, Atos
Polska S.A.

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Marcin Kapusta:
Witajcie.

Chciałbym spytać w jaki najprostszy i efektywny sposób przekazywać dane w jsp.

jstl + expression language ?

widok karta.jsp:

<c:set var="loadedData" value="${someBean.complexData}" />

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

i w widoku inna_karta.jsp uzywasz:

Loaded data ${loadedData}

zeby dostac sie do tych danych..

Z tego co piszesz wynika ze uzywasz chyba scriptletu do ladowania danych.. brzydko tak troche...
Marcin Kapusta

Marcin Kapusta iOS
Developer/Software
Developer/Music
Producer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Próbuje Twojego rozwiązania, ale to w ogóle nie działa


<%
String text = "test";
%>
<c:set var="loadedData" value="${text}" />
${loadedData}


W html'u wyświetla po prostu mi taką linijke:

<c:set var="loadedData" value="" />

Poza tym eclipse podkreśla mi tą linijkę na żółto:

<c:set var="loadedData" value="${text}" />
Dariusz Marcinek

Dariusz Marcinek Architekt IT, Atos
Polska S.A.

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Marcin Kapusta:
Próbuje Twojego rozwiązania, ale to w ogóle nie działa

Bo to nie bylo gotowe rozwiazanie tylko taka podpowiedz czego szukac w googlu
Marcin Kapusta:
Jeśli tak, to jak w servlecie zapisać dane, które załadowano z bazy danych > w taki sposób, aby później plik jsp mógł z tego skorzystać przy
renderowaniu strony.

zapisac te dane jako atrybut w requescie:

request.setAttribute("nazwaAtrybutu", jakisObiekt);

a potem w tresci strony mozesz sie do tego dobrac za pomoca expression language: ${nazwaAtrybutu.jakiesProperty}
Marcin Kapusta

Marcin Kapusta iOS
Developer/Software
Developer/Music
Producer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Wielkie dzięki przyjacielu.

Coś takiego działa pomiędzy różnymi plikami jsp.


request.setAttribute("nazwaAtrybutu", jakisObiekt);


// wyswietlenie
<%=request.getAttribute("nazwaAtrybutu")%>

// Natomiast to poniżej w ogóle nie chce działać...
${nazwaAtrybutu.jakiesProperty}


Maciej Nowicki

Maciej Nowicki Java Developer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Jak już rzeźbisz bezpośrednio w jsp i uważasz, że będzie to rozwiązanie dla Ciebie wystarczające, to się nie ograniczaj - załaduj najpierw te dane, a stronę includuj poprzez

<%@ include file="" />

i w includowanym pliku po prostu odwołaj się do zmiennej

konto usunięte

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Marcin Kapusta:
Wielkie dzięki przyjacielu.

Coś takiego działa pomiędzy różnymi plikami jsp.


request.setAttribute("nazwaAtrybutu", jakisObiekt);


// wyswietlenie
<%=request.getAttribute("nazwaAtrybutu")%>

// Natomiast to poniżej w ogóle nie chce działać...
${nazwaAtrybutu.jakiesProperty}


Zadziała ;) trzeba tylko przeczytać co nieco. Głównie ustawia się tam wartości jakimś requestem, przy wywołaniu strony (mapowanie servletów + JavaBean). Jako przykład zobacz czy wyświetli Ci elementy języka EL plik o takiej składni:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.ArrayList"%>
<html>
<%
ArrayList<String> nameList = new ArrayList<String>(4);
nameList.add("David");
nameList.add("Raymond");
nameList.add("Beth");
nameList.add("Joyce");
request.setAttribute("nameList", nameList);
%>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Core Tag Demo</title>
</head>
<body>
<c:set var="name" scope="page" value="${param.name}"></c:set>
<c:out value="Hello"></c:out>
<c:choose>
<c:when test="${!empty name}">
<c:out value="${name}"></c:out>
</c:when>
<c:otherwise>
<c:out value="stranger"></c:out>
<br />
<c:out value="Need a name? Here are a few options:" />
<br />
<ul>
<c:forEach var="nameOption"
items="${requestScope.nameList}">
<li /><c:out value="${nameOption}"></c:out>
</c:forEach>
</ul>
</c:otherwise>
</c:choose>
<c:remove var="name" scope="page" />
</body>
</html>


Jeżeli chcesz pogłębić ten temat to chyba Head First JSP & Servlets musisz przeczytać.
I tak jak napisał @Maciej Nowicki, spróbuj zastosować dyrektywę <%@ include file %> taki plik najlepiej umieść w WEB-INF by nie było bezpośredniego odwołania do niego.

Nie stosuj raczej <jsp:include> różnica między <jsp:include> a <% @ include file %> jest zasadnicza:

Dyrektywa wstawia kod źródłowy jakaśstrona.jsp w czasie translacji na servlet.
natomiast akcja <jsp:include/> wstawia odpowiedź strony jakaśstrona.jsp w czasie wykonywania servletu.

Odbierz PW tam masz pewne info.
Marcin Kapusta

Marcin Kapusta iOS
Developer/Software
Developer/Music
Producer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Wielkie dzięki.

Problem w tym, że ja pracuje w trochę innym środowisku niż kontener serwletów bo chyb to się tak nazywa.

Środowisko to serwer JETTY dodany w jednym pluginie. Pracujemy w Eclipse RCP i wykorzystujemy Equinox Http Service i przeglądarke wbudowaną w Eclipsa, żeby na szybko uporać się z dość bardzo rozbudowanym formularzem. W tym środowisku nie mam w ogóle katalogu WEB-INF, a tym bardziej pliku web.xml jak to pewnie w tych książkach ładnie pisze.

Poniższa linia generuje taki błąd:


<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

// tutaj błąd

2011-05-12 11:48:12 org.apache.jasper.compiler.TldLocationsCache processWebDotXml
WARNING: Internal Error: File /WEB-INF/web.xml not found
2011-05-12 11:48:12 org.mortbay.jetty.servlet.ServletHandler handle
WARNING: EXCEPTION
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.jsp.jasper.JspServlet.service(JspServlet.java:112)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.http.registry.internal.ServletManager$ServletWrapper.service(ServletManager.java:180)
at org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:90)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:111)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:67)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:269)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:428)
at org.mortbay.jetty.servlet.ServletHandler.dispatch(ServletHandler.java:677)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
at org.mortbay.http.HttpServer.service(HttpServer.java:909)
at org.mortbay.http.HttpConnection.service(HttpConnection.java:820)
at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:986)
at org.mortbay.http.HttpConnection.handle(HttpConnection.java:837)
at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:245)
at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)



Także cieszę się, że w ogóle znalazłem jakiś sposób, żeby te parametry przekazywać. Tak czy inaczej będę kombinował bo w Warningach pisze, że nie znalazł katalogu WEB-INF ani web.xml. Musze tylko obczaić w jakim pluginie (bundlu) to dodać i gdzie, a to trochę potrwa :)

konto usunięte

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Raczej z mojego skąpego doświadczenia i kilku przeczytanych książek to musisz mieć WEB-INF i tak samo deskryptor wdrożenia (web.xml)
Jeżeli nie to pokombinuj w sensie dodaj plik do projektu i poszukaj w Eclipsie by dodało deskryptor wdrożenia.
Marcin Kapusta:
Problem w tym, że ja pracuje w trochę innym środowisku niż kontener
serwletów bo chyb to się tak nazywa.
Środowisko to serwer JETTY dodany w jednym pluginie.
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Czy aby na pewno :) ?
Jetty provides an HTTP server, HTTP client, and javax.servlet container. These components are open source and available for commercial use and distribution.


@Miłosław

Tak po polsku się to tak nazywa :)
po ang. wiadomo chyba jak skrót DD - deployment descriptor.
Uraczysz nas niemiecką nazwą tego ;)?Krzysztof Telka edytował(a) ten post dnia 12.05.11 o godzinie 12:15
Miłosław F.

Miłosław F. Architekt IT

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Krzysztof Telka:
deskryptor wdrożenia
To sie naprawde tak po polsku nazywa?!
Marcin Kapusta

Marcin Kapusta iOS
Developer/Software
Developer/Music
Producer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Krzysztof Telka:
Raczej z mojego skąpego doświadczenia i kilku przeczytanych książek to musisz mieć WEB-INF i tak samo deskryptor wdrożenia (web.xml)
Jeżeli nie to pokombinuj w sensie dodaj plik do projektu i poszukaj w Eclipsie by dodało deskryptor wdrożenia.

Udało mi się stworzyć katalog i ten plik web.xml, wyczytałem też, że powinienym utworzyć w katalogu WEB-INF katalog lib i tam umieścić biblioteki jar od projektu jstl - wtedy podobno ten equinoxowy servlet je załaduje i będą one dostępne. Pytanie które są to biblioteki, na stronie projektu jstl mam dwa pliki do pobrania - jstl-api-1.2.jar oraz jstl-impl-1.2.jar - załadowałem te pliki tam, ale nadal jest błąd w postaci:


org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.jsp.jasper.JspServlet.service(JspServlet.java:112)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.http.registry.internal.ServletManager$ServletWrapper.service(ServletManager.java:180)
at org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:90)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:111)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:67)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:269)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:428)
at org.mortbay.jetty.servlet.ServletHandler.dispatch(ServletHandler.java:677)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
at org.mortbay.http.HttpServer.service(HttpServer.java:909)
at org.mortbay.http.HttpConnection.service(HttpConnection.java:820)
at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:986)
at org.mortbay.http.HttpConnection.handle(HttpConnection.java:837)
at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:245)
at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)



Mój plik web.xml wygląda następująco


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<description>Karty Zleceń</description>
</web-app>
Jarek W.

Jarek W. Software Engineer

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Polecam jednak troszkę więcej poczytać o JSP i serwletach. Możesz też spojrzeć sobie na przykłady na stronie http://www.java2s.com/Code/Java/JSP/CatalogJSP.htm

konto usunięte

Temat: Jak przekazywać pomiędzy plikami jsp dane.

Biblioteki JSTL 1.1 są dostępne za free i gdzieś na pewno są w IDE.
Musisz je po prostu dodać do projektu i jeszcze raz skompilować ;)
Ja używam NetBeansa i tam po prostu na projekt PPM--> properties-->Packing i jest

Obrazek


Nie używam Eclipse nie wiem jak to tam jest pokombinowane, lecz schemat aplikacji wygląda mniej więcej tak.

LINK
Większość IDE powinno zrobić to za Ciebie(kompilacja serwletów do plików klass itp itd) i najlepiej kompresuj od razu (gdzieś musi być opcja w IDE) do pliku .WAR (web archive) bo potem bierzesz plik .WAR i od razu robisz szybkie wgranie na serwer.

Najlepiej nauczyć się na przykładach ;)
Ode mnie--- > http://www.javadocexamples.com/Krzysztof Telka edytował(a) ten post dnia 12.05.11 o godzinie 12:38



Wyślij zaproszenie do