3

liferay のポートレットにパラメーターを渡そうとし<portlet:actionURL>ていますが、EL を使用して値を渡すと機能しませんが、JSP 式タグを使用すると正常に機能することがわかりました。

関連するコードは次のとおりです。

<%
    ResultRow row = (ResultRow)request.getAttribute(WebKeys.SEARCH_CONTAINER_RESULT_ROW);

    Course course = (Course) row.getObject();
    long groupId = themeDisplay.getLayout().getGroupId();
    String name = Course.class.getName();
    String primaryKey = String.valueOf(course.getPrimaryKey());

%>

<liferay-ui:icon-menu>

    <c:if test="<%= permissionChecker.hasPermission(groupId, name, primaryKey, ActionKeys.UPDATE)%>">
        <portlet:actionURL name="editCourse" var="editURL">
            <portlet:param name="resourcePrimaryKey" value="${primaryKey}"/>
        </portlet:actionURL>

        <liferay-ui:icon image="edit" message="Edit" url="${editURL}" />
    </c:if>
</liferay-ui:icon-menu>

ご覧のとおり、タグでは、属性<portlet:param>を渡すために EL を使用しました。しかし、それは機能せず、次のようにすると、アクション メソッドのように値を受け取ります。0"resourcePrimaryKey"

long courseId = ParamUtil.getLong(request, "resourcePrimaryKey");
// courseId is 0 here

ただし、EL の代わりに JSP 式タグを使用すると、問題なく動作します。

<portlet:actionURL name="editCourse" var="editURL">
    <portlet:param name="resourcePrimaryKey" value="<%= primaryKey %>"/>
</portlet:actionURL>

これで、 に必要な値を取得できました"resourcePrimaryKey"

ここで何が起こっているのか誰でも理解できますか?驚くべきことに、ご覧のとおり、他の場所の EL は正常に動作します - url${editURL}属性の値は正常に動作し、対応する URL にリダイレクトします。

同じ問題に関してApacheメールアーカイブでこのスレッドに出くわしましたが、実際には問題は解決しません。

4

1 に答える 1

6

スクリプトレットの変数は、EL で直接使用することはできません。最初に次のように設定する必要があります。

<c:set var="primKey"><%=primaryKey %></c:set>

${primKey}リクエスト属性として使用または設定します。

request.setAttribute("primKey", primaryKey);

明らかに、式を直接使用する方がよいでしょう。

また、${editURL}動作に関しては、EL で使用できるようにページ コンテキストで変数を設定するポートレット jsp タグです。

私たちの wiki は、これらのことを知るのに適した場所Make objects available to ELです。この質問の見出しに注意してください :-)

于 2013-07-30T09:07:32.513 に答える