2011-10-04 3 views
1

최근에 Java EE 6을 배우기 시작했는데 도움이 필요합니다. 양식, 일부 필드 및 명령 단추가있는 search.xhtml 페이지를 만들었습니다. 조치는 관리 Bean의 메소드를 호출하고 문자열을 리턴합니다. 그러나 브라우저의 url-field는 결과가있는 다른 페이지 인 search-results.xhtml로 업데이트되지 않습니다. 그것은 search.xhtml 페이지의 내용을 보여줍니다 (하지만 레이아웃과 모든 것을 search-results.xhtml에서 얻은 것처럼 보입니다).관리 빈에 지정된 새 페이지로 리디렉션되지 않습니다.

, 당신이 바로 그 <form action> URL 등의 POST 요청을 보내는

@ManagedBean 
@RequestScoped 
public class Search { 

private SearchBackingBean searchBackingBean; 
private ArrayList<String> list; 

public Search() { 
    searchBackingBean = new SearchBackingBean(); 
    list = new ArrayList<String>(); 
} 

public String find() { 
    return "search-results"; 
} 

search.xhtml 기본적으로

<h:form> 

    <h:inputText value="#{search.searchBackingBean.query}" 
       size="60" 
       required="true" 
       requiredMessage="Please enter what you want to search for." /> 
    <h:commandButton value="Find" action="#{search.find}" /><br /> 

    <h:outputText value="Search criterias to be included in your search." /><br /> 
</h:form> 

답변

2

을 (그것은이 시간에 많은 일을하지, 매우 간단합니다) 보고있는 초기 페이지와 후 처리 중에 주어진 결과 페이지를 사용하여 JSF에 결과를 표시합니다. 내부적으로 RequestDispatcher#forward()을 사용하여 요청/응답을 지정된 대상으로 전달합니다. 이것은 서버 측에서 전적으로 발생합니다. JSF가 커버하는 기본 Servlet API에 익숙하다면 그 기능을 이해해야합니다. 브라우저의 주소 표시 줄의 URL의 변경을 원하는 경우

, 당신은 기본적으로 , (일부 구성 파일을 기반으로 ViewHandler를 조작하지 않고 표준 JSF에 수 없습니다) 원하는 URL에 <form action> URL을 변경해야 또는을 입력하면 POST 후 전체 결과를 ?faces-redirect=true에 추가하여 전송합니다.

return "search-results?faces-redirect=true"; 

리디렉션은 기본적으로 주어진 URL에 대한 새로운 GET 요청을 보내도록 웹 브라우저에 지시 때문에 주소 표시 줄에 URL이 변경됩니다. 단, 단점은 모든 요청 범위 콩이 garbaged 및 재 작성 (리디렉션이 요청이므로!) 따라서 검색 결과가 손실됩니다.

는 잘 모르겠어요 당신이 URL이 변경 갖고 싶어하지만, 당신이 북마크 된 확인하려면 다음 <h:form> (POST 기본값)를 사용하지만, 단지 일반 HTML <form> 안 (디폴트는 GET)을 일반 HTML 입력 및 버튼으로 변환하고 대상 페이지에 <f:viewParam>이라는 매개 변수를 정의하여 JSF가 대상 페이지와 연관된 bean에서이를 설정하도록합니다.

예. 검색 형태 :

<form action="search-results.xhtml"> 
    <input name="query" size="60" /> 
    <input type="submit" value="Find" /> 
</form> 

및 결과 페이지

는 :

<f:metadata> 
    <f:viewParam name="query" value="#{search.query}" required="true" requiredMessage="Please enter what you want to search for." /> 
    <f:event type="preRenderView" listener="#{search.find}" /> 
<f:metadata> 

(그런데, 나는 한 페이지에 그들을 결합하고 그 결과를 렌더링하는 원합니다 조건 rendered 속성을 사용하여)

SearchBackingBean은 IMO의 이름이 잘못 지정되어 있습니다. 그것은 뒷받침 빈이 아닙니다. 그것은 단지 엔티티 (또는 POJO 또는 DTO 또는 이름을 지정하려는 것) 일뿐입니다. Search 클래스가 실제 백업 빈입니다.

+0

@BalcusC : 답변 해 주셔서 감사합니다. 내가 묻는 이유는 실제로 브라우저에서 url을 변경해야한다고 생각했기 때문입니다. 브라우저에서 url을 변경할 필요가 없습니다. 오늘 JSF 부분을 읽기 시작했지만 렌더링을 염두에 두겠습니다! – LuckyLuke

+0

당신을 진심으로 환영합니다. JSF를 처음 접했을 때 "우수 사례"및 "유용한 정보"에 대해 배우는 데 도움이되는 두 개의 기사가 있습니다. [JSF 2.0 자습서] (http://balusc.blogspot.com/2011/01) /jsf-20-tutorial-with-eclipse-and.html) 및 [Communication in JSF 2.0] (http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html)을 참조하십시오. – BalusC

관련 문제