2011-02-15 5 views
3

저는 JSP 스크립틀릿을 사용하는 것이 일반적으로 싫은 일임을 알고 있습니다. 그래서 제가하고 싶은 것을 성취하기위한보다 우아한 방법이 있는지 궁금합니다. 꽤 많이보기를 만들고 도메인 모델의 특정 상황에 따라 다른 HTML을 렌더링하고 있습니다.JSP 스크립틀릿을 사용할 수 있습니까?

예를 들어 사용자가 역할을 수행 할 수있는 시나리오를 생각해보십시오. 그리고 이와 같은 방법은 사용자 모델 클래스에 정의 : 다음

public boolean isInRole(String roleName) { 
    // Logic here to determine if the user is in a role 
} 

그리고 우리는 JSP, 아래와 같이있다 : 지금까지 내가이 알고

<% 
    User user = (User)request.getAttribute("user"); 
%> 

// Some HTML here... 

<% if (user.isInRole("admin") { %> 
    // Generate some admin menu here 
<% } %> 

JSTL을 사용하여 수행 할 수 없습니다 /엘자. 여기 스크립틀릿을 사용하는 것이 좋은 생각 같습니까? 아니면 복용해야하는 또 다른 접근법이 있습니까?

의견을 보내 주셔서 감사합니다.

답변

5

사용자 정의 태그를 생성하여이를 수행 할 수도 있습니다.여기에 베어 뼈의 예는 다음과 같습니다

새로운 TLD 파일을 생성 : WEB-INF/user.tld

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag 
Library 1.2//EN" 
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 
<taglib> 
    <tlib-version>1.0</tlib-version> 
    <jsp-version>1.2</jsp-version> 
    <short-name></short-name> 
    <tag> 
     <name>user</name> 
     <tag-class>tags.UserRoleTag</tag-class> 
     <body-content>JSP</body-content> 
     <attribute> 
      <name>roles</name> 
      <required>true</required> 
      <rtexprvalue>true</rtexprvalue> 
     </attribute> 
    </tag> 
</taglib> 

사용자 정의 태그 클래스를 만들 : 태그/UserRoleTag.java

package tags; 

import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.tagext.TagSupport; 

@SuppressWarnings("serial") 
public class UserRoleTag extends TagSupport { 
    private String roles; 

    public int doStartTag() throws JspException { 
    String userRole = (String)pageContext.getAttribute("currentUserRole"); 

    return roles.contains(userRole) ? EVAL_BODY_AGAIN : SKIP_BODY; 
    } 

    public String getRoles() { 
    return roles; 
    } 

    public void setRoles(String roles) { 
    this.roles = roles; 
    } 
} 

jsp : warfolder/home.jsp 만들기

<%@ taglib uri="/WEB-INF/user.tld" prefix="u" %> 

<% pageContext.setAttribute("currentUserRole", "admin"); // this value would come from the controller... %> 

<u:user roles="admin registered"> 
    welcome admin! 
</u:user> 

<u:user roles="guest"> 
    welcome guest! 
</u:user> 

타킨 이 접근 방식은 모델과 태그를 느슨하게 결합한 상태로 유지하며 다른 프로젝트에서도 재사용 할 수 있습니다.

8

나는 3.0 서블릿으로 업그레이드하는 것 중/JSP 2.2은 인수 방법, EL

<c:if test="${user.isInRole('admin')}"> 

에서 허용 또는 사용자 정의 EL 기능

질문 역사 당으로
<c:if test="${util:isUserInRole(user, 'admin')}"> 

을 만들 수 있습니다 호출하는 경우 이미 JEE6을 사용하고있는 것 같습니다. 그래서 첫 번째 접근 방식이 당신을 위해 작동해야합니다 (web.xml이 서블릿 3.0 스펙을 준수한다고 선언 된 경우).

2

내가 사용하는 경험 법칙은 스크립트 렛 (또는 JSP 태그 또는 EL)이 백엔드 시스템과 상호 작용하는 트리거링 액션과 대조적으로 컨트롤러에 의해 이미 설정된 모델을 사용해야한다는 것입니다. 물건 가져와.

차이점은 종종 미묘하지만 내 의견으로는 상당히 중요합니다. 예를 들어, 사용자가 관리 역할에 있는지 결정하려면 데이터베이스에 액세스하거나 웹 서비스 호출을해야한다고 결정합니다. 그런 다음 해당 동작을 뷰에서 트리거하여 MVC를 위반하게됩니다. 스크립틀릿이나 JSP 태그 또는 EL에서 작업을 호출하는지 여부는 중요하지 않습니다. 당신은 컨트롤러에 의해 가장 잘 된 것을했습니다.

그래서이 문제를 어떻게 해결할 수 있습니까? 나는 사용자가 컨트롤러 역할을 맡고 있는지를 결정하는 논리를 쓴다. 그런 다음보기에서 모델을 사용하여 사용자가 관리 역할에 있는지 확인할 수 있도록 모델에서이 정보를 사용할 수있게합니다. 간단한 $ {user.isAdmin}은보기에서 질문에 응답합니다. 이 견해는 어떤 행동을 촉발시키는 "비난"을받지 않을 것이다.

그래서 나는 이런 종류의 명령에 집착하는 것으로 순박 한가? 응용 프로그램의 최적화가 필요한 많은 경우에 컨트롤러를 검사하고 수행중인 작업을 최적화하는 것이 더 쉽습니다. 뷰가 백 엔드 작업을 트리거하는 경우 백 엔드 상호 작용이 여러 컨트롤러와 뷰에 분산되어 있기 때문에 이러한 종류의 최적화를 수행하는 것은 매우 어려울 것입니다.

이것은 또한 단일 책임 원칙에 위배됩니다. 희망이 귀하의 질문에 대한 답변.

그런데, 큰 질문입니다. 이 점에 대해이 정도의 수준으로 생각하고있어 기쁩니다.

관련 문제