1

意図したとおりに動作するために、(実行時にユーザーが設定する) いくつかのプロパティを必要とするコンポーネントに取り組んでいます。

最初はproperties.get('foo')、コンポーネントから必要なプロパティを取得するために単純に a を使用していましたが、コンポーネントの jsp ファイルからスクリプトレット コードの痕跡をすべて削除しようとしています。

このプロパティ 'foo' (コンポーネントの実行時に設定される) を Java コード内で取得するにはどうすればよいですか? ValueMap を使用することが最善の方法であるとどこかで読んだことを覚えているので、これを使用してみました:-

public static Map<String, Object> getResourceProperties(String path,
            SlingHttpServletRequest request) {
        ResourceResolver resourceResolver = request.getResourceResolver();
        Map<String, Object> props= new HashMap<String, Object>();
        Resource resource = resourceResolver.getResource(path);
        if (null != resource) {
            props.putAll(resource.adaptTo(ValueMap.class));
        }
        return props;
    } 

そしてこれは私のjspにあります:-<c:set var="refProperties" value="${xyz:getResourceProperties(properties.path,slingRequest)}" />

しかし、これは私が望む値を返しません。

4

5 に答える 5

5

これを実現する最も簡単な方法は、 を含めて、既にスコープ内にあるオブジェクトを/libs/foundation/global.jsp使用することです。properties${properties.foo}

次のように、コンポーネント jsp の先頭に global.jsp を含めます。

<%@include file="/libs/foundation/global.jsp"%>

ファイル内のコメントが示すように、基本的には、JSP で使用する Sling (sling)、CQ (cq)、および JSTL (c,fmt,fn) の taglib 名前空間を登録します。

次に、cq:defineObjectstaglib の助けを借りて、多くの有用なオブジェクトをスコープに取り込みます。

<cq:defineObjects />

リストは次のとおりです。

@param slingRequest SlingHttpServletRequest
@param slingResponse SlingHttpServletResponse
@param resource the current resource
@param currentNode the current node
@param log default logger
@param sling sling script helper

@param componentContext component context of this request
@param editContext edit context of this request
@param properties properties of the addressed resource (aka "localstruct")
@param pageManager page manager
@param currentPage containing page addressed by the request (aka "actpage")
@param resourcePage containing page of the addressed resource (aka "myPage")
@param pageProperties properties of the containing page
@param component current CQ5 component
@param designer designer
@param currentDesign design of the addressed resource  (aka "actdesign")
@param resourceDesign design of the addressed resource (aka "myDesign")
@param currentStyle style of the addressed resource (aka "actstyle")

これは、cq:defineObjects taglib を使用するだけで、JSP 式言語 (EL) を介してプロパティ ValueMap にアクセスできることを意味します。JSP 内のプロパティにアクセスするために追加の変換は必要ありません。

<c:out value="${properties.foo}" />

独自の Java taglib または Bean 内のプロパティにアクセスするには、標準の JSTL タグを使用して適切なオブジェクトをコードに渡すだけです。リクエスト全体、現在のリソース、またはプロパティのみを渡すことができます。リクエスト全体を渡すと、Java コードは現在のリソースと、プロパティ ValueMap を含む cq:defineObjects taglib によって作成されたすべてのオブジェクトにアクセスできるようになります。

JSP の場合:

<jsp:useBean id="mybean" scope="request" class="com.my.impl.TheBean">
   <jsp:setProperty name="mybean" property="slingRequest" value="${slingRequest}"/>
   <jsp:setProperty name="mybean" property="resource" value="${resource}"/>
   <jsp:setProperty name="mybean" property="properties" value="${properties}"/>
</jsp:useBean>

豆で:

public void setSlingRequest(final SlingHttpServletRequest slingRequest) {
    this.slingRequest = slingRequest;
    // Use the one created by cq:defineObjects
    this.properties = (ValueMap)this.slingRequest.getAttribute("properties");
    // OR adapt the resource
    this.properties = this.slingRequest.getResource().adaptTo(ValueMap.class);
}

public void setResource(final Resource resource) {
    this.resource = resource;
    this.properties = this.resource.adaptTo(ValueMap.class);
}

public void setProperties(final ValueMap properties) {
    this.properties = properties;
}
于 2013-10-09T14:36:58.203 に答える
1

useBean タグを使用して、必要な情報を提供できるクラスのインスタンスを作成します。

<jsp:useBean id="mycomponent" scope="request" class="com.company.components.SomeComponent">
   <jsp:setProperty name="mycomponent" property="request" value="<%= slingRequest %>"/>
</jsp:useBean>

次に、クラスにセッターを作成します。

 public void setRequest(final SlingHttpServletRequest request) {
    this.request = request;
    //or more likely an init() method that inits all your props
    //you could even use reflection to look for props that match all the field names
    //to init them automatically
    ValueMap props=request.getResource().adaptTo(ValueMap.class)
    this.interestingProp= props.get("interestingProp");
}

public String getInterestingProp(){
   return this.interestingProp;
}

次に、あなたのjspで:

<c:out value="${mycomponent.interestingProp}"/>
于 2013-10-07T11:21:02.340 に答える
1

この特定のケースでは、Map<String, Object>すべてのリソース プロパティを含む作成を試みています。propertiesこのマップはobject (これも)と同じMapであるため、メソッド全体が冗長であると思います (そして、あなたが書いているように、機能しません)。propertiesオブジェクトにはメソッドが含まれpathていないため、おそらくそれが機能しない理由です。

さらに、request.getResource()(リゾルバーとリソースをパスで取得する代わりに) 使用したことがあるかもしれません。また、に適応させる代わりにresource、JSP からのValueMap単純なパスを使用することもできます。properties

より一般的には、JSP から Java クラスにロジックを抽出したい場合は、ある種のmodelクラスを作成し、そのコンストラクターに渡しslingRequestてから、JSP でそのメソッドを呼び出すことをお勧めします。例:

GET.jsp

<c:set var="model" value="<%= new MyModel(slingRequest) %>" />
Result of the first method: ${model.firstValue}<br/>
Result of the second method: ${model.secondValue}

MyModel.java

public class MyModel {
    private final SlingHttpServletRequest request;

    private final Resource resource;

    private final ValueMap properties;

    public MyModel(SlingHttpServletRequest request) {
        this.request = request;
        this.resource = request.getResource();
        this.properties = resource.adaptTo(ValueMap.class);
    }

    public String getFirstMethod() {
        // do some clever things
        return "";
    }

    public String getSecondMethod() {
        // do more clever things
        return "";
    }
}

呼び出す場合は、メソッド名にプレフィックスを${model.firstMethod}追加する必要があることに注意してください( )。getgetFirstMethod()

于 2013-10-07T06:49:24.667 に答える
0

よく私は自分の質問に答えることができました。resource.path私がしたことは、jsp で使用することだけでした。

ここのresourceは問題のコンポーネントを参照しているため、パスを使用してValueMapを正しく作成できました。

したがって、私のjspファイルのコードは次のとおりです:-

<c:set var="refProperties" value="${xyz:getResourceProperties(resource.path,slingRequest)}"\>

これを使用して、必要なコンポーネントの任意のプロパティを参照できるようになりました:-

${refProperties.foo}

を使用するには、 global.jspresource.pathも含める必要があります。そうしないと、認識されません。

于 2013-10-07T14:19:48.997 に答える