Как перенаправить пользователя на разные страницы с помощью кнопки отправки в Struts 2

Во-первых, обратите внимание, что я знаю, что следующий код не написан на JavaScript или jQuery, но я просто добавил их как теги этого вопроса в надежде найти решение для него с помощью Javascript или jQuery.

У меня есть форма с тремя кнопками отправки. Проблема в том, что когда я отправляю форму с помощью любой из кнопок, страница результатов будет отправлена ​​​​на тот же адрес. Мне нужно, чтобы он был по другому адресу.

Цель:

Предполагается, что код должен отображать список элементов для определенной категории на странице с именем view. Пользователь выбирает несколько элементов и отправляет форму. Сервер должен отображать сведения о выбранных элементах на странице обновления (отдельный адрес со страницей просмотра). Затем пользователь может редактировать сведения об элементах и ​​отправлять форму для обновления сведений об этих элементах.

Требование:

скажем, адрес

myexample.com/Product/view      //shows view page

после нажатия на редактирование он должен перенаправить на следующий адрес.

myexample.com/Product/update     //shows update page ( show details of selected products)

Возможное решение:

Основываясь на ответе Романа С, после получения запроса я передаю список продуктов другому действию, чтобы показать страницу обновления, но он показывает его следующим образом по адресу: поэтому страница обновления не распознает параметр продуктов как список.

...products=[1%2C+2]&id=1

Java:

List <Integer> products = new ArrayList();
   

Перенаправление Struts:

   <result name="updateProducts" type="redirectAction">
            <param name="actionName">update</param>
            <param name="namespace">/products/Update</param>
            <param name="products">${products}</param>
            <param name="id">${id}</param>
   </result>

Даже если я вручную отправлю следующий запрос, класс действий не распознает параметр продуктов как список. Он показывает, что его размер равен нулю.

 ...products=[1,2]&id=1

person Community    schedule 28.03.2014    source источник
comment
См. stackoverflow.com/q/13343954/1700321.   -  person Aleksandr M    schedule 28.03.2014
comment
Вы имеете в виду, что он должен отправляться на другой URL-адрес по адресу?   -  person Roman C    schedule 28.03.2014
comment
Единственный возможный ответ — использовать Ajax. Подсказка заключается в том, чтобы оставаться на странице myActions: это может сделать только Ajax.   -  person developerwjk    schedule 28.03.2014
comment
Я полагаю, это означает, что когда запрос сделан, бэкенд должен получить запрос от myAction и перенаправить пользователя на отдельный адрес от myAction.   -  person J888    schedule 30.03.2014
comment
@RomanC да, это правильно. J888 полностью прав.   -  person Jack    schedule 31.03.2014
comment
@AleksandrM, я уже следовал этому ответу, но он все еще не работает.   -  person Jack    schedule 31.03.2014
comment
@developerwjk проблема в том, что я не хочу оставаться на странице myActions, после нажатия кнопки отправки мне нужно, чтобы она перенаправляла на связанный адрес, а не просто отображала результат на адресе myActions.   -  person Jack    schedule 31.03.2014
comment
Вопрос @AleksandrM обновлен   -  person Jack    schedule 01.04.2014
comment
Вопрос @developerwjk обновлен   -  person Jack    schedule 01.04.2014
comment
Зачем тебе это вообще нужно? Если для закладок, то делать закладки для обновления или удаления смысла мало.   -  person Aleksandr M    schedule 01.04.2014
comment
@developerwjk :D как тебе пришла в голову эта идея?   -  person Jack    schedule 02.04.2014
comment
@ Джек Мур, опыт использования обычного HTML-тега ‹form› (не ‹s:form›) и отправки в сервлет (не JSP, заполненный XML-тегами), а затем использование чего-то простого, например установка атрибута сеанса и использование response.sendRedirect("whatever.jsp"); return; или установка атрибут запроса и переадресация.   -  person developerwjk    schedule 02.04.2014
comment
@developerwjk, тогда какой смысл использовать фреймворки? Сеансов также следует избегать из-за их слабости.   -  person Jack    schedule 02.04.2014
comment
Фреймворки — это здорово, если вы не застреваете каждые 10 минут на новом вопросе, как сделать эту простую вещь в этом вопросе о фреймворке. Нет причин избегать сеансов для вещей, где сеансы уместны. Если запрос более уместен, используйте атрибут запроса, а не сеанс. Но, очевидно, есть случаи, когда сеанс подходит, например, сохранение имени пользователя, когда пользователь входит в систему, поэтому на всех страницах с этого момента вы знаете, кто этот пользователь.   -  person developerwjk    schedule 02.04.2014
comment
Я не говорю вам не использовать Struts или вообще отказаться от фреймворков. Но из того, что я видел здесь по вопросам, Struts кажется более сложным, чем Spring.   -  person developerwjk    schedule 02.04.2014
comment
@developerwjk да, может быть, я собираюсь изучить Spring, я много об этом думаю.   -  person Jack    schedule 02.04.2014
comment
@developerwjk Да, опыт отличный, он формирует собственное мнение.   -  person Roman C    schedule 02.04.2014


Ответы (2)


Вы должны добавить результат redirectAction в конфигурацию действия, которое обрабатывает запрос на отправку. В вашем случае он имеет имя edit, что сбивает с толку, должно называться как save или update, потому что, когда вы называете его edit, многие программисты думают, что вы делаете запрос на заполнение некоторых текстовых полей. Но это неправда, ваше действие edit не заполняется, а не отправляется на сервер. После отправки вы должны следовать Шаблон Post-Redirect-Get и вернуть результат redirectAction или redirect другому действию или URL-адресу, не являющемуся обязательным для действий view или edit, если вы не хотите оставаться на странице после перенаправления. Удалите конфигурацию действия редактирования, так как она покрыта сопоставлением подстановочных знаков. Добавьте кнопку сохранения

<s:submit id="saveBtn" action="save" value="Save"/>

добавить и вернуть результат действия перенаправления из действия save

<action name="save" method="save" class="myexample.Product">
  <result type="redirectAction" name="list" />
</action>   
person Roman C    schedule 31.03.2014
comment
хорошо, спасибо, обратите внимание, что элементы будут выбраны на странице просмотра, а сведения о выбранных элементах будут отображаться на странице обновления для обновления; поэтому в этом случае мне нужно отправить список выбранных элементов или объект, включающий их все, в новое действие, потому что второе действие должно отображать детали выбранных элементов для редактирования, я прав? - person Jack; 01.04.2014
comment
Как я понял из PRG, это делается для того, чтобы избежать дубликатов. Мой код должен отображать список элементов для определенной категории на странице с именем view. Пользователь выбирает несколько элементов и отправляет форму. Сервер должен отображать детали выбранных элементов на новой странице, называемой обновлением (отдельный адрес со страницей просмотра). Затем пользователь может редактировать сведения об элементах и ​​отправлять форму для обновления сведений об этих элементах. - person Jack; 01.04.2014
comment
Не только дубликаты, когда вы перенаправляете на новый/другой адрес, запрос очищается, и вы готовы снова заполнить его данными, необязательно, чтобы он имел тот же JSP, который можно было бы сопоставить с другим также действие. - person Roman C; 01.04.2014
comment
проблема в том, как отправить список выбранных элементов в новое действие? вопрос обновлен. - person Jack; 02.04.2014
comment
@JackMoore Список выбранных элементов или массив параметров отправляется с запросом, и вы можете получить его, реализовав интерфейс ParameterAware, см. Как я могу получить параметр в JSP?. - person Roman C; 02.04.2014

Как перенаправить пользователя на разные страницы на основе кнопки отправки формы, которая нажата:

Перенаправление URL-адресов — это метод всемирной паутины, позволяющий сделать веб-страницу доступной более чем под одним URL address. Когда веб-браузер пытается открыть URL-адрес, который уже был перенаправлен, открывается страница с другим URL-адресом.

For example, www.example.com is redirected to example.iana.org. 

Точно так же Domain redirection или domain forwarding — это когда все страницы в домене URL перенаправляются в другой домен, например, когда wikipedia.com и wikipedia.net автоматически перенаправляются на wikipedia.org.

Перенаправление URL-адресов можно использовать для сокращения URL-адресов, для предотвращения неработающих ссылок при перемещении веб-страниц, для разрешения multiple domain имен, принадлежащих одному и тому же владельцу, ссылаться на один веб-сайт, для навигации по веб-сайту и выхода из него, для защиты конфиденциальности, и для менее безобидных целей, таких как фишинговые атаки.

<form action="http://example.org/ jmail1.java">
<input type="submit" value="Go To jmail1.java">
</form>

<form action="http://example.org/jmail2.java">
<input type="submit" value="Go To jmail2.java">
</form>

Методы:

Several different kinds of response to the browser will result in a redirection. These vary in whether they affect HTTP headers or HTML content. The techniques used typically depend on the role of the person implementing it and their access to different parts of the system.

Например, веб-автор, не контролирующий заголовки, может использовать метатег Refresh, тогда как администратор веб-сервера, перенаправляющий все страницы на сайте, скорее всего, будет использовать конфигурацию сервера.

<action name="foo"> 
   <result type="redirectAction"> 
      <param name="actionName">bar</param> 
      <param name="namespace">/</param> 
   </result> 
</action>

Хотя информационный путь дает вам возможность создать собственное сообщение после отправки, многие пользователи запросили нечто большее. Им не понравилось, что форма просто оставляет вас в списке, это может сбивать с толку. Таким образом, у нас есть способ, с помощью которого вы можете сделать форму InfoPath функциональной, как традиционная веб-форма, в которой вы заполняете форму, и после нажатия кнопки «Отправить» пользователь попадает на страницу благодарности.

Решение:

  1. Создайте страницу благодарности и сохраните ее где-нибудь на своем сайте. Мы рекомендуем использовать любой редактор, например «Блокнот» или SharePoint Designer, для создания HTML-страницы с сообщением по вашему выбору, например «Спасибо за отправку».

  2. Нажмите на эту страницу с благодарностью и запишите URL-адрес IE, он будет выглядеть примерно так: http://mydomain.com/sites/YourSite/YourDocLibrary/thankYou.html

  3. Теперь вам нужно выяснить URL-адрес вашей формы InfoPath. Либо щелкните по нему и запишите URL-адрес, либо, если вы прикрепили форму InfoPath к списку SharePoint, вам нужно будет изменить URL-адрес следующим образом: http://mydomain.com/sites/YourSite/YourList/NewForm.aspx, как видите, мы только что добавили NewForm.aspx в конец.

  4. Take the URL you recorded in step 3 and add the following:? Source=http://mydomain.com/sites/YourSite/YourDocLibrary/thankYou.html, поэтому URL-адрес должен выглядеть следующим образом: http://mydomain.com/sites/YourSite/YourList/NewForm.aspx?Source=http://mydomain.com/sites/YourSite/YourDocLibrary/thankYou.html ‹‹ это ссылка, которую вы отправляете своим пользователям для заполнения формы. Когда ваши пользователи нажимают на эту новую ссылку, SharePoint автоматически перенаправляет их на вашу страницу благодарности после отправки.

  5. На этой странице «Спасибо» вы можете добавить ссылку для перехода на другую страницу, или вы можете проявить фантазию и добавить мета-тег обновления, чтобы автоматически перенаправлять ваших пользователей, например, на домашнюю страницу вашего сайта. Как ты это делаешь? Простой. Добавьте эту строку: <meta http-equiv="refresh" content="2;url=http://mydomain.com/sites/yourSite/"> между тегами вашей HTML-страницы. Просто чтобы объяснить немного больше об этой строке, число 2 в этом случае представляет 2 секунды. Таким образом, вы можете изменить это, чтобы пользователь оставался на этой странице дольше или короче, заменив этот номер другим. URL-адрес будет URL-адресом вашей домашней страницы или любого другого сайта, на который вы хотите перенаправить пользователя.

<table><tr> <td><s:submit name="update" value="Update" action="update" ></s:submit></td> <td><s:submit name="delete" value="Delete" action="delete" ></s:submit></td> </tr></table>

<action name="update"
        class="net.viralpatel.struts2.action.MemberCrudOpertaions"
        method="updateUser">
        <result>members.jsp</result>
</action>

<action name="delete"
        class="net.viralpatel.struts2.action.MemberCrudOpertaions"
        method="deleteUser">
        <result>members.jsp</result>
</action>`

Перенаправление вручную:

Самый простой способ — попросить посетителя перейти по ссылке на новую страницу, обычно используя привязку HTML, например:

Please follow <a href="http://www.example.com/">this link</a>.

Этот метод часто используется в качестве запасного варианта — если браузер не поддерживает автоматическое перенаправление, посетитель все равно может перейти к целевому документу, перейдя по ссылке.

Перенаправление по умолчанию:

Техника перенаправления по умолчанию заключается в том, чтобы попросить посетителя перейти по ссылке на новую страницу, обычно используя HTML с JSP, например:

<html>
<%
String redirectURL = "http://stackoverflow.com/";
response.sendRedirect(redirectURL);
%>
</html>

http://struts.apache.org/release/2.2.x/docs/redirect-action-result.html

http://struts.apache.org/development/2.x/docs/multiple-submit-buttons.html

http://struts.apache.org/development/2.x/docs/submit.html

http://struts.apache.org/release/2.2.x/docs/interceptors.html

связанный источник: http://en.wikipedia.org/

person Community    schedule 03.04.2014