2014-11-24 2 views
0

JSP와 서블릿을 사용하여 로직을 프리젠 테이션과 분리하는 원칙에 따라 폼 처리를 수행하려고하는데, 당장은 직관적이지 않습니다.서블릿에서 유효성 검사가있는 JSP 폼

지금까지는 폼과 jsp : usebean이있는 간단한 JSP 페이지에서 요청 매개 변수를 Java 객체로 가져 왔습니다. JST 'if'를 사용하여 호출 방법을 확인합니다. GET이면 페이지를 표시하고 POST이면 유효성 검사 서블릿으로 전달합니다.

서블릿이 처리를 수행 한 다음 데이터가 올바르지 않을 때마다 양식으로 리디렉션된다는 아이디어가 있습니다.

서블릿 프로세스 게시 및 양식으로 리디렉션하는 경우 해당 양식은 무한 루프에서 서블릿을 다시 호출하므로 전달하기 전에 요청 방법을 "GET"으로 변경해야합니다.

또 다른 방법은 서블릿을 먼저 호출 한 다음 JSP 파일을 뷰로 호출하는 것입니다. 그러나 이것은 깔끔한 기능이며 서블릿에서 request.getParameter() 호출을 사용하여 객체를 수동으로 인스턴스화하는 과정을 반복합니다. 또한 많은 중복을 의미합니다. 매개 변수 이름에 따라서 JSP를 먼저 사용해야 할 필요성이 있습니다. JSP를 사용하여 서블릿으로 전달한 다음 JSP의 "보기"JSP로 보낼 수는 있지만 JSP의 단일 "기능"에 약간 지루한 것처럼 보입니다. 그래서 많은 노력에도 불구하고, 나는 여전히 깔끔한 해결책을 찾고 있습니다.

사람들은 "코드 중복 없음"원칙을 유지하면서 "JSP에서 코드 없음"원칙을 실제로 적용하는 방법은 무엇입니까? 전달할 때 요청 방법을 변경할 수 있습니까? Java 코드에서 에뮬레이트 할 수 있습니까? 현대적인 표준에 의해이 단순한 유스 케이스를 단지 못 생기는 JSP의 "방법"인가? 나는 많은 해결 방법을 사용할 수 있지만 가능한 한 많은 표준을 고수하려고합니다.

답변

0

서블릿을 컨트롤러으로 사용하십시오. 즉, 사용자는 JSP의 .jsp 확장자 나 다른 매핑 된 URL을 보지 못합니다. 사용자는 항상 서블릿의 URL로 보내집니다. 그런 다음 필요에 따라 서블릿이 JSP로 전달됩니다. 사실, 사용자가 컨트롤러 (즉, 서블릿)가 아닌 다른 방법으로 접근 할 수 없게하려면 jsp를 WEB-INF에두기를 원할 것입니다.

여기서 전달은 정확한 기술 의미로 사용됩니다. 즉,의 JSP 에 실행을 전달하지만 서블릿의 URL은 주소 표시 줄에 그대로 있습니다 (이는 리디렉션과 매우 다릅니다). 이렇게하면 사용자가 새로 고침을 누르면 서블릿이 여전히 실행 흐름을 제어합니다.

확인. 이제 논리를 위해 :

요청이 POST이고 유효성 검사가 Ok 인 경우 서블릿이 처리합니다.

유효성 검사가 실패하거나 요청이 GET 인 경우 서블릿은 JSP로 전달됩니다.

서블릿과 호환되지 않기 때문에 jsp : useBean을 제거해야합니다. servlets info page 하단을 참조하십시오.

코드 중복에 관해서는 서블릿에서 request.getParameter()을 호출 한 다음 request.setAttribute()으로 이동 한 다음 앞으로 이동 한 후 JSP에서 속성을 읽는 것입니다. 글쎄, 당신이 정말로 콩을 사용한다면 콩에 모든 매개 변수를 넣고 콩을 request.setAttribute()으로 설정해야한다. 그래서 JSP에서 더 이상 같은 장소의 매개 변수를 읽지 않을 것이다. bean은 요청 매개 변수가 아니라 .... 그래서 코드 중복이 아니다.(이것은 쓸모없는 jsp : useBean을 대체하는 것에 대해서도 설명합니다.)

그래서이 예제를 서블릿의 정보 페이지에서 가져 가도록하십시오. 는 JSP에서

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // Preprocess request: load list of products for display in JSP. 
    List<Product> products = productService.list(); 
    request.setAttribute("products", products); 
    request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); 
} 

:

 <c:forEach items="${products}" var="product"> 
      <tr> 
       <td>${product.id}</td> 
       <td><c:out value="${product.name}" /></td> 
       <td><c:out value="${product.description}" /></td> 
       <td><fmt:formatNumber value="${product.price}" type="currency" /></td> 
      </tr> 
     </c:forEach> 

는 서블릿이 products라는 이름의 객체를 생성하고 요청 속성에 배치하는 방법을 알아보십시오 서블릿에서? 똑같은 일을 할 것이지만, 목록 대신에 빈이 어떤 유형이든 상관 없습니다. 그리고 JSP에서 EL에 액세스 할 때도 마찬가지입니다. 빈을 서블릿에 request.setAttribute("myBean", beanObj);, JSP에 ${myBean.memberName}과 같이 액세스 할 수 있습니다.

관련 문제