JSF 및 Navigation-Rules를 사용하여 매개 변수로 GET 요청을 작성하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/138617

  •  02-07-2019
  •  | 
  •  

문제

h : outputlink, 기타 JSF 태그 또는 코드를 사용하여 HTML 링크를 만들 수있는 방법이 있습니까?

예를 들어 다음 내비게이션 규칙이 있습니다

<navigation-rule>
    <navigation-case>
        <from-outcome>showMessage</from-outcome>
        <to-view-id>/showMessage.jsf</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

내 페이지에서 다음 HTML 코드를 출력하고 싶습니다.

<a href="/showMessage.jsf?msg=23">click to see the message</a>

페이지에 HTML 코드를 작성할 수는 있지만 모든 URL을 단일 구성 가능한 파일로 정의하기 위해 탐색 규칙을 사용하고 싶습니다.

도움이 되었습니까?

해결책

이것은 흥미로운 아이디어입니다. 나는 그것이 실제로 어떻게 펼쳐지는지 궁금합니다.

내비게이션 규칙 받기

내비게이션은 다음으로 처리됩니다 NavigationHandler. NavigationHandler를 유지하는 것은 어렵지 않지만 API는 사용하는 규칙을 노출하지 않습니다.

내가 볼 수 있듯이, 당신은 할 수 있습니다 :

  1. 초기화시 faces-config.xml을 구문 분석하고 응용 프로그램 컨텍스트에 규칙을 저장합니다 (쉬운)
  2. faces-config.xml의 규칙을 무시하거나 자신의 규칙 파일을 보충하고 규칙 세트를 어떻게 든 노출시키는 자체 NavigationHandler를 구현하십시오.실행 가능하지만 약간의 작업이 필요합니다)
  3. 자신을 조롱하십시오 faceScontext 기존 내비게이션 핸들러에게 전달하십시오 (두 개의 faceScontext 객체를 동일한 스레드에서 공존하고 매우 비효율적으로 만들기가 정말 어렵습니다.)

이제 또 다른 문제가 있습니다. 모자를 어디에서 유지하여보기를 찾아 보시겠습니까? 콩에 하드 코드?

내비게이션 규칙을 사용합니다

오프 핸드, 백엔드에서 매개 변수 함유 URL을 구성 할 수있는 두 가지 방법을 생각할 수 있습니다. 둘 다 어떤 종류의 콩을 정의하는 것이 포함됩니다.

<managed-bean>
    <managed-bean-name>navBean</managed-bean-name>
    <managed-bean-class>foo.NavBean</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

원천:

package foo;

import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

public class NavBean implements Serializable {

    private String getView() {
        String viewId = "/showMessage.faces"; // or look this up somewhere
        return viewId;
    }

    /**
     * Regular link to page
     */
    public String getUrlLink() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        String navUrl = context.getExternalContext().encodeActionURL(
                extContext.getRequestContextPath() + viewId);
        return navUrl;
    }

    /**
     * Just some value
     */
    public String getValue() {
        return "" + System.currentTimeMillis();
    }

    /**
     * Invoked by action
     */
    public String invokeRedirect() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        try {
            String charEncoding = extContext.getRequestCharacterEncoding();
            String name = URLEncoder.encode("foo", charEncoding);
            String value = URLEncoder.encode(getValue(), charEncoding);
            viewId = extContext.getRequestContextPath() + viewId + '?' + name
                    + "=" + value;
            String urlLink = context.getExternalContext().encodeActionURL(
                    viewId);
            extContext.redirect(urlLink);
        } catch (IOException e) {
            extContext.log(getClass().getName() + ".invokeRedirect", e);
        }
        return null;
    }

}

가져 오기

GET 요청의 경우 uiparameters를 사용하여 값을 설정하고 렌더러가 매개 변수 목록을 작성하도록 할 수 있습니다.

<h:outputLink value="#{navBean.urlLink}">
    <f:param name="foo" value="#{navBean.value}" />
    <h:outputText value="get" />
</h:outputLink>

게시하다

사후 조치 중에 URL을보기로 설정하려면 작업에서 리디렉션을 사용하여 (버튼 또는 명령 링크로 호출)를 수행 할 수 있습니다.

<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
    <h:outputText value="post" />
</h:commandLink>

메모

주목하십시오 externalContext.encoDeactionUrl 문자열을 인코딩하는 데 사용됩니다. 이것은 컨텍스트 (포틀릿 등)에서 휴대 할 수있는 코드를 생성하기위한 모범 사례입니다. 당신은 사용할 것입니다 encoderesourceurl 이미지 또는 다운로드 파일에 대한 링크를 인코딩하는 경우

다른 팁

Prettyfaces를 사용해 보셨습니까? GET 요청과 함께 북마크 가능한 JSF 페이지 / JSF를 만들기 위해 특별히 설계된 오픈 소스 JSF 확장자입니다.

PrettyFaces- SEO, 동적 매개 변수, 북마크 및 JSF / JSF2의 탐색

양식을 고려해 보셨습니까?

<h:form>
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" />
    <h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>

중첩 된 매개 변수 태그와 함께 명령 링크를 사용할 수 있습니다. 이것은 기본적으로 Hubbardr가 위에서 말한 것과 동일합니다.

<h:form>
  <h:commandLink value="click here" action="${handler.outcome}">
    <f:param name="msgId" value="${bean.id}" />
  </h:commandLink>
</h:form>

그런 다음 백 콩에서해야합니다.

Map requestMap = FacesContext.getCurrentInstance()
                 .getExternalContext().getRequestParameterMap();
String msgId = (String) requestMap.get("msgId");

그런 다음해야 할 일을하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top