2012-03-10 1 views
2

나는 내 고쳐 쓰고있다. jsp에서 JSTL/EL까지 scriplets에서 나는 문제에 직면하고있다. 아마 아주 간단하지만 EL에 익숙하지 않고 조금 잃어 버렸습니다.EL을 사용하여 중복을 피하는 방법은 무엇입니까?

final List<Person> l = new ArrayList<Person>(); 
personList.add(...); 
. 
. 
request.setAttribute("personList", l); 

그리고 내에서을 :

는 여기에 내가 서블릿/컨트롤러에서

... 뭘하는지입니다. JSP :

<c:forEach var="person" items="${personList}"> 
    ${person.name} 
</c:forEach> 

하지만 의 setAttribute에와 대해 forEach에 모두 사용하고 있기 때문에 나는 "personList"를 복제하고 있습니다. 이 중복을 제거하려면 어떻게해야합니까?

이상적으로 나는 서블릿과 .jsp로 (EL을 사용하지 스크립틀릿) 모두에서 참조 할 수 있다고하는 공공 정적 최종 문자열처럼 상수를 가지고 싶습니다.

분명 내가이 중복을 제거하려는 이유는 내가 (에 '의'와 함께) 사람, 말에 personList의 이름을 변경하기로 결정한 경우, 나는 현재 두 가지를 변경해야하고이 오류 -입니다 경향이있다. 내가 상수를 가졌다면 그 변화를 만들어야 할 곳이 하나 밖에 없을 것입니다.

EDIT 누군가 상수를 사용하면 상수의 이름을 변경하면 변경해야 할 곳이 2 곳 이상 필요하다는 의견이 있습니다. 그러나 내가 이것을 할 수 있다면 큰 차이가있다 :

request.setAttribute (Constants.PERSON_LIST, l);

* PERSON_LIST *의 이름을 바꾸고 컴파일 타임에 중단되는 오타를 만들었습니다.

내가 잘못 입력하면 동안 :

request.setAttribute("persnList", l); // forgetting an 'o' here 

이 lamely 컴파일하고 "personList"가 아니라 잘못 입력 "persnList"를 사용하는 .jsp로 경우 런타임에 실패합니다.

답변

0

정말 중복되지 않습니까? 단순히 변수를 선언하고 단일 범위에서 변수에 액세스하는 것입니다. 그건 아주 괜찮아. 프로그램을 작성하고 한 줄에 변수를 선언 한 다음 나중에 변수에 액세스하면 동일한 문제가 발생합니다 ... 선언 된대로 변수의 이름을 변경하면 모든 사용을 찾아 변경해야합니다.

예에서 범위는 요청 범위입니다. 따라서 요청 범위에서 변수 이름을 변경하면 전체 범위를 거쳐 동일한 변수에 대한 모든 참조를 변경해야합니다. 선언과 액세스가 서로 다른 두 파일에서 발생한다는 사실은 큰 문제가 아니어야합니다. 이는 해결이 필요한 문제가 아니며 솔루션은 코드를 읽는 데 어려움을 겪을 수 있습니다.

+0

"답변"에 동의하지 않습니다. 그것은 확실히 중복이고 나는 왜 나의 질문의 끝에 설명한다. 스크립틀릿을 사용하면 두 곳에서 무언가를 바꿔야합니다.이 복제본을 사용하지 않는 것은 아주 사소한 일입니다. 그것은 변수와 같지 않습니다. –

+0

* "프로그램을 작성하고 나중에 한 줄에 변수를 선언하면 ..."* ... 한 줄에있는 "문자열"이있는 메서드의 한 줄에있는 변수를 비교하는 비웃음 , 서블릿에서 그리고 다른 한편으로는 * .jsp *에서 그렇지 않다!? 다시 한번, 스크립틀릿을 사용하면 이런 종류의 중복이 발생하지 않습니다. –

+0

상수를 선언하는 경우 어떻게 다른가? 상수권의 이름을 바꾸려면 여전히 사용법을 고쳐야합니다. – Kevin

0

아마도 내가 틀렸지 만 jsps의 표준 문제는 페이지가로드 될 때까지 오류가 표시되지 않는다는 것입니다.상수가 이것을 어떻게 든 고칠 수 있다고해도, 당신이 묘사하는 것은 복제가 아니라 일반적으로 EL 변수의 결핍입니다 (즉, 동적으로 런타임에서 찾았습니다).

+0

그러나 소금 입자의 가치가있는 IDE는 스크립틀릿에서 존재하지 않는 상수를 참조하려고하면 경고 할 것입니다. 그리고 EL 3.0부터는 상수를 참조 할 수 있습니다 : ((슬프게도 나는 ' 아직 Java EE 7이 아닙니다.) –

1

레거시/기본 JSP/서블릿으로 작업 할 때 얻은 이점입니다. 당신은 수동으로 모든 프런트 컨트롤러 작업을 수동으로하고 있습니다.

실제 MVC 프레임 워크로 이동하십시오. 예를 들어, JSF, Spring MVC, Wicket 등의 프레임 워크는 하나의 서블릿 (또는 필터)을 가지고 있습니다.이 컨트롤러는 앞쪽 컨트롤러로 동작하여 빈을 생성하고 원하는 범위에 넣는 등의 전처리 작업을 수행합니다. 모델로만 javabeans로 작업하고 뷰로는 JSP/Facelets 파일로 작업을 마칠 수 있습니다. 예를 JSF 모두 당신이 필요로 다음 ("자동적으로"JSF 자체로 요청 범위에서 설정됩니다) 다음과 같은 자바 빈즈 :

@ManagedBean 
@RequestScoped 
public class Persons { 

    private List<Person> list; 

    @EJB 
    private PersonService service; 

    @PostConstruct 
    public void init() { 
     list = service.list(); 
    } 

    public List<Person> getList() { 
     return list; 
    } 

} 

그리고이 Facelet보기 :

<ui:repeat value="#{persons.list}" var="person"> 
    #{person.name} 
</ui:repeat> 

없음 중복 및 괜찮은 IDE 도구 (예 : JBoss Tools로 Eclipse)를 사용하는 경우 소스> 리 팩터> 이름 바꾸기을 통하지 않고 서로 연결할 수 있습니다.

+0

+1 ...이 답변에 감사드립니다. –