2008-10-28 4 views
11

< jsp : forward page = "..."/ >에 해당하는 순수 Java가 있나요? < % ... %> 블록 내에서 사용할 수 있습니까?jsp : JSP 태그를 사용하지 않고 Java에서 전달 하시겠습니까?

<% 
    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); 
    } 
%> 

<퍼센트 휴식을 갖는 ... %> 블록 JSP로 사용하기 : 앞으로 추악하고 읽기가 어렵게을

예를 들어, 나는 현재이 같은 JSP 페이지 뭔가를 들여 쓰기 때문에.

그래서 JSP 태그를 사용하지 않고 Java 코드에서 전달할 수 있습니까? 이 같은

뭔가 이상적 일 것이다 다음 someObject 당신이 찾고있는

<% 
    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

시간이 지남에 따라 스크립트 릿을 유지 보수 할 수 없게 만드는 코드가 있습니다. 그래서 푸시는 태그 라이브러리와 JSTL을 사용하기 시작했습니다. <% for // %> 일부 텍스트 <% do something %> 다른 텍스트 <% end for loop %>보다 많은 텍스트를 HTML에 가깝게 볼 수 있습니다. – MetroidFan2002

답변

28

pageContext입니다.

이 객체가 암시 적으로 JSP에 정의되어 있습니다, 그래서 당신은 다음과 같이 사용할 수 있습니다 :

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

전화하세요. 그것은 dispatcher를 명시 적으로 가져 오는 것보다 깔끔합니다. – erickson

+0

포워드 이후에«return;»을 넣어야한다고 생각합니다. 그렇지 않으면 페이지가 계속 실행되고 오류가 발생합니다 (불법 상태). 나는 그 태그가 당신을 위해 그것을 자동으로 해줄 것이라고 생각한다. – marcus

7

당신은 정말 시도하고 당신이 할 수있는 경우 scriplets를 방지하고, 귀하의 경우한다, 많은 당신이 을 무엇을하고 있는지 JSTL 코드로 대체 될 수 있습니다. 오류 메시지도 세션에 설정할 필요가 없습니다 있도록 error.jsp을 수정할 것, 이상적으로

<% 
    // 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> 

,하지만 난하지 않았다 : 귀하의 예를 들어 다음과 같은 대체 IMO 훨씬 청소기 디자인을 너무 많이 바꾸고 싶다.

+0

JSTL보다 스크립틀릿을 피해야하는 이유를 설명해 주시겠습니까? –

+3

일반 스크립틀릿에 비해 JSTL의 이점이 무엇인지 분명하지 않습니다. 필자는 자바를 알 필요가 없기 때문에 비 프로그래머가 동적 웹 페이지를 만들 수 있다고 말하는 토론을 보았습니다. 하지만 지금은 위의 예를 살펴보십시오 : 어떻게 이것이 "프로그래밍"이 아닌가? 물론, 그것은 자바가 아니지만 합리적 정의에 의해 프로그래밍 언어입니다. 따라서 Java를 배우고 사용하는 대신 Java를 배우고 사용할 수 있으며 다른 언어를 배우고 사용할 수 있습니다. 배워야 할 금액을 추가하는 것 외에 무엇이 얻습니까? – Jay

+0

나는 여기 스크립틀릿 사람들과 함께있다. 코드가 적어서 ''문법이 빠르며 빠르다. 왜냐하면'when'의 EL 표현식은 실행될 때마다 문자열로 구문 분석되기 때문이다. 반면에 자바 코드는 컴파일된다. – davidsheldon

3

간단한 방법 :

<%@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()); 
%> 

더 나은 접근 방식 :

는 서블릿에서 해봐요()를 호출합니다. 오류 페이지를 web.xml에 설정하십시오.

<error-page> 
     <exception-type>java.lang.Exception</exception-type> 
     <location>/WEB-INF/jsp/Error.jsp</location> 
</error-page> 
+0

개인적으로 - 이것은 완전히 개인적인 선호입니다. 아마도 JSP로 내 흐름 제어를하는 것이 더 쉽다고 생각합니다. JSP, 서블릿 및 web.xml 설정의 조합보다 그리고 그 이유는 그 문장에 의해 설명됩니다 : 만약 내가 JSP로 모든 일을한다면, 그것은 3 곳 대신에 1 곳에 있습니다. – Jay

관련 문제