2011-01-19 6 views
0

나는 struts 초보자입니다. 나는 Form, Actionjsp view입니다.struts 1.x에서 뷰를 준비하는 방법

<html:select property="..." > 
    <html:optionsCollection name="countries" ... /> 
</html:select> 
: 뷰에서
request.setAttribute("countries", countriesDao.getAll()); 

내가 사용하는 select 요소를 렌더링 : 이벤트 양식의 특성

<form-beans> 
    <form-bean name="bookEventForm" type="com.example.BookEventForm" /> 
</form-beans> 

<action path="/bookEvent" 
     type="com.example.BookEventAction" 
     name="bookEventForm" 
     input="/WEB-INF/jsp/bookEvent.jsp" 
     scope="request"> 
    <forward name="success" path="/WEB-INF/jsp/bookEvent.jsp" /> 
</action> 

하나는 내가 Action에서 할 첫 번째 일은이다 Country입니다

ActionForm#validate을 추가하여 유효성 검사를 수행 할 때까지는 제대로 작동합니다 (예 : 성! = null).

오류가 발생하면 struts spec에 의해 Action#execute이 실행되지 않습니다. 따라서 countries 컬렉션은 더 이상 요청에 포함되지 않으며 뷰는 비어있는 select 요소로 렌더링됩니다.

저는 스트럿츠의 핵심 개념이 빠져 있다는 것을 알고 있습니다. 친구가 뷰에서 DAO를 사용할 수 있도록 제안 했으므로 언제든지 국가를 가져올 수 있지만 JSP 코드가 실행되기 전에 일반적으로 뷰 준비 (DB 데이터 프리 페치)를 선호합니다.

아이디어가 있으십니까?

답변

0

saveErrors(request, ((BookEventForm)form).validate()); 

잘 작동 내 요구 사항을 충족시킵니다. 작업은보기, 오류 또는 성공 페이지를 표시하기 전에 항상 실행되며보기를 준비하는 코드가 있습니다.

0

가장 쉬운 방법은 here으로 설명 된 사전 채우기 방법을 사용하는 것이라고 생각합니다. 나는 개인적으로이 접근법을 사용 해본 적이 없다. (나는 세션 스코프 형식을 사용했다.)

또는 국가 목록의 설정을 양식의 validate() 메소드에 포함시킬 수 있습니다 (그러나 이는 해킹 비트입니다).

+0

validate() 메소드에서로드하는 국가를 추가해도 작동하지만 레이어 및 MVC는 명백히 위반됩니다. – cherouvim

0

필자가 아는 한 유효성 검사가 실패하면 컨트롤은 validate 메서드로 채워진 ActionErrors가있는 화면으로 돌아옵니다. 그리고 validate가 호출되기 전에 폼이 채워집니다.

public ActionErrors validate() { 
    ActionErrors errors = new ActionErrors(); 
    if (...) errors.add("name", new ActionError("error.field.mandatory")); 
    if (...) errors.add("surname", new ActionError("error.field.mandatory")); 
    return errors; 
} 

그리고 Action에서 호출 : : 나는 스트럿을 무시하고 Form에 내 자신의 validate 방법을 추가 할 수 validate 문제가 있었다 스트럿 극복하기 위해 무슨 짓을

+0

예. 컨트롤이 JSP에 전달되기 전에 실행되는 Java 코드 (선호하는 동작)가 필요합니다. 데이터베이스에서 국가 목록을로드하려면이 항목이 필요합니다. – cherouvim

+0

그런 경우로드를 화면에 표시하고 세션 캐시에 유지하는 사전 프로세스로 수행하는 것이 좋습니다. – Sid

+0

나는 그 종류의 데이터를 http 세션에 저장하는 것을 좋아하지 않는다. 나는 그것이 옳다고 생각하지 않는다. – cherouvim

0

실제로 필요한 Struts 1의 메커니즘 인 ActionForm의 reset 메소드가 있습니다.

폼의 필드를 기본값으로 다시 설정하기위한 것입니다. 그러나 폼의 채우기 전에 (즉, validate 메서드가 호출되기 전에) 실행되므로 컬렉션이나 다른 개체도 세션에 저장하는 것이 좋습니다.

@Override 
public void reset(ActionMapping mapping, HttpServletRequest request) { 
    request.setAttribute(SITES, siteDao.findAll()); 
    request.setAttribute(SERVICES, serviceDao.findAll()); 
} 
관련 문제