Make Struts показывает разные JSP для разных ролей - PullRequest
2 голосов
/ 08 мая 2009

У нас есть веб-приложение Struts 2, которое используется почти каждым сотрудником для управления и настройки заданий для нашей фермы серверов. Мы работаем над планом по созданию информационной панели для клиентов, чтобы они могли видеть свои собственные задания и очень просто отображать ее статус («в процессе», «готов к проверке», «завершен» и т. Д.). Все страницы, которые могут видеть клиенты, будут содержать гораздо меньше информации, чем мнения сотрудников, и не будет никакого способа что-либо редактировать или изменять. Но, в конце концов, это два разных представления одной и той же информации: одно очень простое, другое более сложное и управляемое.

Наивный способ сделать это - использовать if / elses в каждом jsp:

<s:if test="user.role == 'customer'">
    <!-- TODO - Display simple customer view -->
</s:if>
<s:else>
    <!-- TODO - Display complex employee view -->
</s:else>

Есть ли более простой способ сделать это? Могу ли я создать два отдельных каталога jsps, один с именем «customer» и один с именем «employee» (или по умолчанию или что-то в этом роде), а затем иметь в своем действии ключ Struts, чтобы решить, какой каталог проверить?

Или есть другой способ, которым я могу это сделать?

Ответы [ 2 ]

1 голос
/ 08 мая 2009

Из вопроса не совсем ясно, являются ли эти два представления совершенно разными, или у клиентов есть что-то дополнительное, или у сотрудников есть что-то дополнительное. Если в одной роли есть что-то лишнее, просто поместите общие части в один файл, а необычные части - в свои собственные файлы и используйте включения или плитки (или что-то подобное) для объединения JSP-страниц в страницу.

Если два представления полностью различаются, они должны быть отдельными JSP, и в этом случае действие может пересылать в соответствующее представление, основанное на роли, как предложил Rich Kroll.

Что касается вашего комментария с вопросом о дублировании определений результатов, когда у вас есть две отдельные взаимоисключающие функции, вам нужны два пути кода. Лучшее, что вы можете сделать, это вынести общность в файлы с общим кодом.

Один из способов упростить код действия, если вы часто делаете этот шаблон, - это выбрать ActionForward, который лучше всего соответствует желаемому форвардному имени.

Итак, если бы вы обычно делали

return mapping.findForward("success");

Вы можете сделать что-то вроде этого

ActionForward defaultMapping = mapping.findForward("success");
ActionForward roleMapping = mapping.findForward(user.getRole() + "_success");
if (roleMapping != null) {
  return roleMapping ;
} else {
  return defaultMapping;
}

Поместите это в метод в вашем базовом классе, и тогда вашим действиям не нужно знать, к какому виду они собираются. Тогда ваш Struts-config может быть примерно таким:

<action path="/home" class="HomeAction">
  <forward name="success" path="home.jsp"/>
</action>
<action path="/viewOrder" class="ViewOrderAction">
  <forward name="customer_success" path="customer_order.jsp"/>
  <forward name="employee_success" path="employee_order.jsp"/>
</action>

В этом случае вы не будете динамически искать jsps по имени, чтобы определить, существуют они или нет, но по крайней мере вы можете сохранить код действия простым.

1 голос
/ 08 мая 2009

Я бы предложил управлять этим внутри вашего контроллера. Добавьте новое представление для клиента, проверьте роль пользователя в вашем контроллере и отобразите соответствующее представление. Это оставит ваше существующее представление нетронутым и добавит возможность иметь действительно настраиваемые представления для ваших клиентов.

...