2008-10-28 12 views
11

Czy istnieje odpowiednik Javy: < jsp: forward page = "..."/>, którego mogę użyć w bloku <% ...%>?jsp: do przodu w Javie bez użycia znacznika JSP?

Na przykład, obecnie mam strony JSP coś takiego:

<% 
    String errorMessage = SomeClass.getInstance().doSomething(); 
    if (errorMessage != null) { 
     session.setAttribute("error", errorMessage); 
%> 
<jsp:forward page="error.jsp" /> 
<% 
    } else { 
     String url = response.encodeRedirectURL("index.jsp"); 
     response.sendRedirect(url); 
    } 
%> 

Mając złamać <% ...%> blok korzystania z jsp: forward jest brzydki i sprawia, że ​​trudniej odczytać z powodu wgniecenia, między innymi.

Czy mogę więc przesłać dalej w kodzie Java bez użycia znacznika JSP?

Coś takiego byłoby idealne:

<% 
    String errorMessage = SomeClass.getInstance().doSomething(); 
    if (errorMessage != null) { 
     session.setAttribute("error", errorMessage); 
     someObject.forward("error.jsp"); 
    } else { 
     String url = response.encodeRedirectURL("index.jsp"); 
     response.sendRedirect(url); 
    } 
%> 
+0

To rozbiórka kodu sprawia, że ​​skrypty stają się nieosiągalne w miarę upływu czasu. Właśnie dlatego podjęto próbę używania bibliotek znaczników i JSTL w pierwszej kolejności. Łatwiej jest zobaczyć to wszystko jako zbliżone do HTML niż <% for // %> jakiś tekst <% zrobić coś%> inny tekst <% koniec dla pętli%> więcej tekstu. – MetroidFan2002

Odpowiedz

28

someObject szukasz jest pageContext.

Ten przedmiot jest niejawnie zdefiniowane w JSP, więc można go używać tak:

pageContext.forward("<some relative jsp>"); 
+1

Dobra rozmowa! To czystsze niż wyraźne otrzymanie dyspozytora. – erickson

+0

Myślę, że powinieneś "wrócić" po przejściu do przodu, w przeciwnym razie strona będzie nadal działać i wygeneruje błędy (nielegalny stan). Domyślam się, że tag robi to automatycznie. – marcus

7

Naprawdę powinien spróbować uniknąć scriplets jeśli to możliwe, a w przypadku, wiele z tego, co robisz można zastąpić kodem JSTL. Poniższy zamiennik przykład jest znacznie czystsze, IMO:

<% 
    // Consider moving to a servlet or controller/action class 
    String errorMessage = SomeClass.getInstance().doSomething(); 
    pageContext.setAttribute("errorMessage", errorMessage); 
%> 
<c:choose> 
    <c:when test="${not empty errorMessage}"> 
    <c:set var="error" scope="session" value="${errorMessage}" /> 
    <jsp:forward page="error.jsp" /> 
    </c:when> 
    <c:otherwise> 
    <c:redirect url="index.jsp" /> 
    </c:otherwise> 
</c:choose> 

Idealnie chcesz zmodyfikować error.jsp tak, że komunikat o błędzie nawet nie muszą być ustawione w sesji, ale nie zrobiłem chcesz za bardzo zmienić swój projekt.

+0

Czy możesz wyjaśnić w swojej odpowiedzi dlaczego skrypty powinny być omijane zamiast JSTL? –

+3

Nigdy nie było dla mnie jasne, jaka jest przewaga JSTL nad zwykłymi skryptletami. Widziałem dyskusje, które mówią, że to pozwala programistom tworzyć dynamiczne strony internetowe, ponieważ nie musisz znać języka Java. Ale tak naprawdę teraz, spójrz na powyższy przykład: Jak to NIE jest "programowanie"? Oczywiście, to nie jest Java, ale według wszelkich racjonalnych definicji jest to język programowania. Zamiast więc uczyć się i używać Javy, możesz uczyć się i używać języka Java ORAZ uczyć się i używać innego języka. Co zyskujesz, oprócz dodawania do kwoty, której musisz się nauczyć? – Jay

+0

Jestem tutaj z ludźmi z Scriptlet. Jest to mniej kodu, unika się niezdarnej składni '' i szybszej, ponieważ wyrażenie EL w "when" jest analizowane jako ciąg za każdym razem, gdy jest uruchamiany, podczas gdy kod Java jest kompilowany. – davidsheldon

3

Proste podejście:

<%@page errorPage="Error.jsp" %> 

<% 
String errorMessage = SomeClass.getInstance().doSomething(); 
if (errorMessage != null) { 
     throw new Exception(errorMessage); // Better throw the exception from doSomething() 
} 
pageContext.forward("index.jsp"); 
%> 


Error.jsp 
......... 
<%@ page isErrorPage='true' %> 
<% 
out.print("Error!!!"); 
out.print(exception.getMessage()); 
%> 

lepsze podejście:

Wywołuje doSomething() od serwletu. Ustaw swoją stronę błędu w web.xml

+0

Osobiście - i to jest całkowicie osobista preferencja, być może - myślę, że łatwiej jest wykonać moją kontrolę przepływu w JSP raczej niż przy połączeniu JSP, serwletów i ustawień web.xml. I powód jest zilustrowany przez to zdanie: jeśli zrobię to wszystko w JSP, to w jednym miejscu, zamiast w trzech. – Jay

Powiązane problemy