Как получить имя действия в JSP, даже если оно пустое?

Я новичок в java. Я пытался искать вокруг, но не нашел ничего похожего на мой вопрос.

У меня есть элементы списка в меню (<ul>-s и <li>-s). Я хочу добавить класс active в тег <li> в зависимости от имени действия, чтобы сделать конкретный пункт меню активным.

Для этого я использовал этот фрагмент кода

${request.context['struts.actionMapping'].name}

Этот фрагмент кода работает нормально на всех страницах, за исключением страницы, где имя действия "", т.е. пустая строка. Проверка пустой строки или нулевая проверка не работает, если имя действия просто ""

<s:set var="action">${request.context['struts.actionMapping'].name}</s:set>

<ul class="nav navbar-nav navbar-right">
    <li class="<s:if test="%{#action == ''}">active</s:if>">
        <s:a href="/crudoperation">Dashboard</s:a>
    </li>
    <li class="<s:if test="%{#action == 'add'}">active</s:if>">
        <s:url var="addUrl" action="add"/>
        <s:a href="%{addUrl}">Add Student Profile</s:a>
    </li>
    <li class="<s:if test="%{#action == 'edit'}">active</s:if>">
        <s:url var="editUrl" action="edit"/>
        <s:a href="%{editUrl}">Edit Profile</s:a>
    </li>
    <li class="<s:if test="%{#action == 'view'}">active</s:if>">
        <s:url var="viewUrl" action="view"/>
        <s:a href="%{viewUrl}">View Profile</s:a>
    </li>
</ul>

Вот мой struts.xml

<struts>
    <constant name="struts.ui.theme" value="simple" />
    <package name="default" extends="struts-default" namespace="/">

        <result-types>
            <result-type name="tiles"
                class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>

        <action name="" class="com.javaguy.struts2.IndexAction">
            <result name="master" type="tiles">master</result>
        </action>

        <action name="add" class="com.javaguy.struts2.AddAction">
            <result name="add" type="tiles">add</result>
        </action>

        <action name="edit" class="com.javaguy.struts2.EditAction">
            <result name="edit" type="tiles">edit</result>
        </action>

        <action name="view" class="com.javaguy.struts2.ViewAction">
            <result name="view" type="tiles">view</result>
        </action>
    </package>
</struts>

person Yasir Wali    schedule 09.12.2015    source источник
comment
Пустое действие? Почему? Используйте 1_.   -  person Aleksandr M    schedule 09.12.2015
comment
Возможно, он хочет поймать только пустое действие, а не каждый несоответствующий URL. Существует также трюк "*", и, кстати, лучше всего использовать непустое имя, но я думаю, что весь смысл немного широк.   -  person Andrea Ligios    schedule 09.12.2015
comment
Как вообще можно назвать пустым действие? Что-то вроде /.action.   -  person Aleksandr M    schedule 09.12.2015


Ответы (1)


В случае пустого имени действия ${request.context['struts.actionMapping'].name} создаст пустоту в теле тега <s:set>, что равно <s:set var="some"></s:set> и присвоит верхний объект из стека значений переменной some. Обычно верхним объектом в стеке значений является экземпляр класса действия. Таким образом, вы получаете что-то вроде com.javaguy.struts2.IndexAction@4349f7db в своей переменной вместо пустой строки.

Чтобы получить пустое имя действия, просто используйте OGNL в теге <s:set>.

<s:set var="some" value="#request.context['struts.actionMapping'].name" />

Также, как уже упоминалось Андреа, избегайте использования ключевых слов (таких как action) в ваших переменных.

person Aleksandr M    schedule 09.12.2015
comment
Небольшой побочный эффект от смешивания EL с тегами Struts :D - person Andrea Ligios; 09.12.2015
comment
@YasirWali: У вас есть дополнительные вопросы по этой проблеме? Если нет, не забудьте принять/проголосовать за ответы, которые вам помогли. - person Aleksandr M; 21.12.2015