Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Struts несколько Form 1 Action 
V
    Опции темы
Pawl
Дата 12.2.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Доброго времени суток!
Сейчас ковыряю Struts, и возник следующий вопрос: есть приложение при запуске которого в браузере загружается логин-форма, куда вводятся данные (ФИО, пол и др.), далее после нажатия кнопки на форме эти данные попадают в Action, который их перенаправляет для хранения в БД, а в браузере загружается следующая форма (страничка, где написано, что данные внесены). На этой форме я сделал ссылку
Код

 <html:link href="login.do"><bean:message key="return"/></html:link>

по которой переходим к логин-форме.
Я хочу сделать для этого вместо ссылки кнопку (типа html:submit). Можно ли это сделать? Надо ли для этого создавать еще один Action или не обязательно? Использую встроеный в NetBeans Struts (1.3.8). Вот как выглядит мой struts-config:
Код

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
      "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>   
    <form-beans>
        <form-bean 
            name="guestInformationForm"
            dynamic="true"
            type="org.apache.struts.validator.DynaValidatorForm">
            <form-property name="firstName" type="java.lang.String" initial=""/>
            <form-property name="lastName" type="java.lang.String" initial=""/>
            <form-property name="sex" type="java.lang.String" initial=""/>            
        </form-bean>       
    </form-beans>   
    <action-mappings>
        <action
            path="/login"
            type="actions.LoginAction"
            name="guestInformationForm"
            scope="request"
            validate="true"
            input="/login.jsp">
            <forward name="success" path="/main.jsp"/>
        </action>      
    </action-mappings>

    <message-resources parameter="com.myapp.struts.ApplicationResource"/>
   
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>
    
    <plug-in className="org.apache.struts.tiles.TilesPlugin"></plug-in>    
</struts-config>

Вот логин-форма (login.jsp):
Код

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html:html lang="true">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
        <title><bean:message key="login.page"/></title>
        <html:base/>
    </head>
    
    <body>
        <h3><bean:message key="head.page"/></h3><br>
        <html:form  action="/login" method="POST">
            
            <logic:messagesPresent>
                <ul>
                 <html:messages id="error" property="loginError"> 
                    <li><bean:write name="error"/></li>
                 </html:messages> 
                </ul>    
            </logic:messagesPresent>
            
            <bean:message key="name"/> :<br> 
                <html:text property="firstName"/><br>
                <html:errors property="firstName"/><br>
            <bean:message key="lastname"/> :<br>
                <html:text property="lastName"/><br>
                <html:errors property="lastName"/><br>
            <bean:message key="sex"/> :<br>
                <html:select property="sex">
                    <option selected="selected"> <bean:message key="sex.male" />
                    <option> <bean:message key="sex.female" />
                 </html:select>
            <html:submit onclick="this.form.action='login.do?action=input'">
              <bean:message key="input"/>
            </html:submit>                    
    </body>
</html:html>

вот форма с информацией о результатах добавления в БД (main.jsp):
Код

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html:html lang="true">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title><bean:message key="Result.page"/></title>
    </head>
    
    <body>       
        <logic:messagesPresent message="true">
            <ul>
                <html:messages id="msg" property="message" message="true"> 
                    <li><bean:write name="msg"/></li>
                </html:messages>                 
            </ul> 
        </logic:messagesPresent>
        
        <html:link href="login.do"><bean:message key="return"/></html:link>    
        
    </body>
</html:html>

А вот - фрагмент Action-a:
Код

public class LoginAction extends Action {    
    private enum Cmd {
        INPUT, DELETE, SEARCH, SHOWALL, LOGIN
    }
    
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 
    throws Exception {

        ...
        try {
            ActionMessages message = new ActionMessages();
            String firstName = request.getParameter("firstName");
            String lastName = request.getParameter("lastName");
            String sex = request.getParameter("sex");                        
            HttpSession session = request.getSession(false);
            if(session != null) {
                session.invalidate();
            }

            session = request.getSession(true);
            if (firstName != null && lastName != null && sex != null) {
                Cmd action = Cmd.valueOf(request.getParameter("action").toUpperCase());
                ...
                switch (action) {
                    case INPUT:
                        msg = service.inputGuest();
                        message.add("message", new ActionMessage(msg));
                        saveMessages(request, message);
                        return mapping.findForward("success");
                   
                }
            }
...
}



--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Telperion
Дата 13.2.2012, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.10.2008

Репутация: 1
Всего: 1



если первая страница появляется как велком пейдж, то на main.jsp можно вместо login.do использовать адресс самого приложения....
Но это частный случай... поэтому нужно или добавлять новый экшен, который просто-напросто вернет нужную страничку

Я бы предложил отнаследовать ваши экшены от некого BaseAction. У этого класса метод  execute() смотрит некий параметр в реквесте, и в зависимости от его значения выполняет один из методов, которые переопределяются в наследниках.

Код


 public ActionForward execute(ActionMapping mapping, 
                                                ActionForm form, 
                                                HttpServletRequest request, 
                                                HttpServletResponse response)    throws Exception {

            ....
            String cmd = request.getParameter("cmd");
            if (cmd == null) {
                  result = onRequest(form, request, response);
            } else if ('submit'.equals(cmd)) {
                  result = onSubmit(form, request, response);
            }

            return result;


}

а ваш экшен преобразовать
Код

public class LoginAction extends BaseAction {    

            public String onRequest( ActionForm form, HttpServletRequest request, HttpServletResponse response) {
                return "sucsess";
            }

            public String onSubmit( ActionForm form, HttpServletRequest request, HttpServletResponse response) {
               ......
                   try {
                        ActionMessages message = new ActionMessages();
               ......

               ......
                        return mapping.findForward("submit");
            }
}

Код

       <action
            path="/login"
            type="actions.LoginAction"
            name="guestInformationForm"
            scope="request"
            validate="true"
            input="/login.jsp">

                 <forward name="success" path="/login.jsp"/>
                 <forward name="submit" path="/main.jsp"/>
        </action>      

ну добавить джаваскриптом нужный параметр в реквест при сабмите регистрационной формы
я заметил уже в коде попытки передавать тип экшена в параметрах реквеста.... но это кажется не то о чем я говорил )))
PM MAIL   Вверх
Pawl
Дата 13.2.2012, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Telperion, спасибо за то, что обновили мою тему smile 
Цитата(Telperion @  13.2.2012,  00:21 Найти цитируемый пост)
если первая страница появляется как велком пейдж, то на main.jsp можно вместо login.do

нет, тут у меня как раз login.jsp - это welcom page. Вот так странно smile 
Цитата(Telperion @  13.2.2012,  00:21 Найти цитируемый пост)
поэтому нужно добавлять новый экшен, который просто-напросто вернет нужную страничку
 вот об этом, пожалуйста, поподробнее - у Вас в приведенном отрывке struts-config'a описан только LoginAction.

Цитата(Telperion @  13.2.2012,  00:21 Найти цитируемый пост)
ну добавить джаваскриптом нужный параметр в реквест при сабмите регистрационной формыя заметил уже в коде попытки передавать тип экшена в параметрах реквеста

Если можно, примерчик, а то слово "попытки" наводят на мысль, что я дклал что-то неправильно smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Telperion
Дата 13.2.2012, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.10.2008

Репутация: 1
Всего: 1



Pawl

мне нужно денек, чтобы выдрать конкретные примеры и систематизировать их.

а про ваш конкретный случай я как раз и писал.
когда вы в браузер вводите http://localhost:port/WebApp
идет редирект на http://localhost:port/WebApp/login.jsp 
поэтому вместо 
Код

<html:link href="login.do"><bean:message key="return"/></html:link>

можно написать чтото вроде
Код

<a href="http://localhost:port/WebApp">Login page</a>

но это очень коряво и за такое надают по рукам ))))
PM MAIL   Вверх
Pawl
Дата 13.2.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(Telperion @  13.2.2012,  11:34 Найти цитируемый пост)
мне нужно денек, чтобы выдрать конкретные примеры и систематизировать их.

Был бы крайне признателен!

Цитата(Telperion @  13.2.2012,  11:34 Найти цитируемый пост)
поэтому вместо 
Код

<html:link href="login.do"><bean:message key="return"/></html:link>


Этот код работает у меня БЕЗ ПРОБЛЕМ - редиректит куда надо. Я хочу осуществить такой же редирект с помощью кнопки <html:submit/>


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Telperion
Дата 13.2.2012, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.10.2008

Репутация: 1
Всего: 1



итак к тому что я написал добавить следующее....
на страничке в форму поместить
Код

<input type="hidden" name="cmd"/>

кнопки можно заменить 
Код

<a href="javascript:void(0);" onclick="clickSubmit('submit');return false;">
    <img src="..." />
</a>

Код

function clickSubmit(evt) {
    _frm = document.forms[0];
    var el = _frm.elements['cmd'];
    if (el) {
        el.value = evt;
    }
    _frm.submit();
    return true;
}

вобщем примерно так выглядит скелет.
Очень подходит для приложений где странички идут одна за другой в основном... и на страницах есть несколько однотипных по сути действий (next back update add) и их нужно обработать...

ИТОГО.
1 пишем родительский экшн, который из сессии достаёт параметр с условным именем ('cmd')
и в зависимости от его значения вызывает один из предопределенных методов.
2 для каждой страницы наследуемся от этого экшена и переопределяем нужные нам экшены
3 на страничках добавляем в форму скрытое поле, и все сабмиты договариваемся делать через джаваскриптовую функцию, которая получает некое кодовое название действия и присваивая значение скрытому полю, обеспечивает наличие нужного параметра ('cmd') в реквесте

собственно все. Такой подход имеет своих критиков... но как бы они не критиковали, ключевое слово имеет (он их smile )

как это работает в вашем случае
Код

<action path="/login" ... >
    <forward name="success" path="/login.jsp"/>
    <forward name="submit" path="/main.do"/>
</action>      
<action path="/main" ... >
    <forward name="success" path="/main.jsp"/>
    <forward name="back" path="/login.do"/>
</action>      

http://hst:port/app/login.do будет редиректнуто на соответствующий экшен... поскольку в реквесте ничего нет сработает метод по умолчанию onRequest  (предполагаем что BaseAction написали правильно)
в этом методе можно при необходимости выполнить какуюто инициализацию...
на логин пейдже мы вводим что нужно и нажимаем на линк сабмита. там срабатывает джаваскрипт который сетает в скрытое поле "смд" значение 'submit' и отправляет сабмит по адресу ... /login.do
BaseAction понимает что нужно вызвать метод onSubmit() в этом методе вы делаете всю вашу логику по сохранению в базу и возвращает уже не "sucsess" a "submit"  на что Struts  делает редирект на main.do
там в свою очередь срабатывает метод onRequest() в котором вы по прежнему можете сделать какието предварительные действия(или просто сразу вернуть "success")
а дальше по анолодгии.... или кнопка которая вызовет onclick="clickSubmit('back')  которая вернет назад сделав при необходимости некоторые действия.... или какието новые экшены )))

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

В приципе детали можно осудить в личке ))) или по скайпу )
PM MAIL   Вверх
Pawl
Дата 14.2.2012, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Спасибо, что так основательно подходите к моей проблеме smile !
Дело в том, что осмысливать struts я стал, можно сказать, на днях, и свое приложение собирал по готовым примерам. Поэтому struts для меня действительно 
Цитата(Telperion @  13.2.2012,  23:31 Найти цитируемый пост)
требует некоторого осмысления и привычки
 smile 
По моему приложению: я его сюда приложил, и может Вы могли бы его посмотреть и изменить, что нужно? На самом деле, мне было  бы так гораздо удобнее! Так сказать, нарастить "мышцы теории на скелет практики"!
Огромное спасибо заранее!
З. Ы. В принципе, я планирую заниматься Web-проектами на java достаточно серьезно, и думаю, еще воспользуюсь Вашим предложением:
Цитата(Telperion @  13.2.2012,  23:31 Найти цитируемый пост)
детали можно осудить в личке ))) или по скайпу )
 smile 

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  guestsStruts.zip 13,61 Kb


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Pawl
Дата 16.2.2012, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



СДЕЛАЛ!    smile  smile 
Я повесил 2 страницы на одну форму и - О ЧУДО - все получилось!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Telperion
Дата 22.2.2012, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.10.2008

Репутация: 1
Всего: 1



На одну форму или экшен ? Не уверн что это очень уж хорошо )
PM MAIL   Вверх
Pawl
Дата 23.2.2012, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(Telperion @  22.2.2012,  23:10 Найти цитируемый пост)
На одну форму или экшен ? Не уверн что это очень уж хорошо )

Именно на одну форму. А экшена у меня в struts-config'e прописано 2, но фактически работает с ними только 1 класс. По-моему, ниче-так получилось - коротко и ясно! smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0973 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.