2015-01-13 8 views
1

좋아, 제목은 약간 혼란 스럽지만 한 문장으로 내 문제를 해결하는 방법을 알아낼 수 없습니다.<p:menuitem>의 아이콘 대신 <o : graphicImage>를 구현하십시오. <p:megaMenu>

나는 Primefaces (또는 더 좋게, Omnifaces에서 graphicImage 구성 요소를 구현해야합니다. 데이터베이스에서 이미지를로드하고 이미 응용 프로그램에서 o : graphicImage를 사용하고 있기 때문에)를 표시하려면 MenuItem 구성 요소에 넣어야합니다. MegaMenu 구성 요소는 백킹 빈에서 작성된 DefaultMenuModel을 사용하여 프로그래밍 방식으로 생성됩니다. 또한 (위에서 언급 한대로) 이미지는 데이터베이스에서로드되므로 이미지를 동적으로 사용할 수 있으므로 CSS를 통해 해당 이미지 (아이콘)를로드하는 솔루션이 적용되지 않습니다.

불행히도 필자는 불행히도 실패한 비참한 결과를 보았습니다. :-(. 전체 스택 Primefaces 사용자 정의 구성 요소를 작성한 경험이 없으므로 MegaMenu 구성 요소에 대한 기본 사용자 정의 렌더러를 사용해 보았습니다. 예를 들어, 나는 o : graphicImage 구성 요소 (encodeBegin 및 encodeEnd)에서 코드를 사용하려고 시도하고 그것을 내 CustomMegaMenuRenderer (MegaMenuRenderer를 확장)에서 구현했습니다. encodeMenuItemContent 재정의 된 메서드에서 사용했습니다. EL 표현식을 전달하기 위해 약간의 해킹을 사용했습니다 (예 : # {imageStreamer.getImage (23)}, 여기서 23은 실제 이미지 ID입니다.) 모델에서 MenuItem 구성 요소의 'icon'필드의 값으로이 문자열을 전달하면 재정의 된 encodeMenuItemContent에서 실제로 엘 (아이콘 이름이 아님)인지 확인합니다.

writer.startElement("img", null); 
writer.writeURIAttribute("src", getSrc(context, expresion), "value"); 
writeAttributes(writer, this, GraphicImage.ATTRIBUTE_NAMES); 
writer.endElement("img"); 
0 getSrc (문맥, 식)과 같이 구현된다

: graphicImage 성분 :

private String getSrc(FacesContext context, String expression) throws IOException { 
    Resource resource; 
    ExpressionFactory ef = context.getApplication().getExpressionFactory(); 
    ValueExpression dynExpression = ef.createValueExpression(context.getELContext(), expression, Object.class); 
    resource = GraphicResource.create(context, dynExpression, null); 
    return context.getExternalContext().encodeResourceURL(resource.getRequestPath()); 
} 

하지만 불행히도 getSrc (컨텍스트 표현식)는 내부 통상 O를 상자에 포장하는 것처럼 캐릭터 콘텐츠를 반환하지.

가 나는 또한 ... 프로그램 개체에 내 렌더링 한 후 호출 encodeAll 방법에 (Primefaces 또는 Omnifaces에서) graphicImage 구성 요소를 인스턴스화하지만이 또한 실패와 같은 다른 방법을 시도
GraphicImage gi = (GraphicImage) application.createComponent(GraphicImage.COMPONENT_TYPE); 
gi.getAttributes().put("value", expression); 
gi.encodeAll(context); 

그래서 나는 결론을 내렸다 저기서 정말 큰 것을 놓치고 있습니다. 나는 SO와 구글에서 비슷한 것을 찾으려고했지만 성공하지 못했습니다. (내 접근이 나쁜 가정) 그래서, 여기 내 진짜 질문은 여기에 있습니다 : 그것은 모든 primefaces/omnifaces에게 사용자 정의 렌더러 내부 구성 요소를 인스턴스화하고 그래서 (이 정상적으로 작동하는 것처럼 작동하게 할 수 이벤트가

  1. 인가 예상대로 자체 렌더링)? 이 은 내 렌더러를 원하는대로 작동시키는 가장 쉬운 방법이 될 것입니다 ...
  2. 이 "custom renderer"접근 방식으로 진행해야합니까, 아니면 이 경우 쓸모 없습니까?
  3. 위에서 설명한이 기능을 만들려면 주문에 사용자 지정 MenuModel, MenuItem 또는 MegaMenu 클래스를 만들어야합니까?
  4. 마지막으로 이론적으로 가장 쉬운 방법은 이며이를 달성하는 "가장 좋은"방법은 무엇입니까 ( primefaces 구성 요소 디자인과 맞 춥니 다. 실제로 어떻게해야합니까?). 난 JSF 인 Mojarra 2.2.9, 제

    감사 미리 톰캣 5.1, 2.0 및 Omnifaces 용접 Primefaces 사용

또한 언급 (하지만 그 범위 밖으로 추측).실제로 작동하지 않습니다

<p:menuitem ... icon="#{imageStreamer.getImage(23)}" /> 

이 :

답변

0

는 지금까지 내가 이해, 당신은 같은 것을 사용하려고했다. 렌더러가 렌더링을 얻으면 즉시 평가됩니다. 이것은 또한 <o:graphicImage>의 작동 방식이 아닙니다. 브라우저가 실제로 이미지를 요청해야하는 순간까지 평가가 연기됩니다.

<p:menuitem ... icon="23" /> 

다음과 같이

그런 다음 당신이 그것을 렌더링 할 수있는 (안전 icon="#{bean.iconId}" 같은 표현 될 수 있습니다) :

@Override 
protected void encodeMenuItemContent(FacesContext context, AbstractMenu menu, MenuItem menuitem) throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    String imageId = menuitem.getIcon(); 
    Object value = menuitem.getValue(); 

    if (imageId != null) { 
     ValueExpression expression = Components.createValueExpression("#{imageStreamer.getImage(" + imageId + ")}", Object.class); 
     GraphicResource resource = GraphicResource.create(context, expression, null); 
     String src = context.getExternalContext().encodeResourceURL(resource.getRequestPath()); 
     writer.startElement("img", null); 
     writer.writeURIAttribute("src", src, null); 
     writer.endElement("img"); 
    } 

    // ... 
} 

가장 좋은 방법은 이미지 대신 식별자를 전달하는 것입니다

(아주 가까이에 있었지만, 불행한 점은 자신이 ated expression 및 정확히 어떻게 실패했는지, 정확한 원인을 정확히 찾아 낼 수 있음)

+0

감사합니다. BalusC, 진정으로 도움이됩니다. 내 코드의 유일한 문제는 모델 코드에서 다음과 같은 줄입니다 :'item.setIcon ("# {imageSteramer.getImage ("+ c.getIcon() .getId() + ")}");'item은 DefaultMenuItem 객체입니다. 그냥 이미지 ID를 전달한 다음 내 렌더러에서 표현을 위조해야합니다. 대답에서 지적한 것처럼 말입니다. 오류 메시지는 _FATAL : Target Unreachable이었습니다. 'imageSteramer'식별자가 null_으로 확인되었지만 올바르게 이해할 수 없습니다. 그래서, 네 말이 맞았을 것 같아. 나는 정말로 아주 가까웠다. :). 다시 한번 감사드립니다. – Andrija

+0

반갑습니다. – BalusC