2010-03-10 2 views
4

어제도 비슷한 줄을 따라 question에게 물었습니다. 그 질문에 나는 글로벌 필터 (이미 가지고있는 필터)를 제안했다.JSP에서 오류를 catch하고 throw하는 방법

그래서 나는 그것을 실패 할 그것이 실패했을 때 나는 그것이 우리의 중앙 오류 페이지로 가고 싶어하기 때문에 널 (null)입니다 내가 의도적으로 전달하고 위의 코드에서

....code...code 
..tags...html...code 
Object [] res = iBatisDAO.getReport_pging(null,null,0,null); //call to DB 
...more code... 
...tags...end 

다음과 같은 JSP 있습니다. 내 web.xml에 다음을 가지고 있습니다.

'control'은 내가 가지고있는 전역 필터를 통해 위의 JSP로옵니다. chain.doFilter()try/catch 블록으로 싸여 있습니다. exception이 발생하면 Error.jsp로 리디렉션됩니다.

오류가 발생하면 ... 중앙 오류 페이지에서 캐치되지 않으며 필터에서 포착되지도 않습니다. 나는 필터가 'jsp'를 호출 할 때 그것을 잡아 내지 못한다고 생각한다 ... 아직 오류가 없다.

나는 DB 내부의 호출이 JSP 내부에서는 좋지 않지만 나는 많은 레거시 코드를 다루고있다.

이 시나리오에서 오류를 중앙 집중식 오류 페이지로 이동 시키려면 어떻게해야합니까? 또한 JSP에는 가져온 오류 페이지가 없습니다. 모든 JSP에 오류 페이지를 가져 오는 옵션을 원하지 않습니다. 좀 더 일반적인 해결책을 원합니다.

답변

0

잘못된 접근 방식을 시도했습니다. JSP 파일에 논리 처리 코드 (비즈니스 로직)가 없어야합니다. JSP는 뷰 기술입니다. 서블릿이나 일부 액션/컴포넌트 프레임 워크 (Struts2/Spring MVC/JSF/등)를 사용하여 비즈니스 로직을 처리하십시오. 필터 방식에 관해서는

는 - 그것은 좋은 해결책이지만, 필터 (<filter-mapping> 사용) /*에 매핑해야합니다 JSP에서

<filter> 
    <filter-name>exceptionFilter</filter-name> 
    <filter-class>com.yourpackage.YourFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>exceptionFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

매핑됩니다. 예외가 JSP 내부에서 발생하기 때문에 필터가 예외를 어떻게 잡을까요? ... – drake

+0

@drake JSP가 Servlet으로 변환됩니다. 그래서 서블릿에서 발생하는데, 이것은'chain.doFilter()'다음에 처리됩니다. 예외에서 생성 된 스택 추적을 제공하십시오. – Bozho

+0

예외 메시지 :'org.springframework.jdbc.UncategorizedSQLException : SqlMapClient operation; SQL []에 대한 분류되지 않은 SQLException SQL 상태 [null]; 오류 코드 [17004];'web.xml에서 잡으려고합니다. 이제 코드가 chain.doFilter에 대한 catch 블록에 있음을 알았습니다. 그러나 catch 블록에서'response.sendRedirect'를 시도 할 때 응답이 이미 설정되었으므로 실패합니다. 이 문제를 해결할 방법이 있을까요? – drake

3

예외가 잘 처리 할 수없는, 그것은 변화에 너무 늦기 때문에 응답. JSP는 뷰 기술로서 전체 응답을 자체적으로 담당합니다. 응답 헤더와 응답 내용을 보냅니다. 응답 헤더가 전송되면 의 응답이 없음입니다. 필터조차 여기에서 도움이되지 않습니다.

예외가 JSP 중간에 발생할 때마다 응답이 갑자기 중지되고 클라이언트가 빈 페이지 또는 반쯤 굽어 진 페이지를 보게되며 예외는 서버 로그에만 기록됩니다. 응답이 이미 커밋되었으므로 가능하지 않은 동안 오류 페이지를 리디렉션/전달/표시하려고 시도 할 때마다 IllegalStateException: response already committed을 따라 이동했을 수 있습니다.

요약하면 JSP 파일에 원시 Java 코드를 쓰지 마십시오. 서블릿에서 (in) 직접 Java 클래스에 넣으십시오. 그것은 전에 처리되고 JSP가 표시됩니다. 이렇게하면 응답의 대상을 변경할 수있는 여지가 충분합니다.

당신이 (내가 추천하지 않는) 비즈니스 로직을위한 JSP를 사용하여 주장하는 경우, 대안 전에 JSP 파일의 상단, 모든 템플릿 텍스트를 모든 비즈니스 로직을 넣어하는 것입니다 (HTML 및 등)가 응답으로 전송됩니다. 운이 좋으면 예외가 발생할 때마다 servletcontainer가 오류 페이지에 대한 응답을 변경할 수 있습니다.

+0

설명해 주셔서 감사합니다. 나는 이해. 하지만 나는 100 개 이상의 레거시 JSP를 다루고 있으며,이 시점에서 비즈니스 로직을 꺼내기 위해 이들 모두를 변경할 여유가 없다. 나는 코드가'chain.doFilter'에 대한 catch 블록에 있다는 것을 알아 챘지만,'response.sendRedirect'를 시도하면 응답이 이미 설정되었으므로 실패합니다. 이 주변에 방법이 있습니까? – drake

+0

아니오. 반품의 시점입니다. 요청에 대해 둘 이상의 응답을 보낼 수 없습니다. – BalusC

+0

잘 그 bullocks. 나는 당신이 말했듯이 DB에 대한 호출이 중간에있는 것이 아니라 JSP의 첫 번째 것이고 web.xml의 오류 페이지 선언을 통해 잡히는 것으로 나타났습니다. 그러나 그것이 중간에 있다면 그것은 그들에게 잡힐 수 없습니다. 이것 뒤에 어떤 이유? – drake

관련 문제