2013-05-26 2 views
1

내 페이지 탐색 대부분의 요청을 얻을 사용하고 지금은 매개 변수가 h:commandButton 또는 내부 f:param를 사용하여 쿼리 문자열 매개 변수로 포함되어야하는 형태가 includeViewParams의 속성을 검사하여 UIViewParameter을 사용합니다.JSF - F에서 URL 쿼리 문자열을 만들 내장 방법 : PARAM 및 includeViewParams

나는 모든보기 정의 된 매개 변수를 포함 할 것이 이후 includeViewParams를 사용하지 않는, 그냥 아이의 명령 구성 요소로 제공하는 사람을 사용하고 싶습니다.

<h:form> 
    <p:inputText value="#{bean.value1}"/> 
    <p:selectOneMenu value="#{bean.value2}"/> 
    <p:commandButton action="#{utilBean.performActionParams(outcome)}"> 
     <f:param name="key1" value="#{bean.value1}"/> 
     <o:param name="key1" value="#{bean.value2}" converter="#{bean.converter}/> 
    </p:commandButton> 
</h:form> 

public String performActionParams(final String outcome) 
{ 
    final UriBuilder uriBuilder = UriBuilder.fromPath(outcome); 

    final FacesContext context = FacesContext.getCurrentInstance(); 
    final UIComponent component = UIComponent.getCurrentComponent(context); 

    for (final UIComponent child : component.getChildren()) 
     if (child instanceof UIParameter) 
     { 
      final UIParameter param = (UIParameter) child; 

      if (!param.isDisable() && !StringUtils.isBlank(param.getName())) 
      { 
       final Object value = param.getValue(); 

       if (value != null) 
        uriBuilder.queryParam(param.getName(), value); 
      } 
     } 

    return uriBuilder.build().toString(); 
} 

이 논리는 정말 복잡하지 않고는 h:linkh:button에서와 같은 논리로 보이기 때문에 그렇게 중복 보인다.

누군가이 로직이 구현되는 것을 알고 있습니까?

+0

<h:inputText value="#{bean.params.key1}" /> <h:inputText value="#{bean.params.key2}" /> <p:commandButton value="#{bean.submit(outcome)}" /> 

정말 당신의 질문을 이해하지 마십시오. 체크는'ViewDeclarationLanguage.getViewMetadata()'를 호출하여'RESTORE_VIEW' 단계에서 수행됩니다. 당신의 경우에는'ViewMetadata' 인스턴스를 돌려 줄 것입니다 ** ** GET 네비게이션 *과 *를 사용하기 때문에 도착 페이지는 ''입니다. 귀하의 질문은 무엇인가? 메타 데이터 처리를 재정의 하시겠습니까? – kolossus

+0

jsf의 어딘가에'h : link'에서'f : param'을 읽고 대상 URI를 생성하는 코드가 있어야합니다. 나는 기본적으로 회피책이며, 명령 단추를 사용하기 위해서'h : link'와 동일한 기능을하는 코드를 게시했다. Jsf 어딘가에 이미 코딩되어 있기 때문에 제 코드가 중복 된 것 같아요. – djmj

답변

0

Mojarra에서이 종류의 논리는 OutcomeTargetRenderer#getEncodedTargetURL() (및 HtmlBasicRenderer#getParamList())에도 묻어 있습니다. API에서 제공하는 유일한 공용 부분은 ViewHandler#getBookmarkableURL()이지만 UIParameter 구성 요소 목록이 아닌 매개 변수 맵은 Map입니다.

구체적인 기능 요구 사항은 무엇인지 모르겠지만 실제로는 POST 요청이 아닌 간단한 GET 요청을 실행하려고합니다. 이 경우 <h:link> 또는 <h:button> (또는 <p:button>)을 사용해야합니다. 렌더러는이 로직이 내부적으로 구현 된 OutcomeTargetRenderer에서 확장됩니다. EL을 outcome 속성으로 사용할 수 있습니다 (아마도 이것이 명령 단추를 시도한 이유 일 수는 없습니다).

<p:button outcome="#{outcome}"> 
    <f:param name="key1" value="#{value1}" /> 
    <o:param name="key1" value="#{value2}" converter="#{bean.converter}" /> 
</p:button> 

업데이트 : 코멘트에 따라, 구체적인 기능 요구 사항은 기본적으로 GET 요청에 제출 된 데이터와 함께 JSF POST 양식을 켭니다. 이 경우 에 입력을 바인딩하면 getBookmarkableURL()에서 사용할 준비가 더 쉽습니다.

private Map<String, String> params; 

@PostConstruct 
public void init() { 
    params = new HashMap<>(); 
} 

public String submit(outcome) { 
    // ... 

    return context.getApplication().getViewHandler() 
     .getBookmarkableURL(context, outcome, params, false); 

    // TODO: Is faces-redirect=true also considered? 
} 
+0

그러나 양식 입력 매개 변수 '# {bean.query}'는이 경우 다시 게시가 없으므로 평가되지 않습니다.이 값은 viewParam을 통해 설정할 수도 있습니다. 입력 매개 변수가있는 양식을 사용하기 위해 예제를 편집했습니다. 유감스럽게 생각합니다. 메소드 참조를 살펴 봅니다. – djmj

+0

오, 이런 식으로. 그건 완전히 의미가 있습니다. 글쎄, 방법이있다, 나는 대답을 업데이트 할 것이다. – BalusC

+1

지도가 'Map >'?과 같이 입력 할 필요가 없습니다. 특정 유스 케이스의 경우 유망 해 보이지만'inputText'를 가진 String 만 처리하면 안된다 (따라서 예제에서는'o : param'을 사용하는 변환기).더욱이 bean 값이'f : viewParam'을 통해 설정 될 수 있다면, 이것은 나에게 항상 맵을 사용하도록하거나 (적어도 String의 그것과 같은) 사용하도록 만들 것이다. 아마도'HtmlBasicRenderer.getParamList()'와'getBookmarkableURL()'의 조합을 사용했을 것입니다. 그러나 이것은 또한 좋은 생각이 아닌 mojarra와 연결되도록 강제 할 것입니다. – djmj