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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSP — с чего начать? 
V
    Опции темы
diablero
Дата 6.8.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Немного переделал и перезалил. Пока шаблоны будут в таком стиле.

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

Еще несколько вопросов:
1. ты уже говорил о вариантах передачи css и прочих ресурсов, так как мы будем делать?
2. знаешь ли ты бесплатный хостинг, чтобы туда влез наш проект?
3. какой ты можешь порекомендовать из платных?


Это сообщение отредактировал(а) diablero - 7.8.2007, 01:17


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
diablero
Дата 7.8.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



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

Это сообщение отредактировал(а) diablero - 8.8.2007, 19:26

Присоединённый файл ( Кол-во скачиваний: 41 )
Присоединённый файл  templates.zip 4,06 Kb


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 7.8.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Посмотрел форму регистрации. Замечания:
  • Черный текст на болотном фоне почти не видно.
  • Имя инпута для Пароль и Повторите пароль одинаковое, password.
  • Значение value для Пол одинаковое, male.
  • Календарь просто выкинь нах! Тем более такое страшный и глючный. И вообще, с точки зрения юзабилити вводить дату рождения через такой календарь крайне неудобно. Сделай лучше обычным текстовым полем и предлоим маску ввода дд/мм/гггг.

    И вообще по поводу Javascript: давай пока не будем его трогать. Штука мощная, но надо пользоваться ею с умом. А от ламерских скриптов вообще держаться подальше smile
  • Для подписей к радиокнопкам используй тэг <label for="radiobitton-id">Мужской</label>. Тогда подписи будут тыкабельными.

По вопросам:

Цитата(diablero @  6.8.2007,  06:05 Найти цитируемый пост)
1. ты уже говорил о вариантах передачи css и прочих ресурсов, так как мы будем делать?
2. знаешь ли ты бесплатный хостинг, чтобы туда влез наш проект?
3. какой ты можешь порекомендовать из платных?


Первый вопрос имеется в виду, как выдавать статику? Да обычно, дефолтным сервлетом. Просто ты сгоряча прописал у себя в web xml маппинг "/" на ControllerServlet, а надо бы ло только по расширениям '.shtml и *.do. Как только исправишь, Томкат начнет выдавать картинки и прочую статику.

Бесплатных хостингов не знаю. Сам использую платный 4java.ca.

Завтра начнем делать обработчик форм.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Stampede
Дата 8.8.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Так, ладно, давай делать обработчик форм.

Снечала предварительные замечания. Если бы мы делали мощное веб приложение с развернутой функциональностью, мы бы наваяли соответствующий фреймворк, обеспечивающий автоматическую валидацию: через рефлексию, по аннотациям, возможно с применением Javascript, и прочими штучками. Но поскольку форм у нас будет мало - пальцев одной руки хватит, чтоб посчитать - то мы всем этим заморачиваться не будем. Просто для каждой формы будет свой обработчик по типу LoginWorker, в котором и будет зашита логика валидации.

Итак, форма регистрации. Я предлагаю сделать ее с прицелом на то, чтобы впоследствии ее же можно было использовать для редактирования профиля. Но все по порядку. Примем такую схему:

УРЛ: /form/registration.shtml
Воркер: RegistrationFormWorker
Шаблон: forms/profile.vm

    | (по сабмиту)
    V

УРЛ: /submit/register.do
Воркер: RegisterWorker    --> (если ошибка, то возврат на стр. формы)

    | (если все ОК, редирект на стр. подтверждения)
    V

УРЛ: /confirmation.shtml
Воркер: ConfirmationWorker
Шаблон: confirmation.vm


RegistrationFormWorker пока будет без логики (только положи в контекст $content = "forms/profile.vm").

В RegisterWorker проверь, чтобы все обязательные поля были на месте, чтобы пароль в обоих полях был одинаковым, и чтобы юзера с таким именем в базе не было. Если что-то из этого не выполняется, футболь обратно: page.setRedirectionUrl("/form/registration.shtml").

Потом создай нового юзера, пропиши для него куки по аналогии с LoginWorker, и отсылай на страницу подтверждения.

Если есть вопросы - не стесняйся.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 9.8.2007, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Сделал, работает до того момента, как заливать юзера в базу.
Код

java.lang.IllegalStateException: Transaction not active
    org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:82)
    ru.selfexpression.ControllerServlet.service(ControllerServlet.java:68)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Код

public class RegistrationFormWorker extends AbstractWorker implements Worker {
    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        super.execute(request, response);
        page.put("content", "form/profile.vm");
        return page;
    }
}

Код

public class RegistrationWorker extends AbstractWorker implements Worker {
    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        super.execute(request, response);
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        String repassword = request.getParameter("repassword");
        Infinite infinite = Infinite.getInstance();
        UserManager manager = infinite.getUserManger();
        EntityTransaction rtx = null;
        try {
            if(manager.containsUser(userName)) throw new Exception();
            if(!password.equals(repassword)) throw new Exception();

            User user = new User();
            user.setName(userName);
            user.setPassword(password);

            EntityManager entityManager = infinite.getEntityManager();
            rtx = entityManager.getTransaction();
            rtx.begin();
            entityManager.merge(user);
            rtx.commit();

            page.setLongLivedCookie("userName", user.getName());
            page.setLongLivedCookie("password", user.getPassword());
            page.setRedirectUrl("/confirmation.shtml");
        } catch (Exception err) {
            if (rtx != null) {
                rtx.rollback();
            }
            page.setRedirectUrl("/form/registration.shtml");
        }
        return page;
    }
}

Думается плохо, продолжаю разбиратьсяsmile


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Shaggie
Дата 9.8.2007, 09:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

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



diableroStampede, один момент. В коде класса TemplateManager метод mergeTemplate из класса org.apache.velocity.app.VelocityContext вызывается таким способом:
Код

engine.mergeTemplate(templateName, context, sw);

Этот метод deprecated, и несмотря на то, что он хорошо работает под Tomcat, Jetty отчаянно рушил мне все русские слова в шаблонах, что стоило немалой головной боли. Заранее неизвестно, где выплывут новые грабли, поэтому рекомендую заменить его на более современный вариант:
Цитата(Javadoc to Velocity1.5)
public boolean mergeTemplate(String templateName, String encoding, Context context, Writer writer)

То есть:
Код

Infinite infinite = Infinite.getInstance();
engine.mergeTemplate(templateName, infinite.getConfiguration().getfileEncoding(), context, sw);



--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
diablero
Дата 9.8.2007, 13:48 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Shaggie посмотрел доки к пакету, и не увидел что метод этот deprecated.
Посмотри исходники, и с кодировками все прозрачно будет


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
diablero
Дата 9.8.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Вылетает тут:
Код

tx.begin();

Пока никак не могу понять, по отдельности работает...


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 9.8.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(diablero @  9.8.2007,  10:01 Найти цитируемый пост)
1:
    
tx.begin();

Пока никак не могу понять, по отдельности работает... 


Дак ты же пытаешься заново начать транзакцию. Ты к этому моменту уже в транзакции! Так что просто убери все что у тебя там относится к транзакции, включая commit()  и rollback(), и все будет пучком. Обо всех этих вещах уже "позабочено" в методе service().



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 9.8.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Я это понял, и чтобы загладить свою глупость хотел пост подредактировать. А ты уже ответилsmile


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 9.8.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(diablero @  9.8.2007,  12:24 Найти цитируемый пост)
Я это понял, и чтобы загладить свою глупость хотел пост подредактировать.


Не надо этого делать. На заглаженной глупости может поскользнуться кто-то другой smile


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 9.8.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Код

public class RegistrationWorker extends AbstractWorker implements Worker {
    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        super.execute(request, response);
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        String repassword = request.getParameter("repassword");
        Infinite infinite = Infinite.getInstance();
        UserManager manager = infinite.getUserManger();

        try {
            if(manager.containsUser(userName)) throw new Exception();
            if(!password.equals(repassword) || password.length()==0) throw new Exception();

            User user = new User();
            user.setName(userName);
            user.setPassword(password);
            user.setDateRegistration(new Date());
            user.setGroup("junior");
            manager.setUser(user);

            page.setLongLivedCookie("userName", user.getName());
            page.setLongLivedCookie("password", user.getPassword());
            page.setRedirectUrl("/confirmation.shtml");
        } catch (Exception err) {
            page.setRedirectUrl("/form/registration.shtml");
        }
        return page;
    }
}

Что мы сейчас имеем.
1. проеверяем что пользователя такого нет.
2. что пароли совпадают, но не проверяем сложность.

Сразу вскрылась недоработка, нам нужно создать бин group.
Я еще не нашел как прикрутить шаблон ввода к дате.

Что делаем дальше? До конца прорабатываем форму?


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 9.8.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(diablero @  9.8.2007,  12:47 Найти цитируемый пост)
Что делаем дальше? До конца прорабатываем форму? 


Нет, не надо.

Сейчас мы добавим в нашу картину вселенной вебсайта один полезный элемент. Суть вот в чем. Когда юзер ошибается во вводе данных, мы должны перенаправить его обратно на страницу формы. Но на ней уже должны быть заполнены те поля, которые он ввел ранее, плюс каким-то образом обозначено, в чем заключалась ошибка. Возникает вопрос: как это сделать?

Прежде чем предложить решение, я хотел бы напомнить, что все, абсолютно все формные данные приезжают к нам на сервер в виде текста, а если точнее, то в виде пар parameter=value. Для удобства работы с этими парами в Servlet API есть метод request.getParameter(String name) и другие. Отсюда напрашивается решение: если мы каким-то образом сохраним эти значения между обращениями к /form.registration.shtml, то сможем при рисовании формы заполнять поля теми значениями, которые поступили по сабмиту!

Вопрос: где сохранять эти данные? Дак, вестимо, в сессии!

Остается еще один вопрос: а в каком виде это делать?

Вот тут мы и подходим к тому решению, которое я хотел предложить. Мы заведем достаточно простенький класс - назовем его FormData - унаследованный для удобства от HashMap. Можно, конечно, организовать связь с мапом и через containment, но это потребует больше писанины. Класс примерно такой:

Код

public class FormData<String, String> extends HashMap {
    private String message;

    public FormData() {
    }

    public FormData(Map map) {
        super(map);
    }

    // setter and getter for message
}


В принципе можно было бы вообще брать request.getParameterMap() и сохранять все мапом, но имея специализированный класс, мы сможем впоследствии добавлять всякие удобные штучки. Например, как видно из данного примера, мы можем сразу же добавить в обработчик такой код:

Код

if (manager.containsUser(userName)) {
    formData.setMessage("User with such name already exists");
} else if (!password.equals(repassword) {
    formData.setMessage("Passwords do not match");
} else if {
// ...
}

if (formData.getMessage() == null) {
    page.setRedirectUrl(/confirmation.shtml);
} else {
    request.getSession().setAttribute("formData", formData)
    page.setRedirectionUrl(/form/registration.shtml);
}


Теперь о том, как этим классом пользоваться. Во-первых, у нас изменится код RegistrationFormWorker. Если раньше мы просто клали в контекст имя шаблона, forms/registration.vm, то теперь работы будет побольше.

Чтобы сделать код шаблона проще, мы будем всегда передавать ему данные через объект FormData (например, в переменной контекста $formData). А объект этот сначала искать в атрибутах сессии, а если отсутствует - то создавать новый.

Замечу, что при регистрации этот новый объект FormData так и будет передаваться пустым, а вот когда мы ту же самую форму задействуем для редактирования профиля юзера, то мы этот новый экземпляр FormData сначала заполним значениями из объекта User.

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



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 10.8.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Если передавать в класс  FormData request.getParameterMap(), то выскакивает такое исключение. 
Как я понял, возникает когда нет значение у ключа.
Код

java.lang.ClassCastException: [Ljava.lang.String;
    ru.selfexpression.contents.worker.RegistrationWorker.execute(RegistrationWorker.java:22)
    ru.selfexpression.ControllerServlet.service(ControllerServlet.java:50)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Поэтому сделал следующим образом:
Код

public class RegistrationWorker extends AbstractWorker implements Worker {
    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        super.execute(request, response);
        Infinite infinite = Infinite.getInstance();
        UserManager manager = infinite.getUserManger();

        FormData formData = new FormData();
        Enumeration param = request.getParameterNames();
        while(param.hasMoreElements()) {
            String key = (String)param.nextElement();
            formData.put(key, request.getParameter(key));
        }
        String userName = formData.get("userName");
        String password = formData.get("password");
        String repassword = formData.get("repassword");

        if (manager.containsUser(userName)) {
            formData.setMessage("User with such name already exists");
        } else if (!password.equals(repassword) || password.length() == 0) {
            formData.setMessage("Passwords do not match");
        }
        if (formData.getMessage()==null) {
            User user = new User();
            user.setName(userName);
            user.setPassword(password);
            user.setDateRegistration(new Date());
            user.setGroup("junior");
            manager.setUser(user);

            page.setLongLivedCookie("userName", user.getName());
            page.setLongLivedCookie("password", user.getPassword());
            page.setRedirectUrl("/confirmation.shtml");
        } else {
            request.getSession().setAttribute("formData", formData);
            page.setRedirectUrl("/form/registration.shtml");
        }
        return page;
    }
}

Код

public class RegistrationFormWorker extends AbstractWorker implements Worker {
    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        super.execute(request, response);
        FormData formData = (FormData) request.getSession().getAttribute("formData");
        page.put("formData", formData);
        page.put("content", "form/profile.vm");
        return page;
    }
}

Код

<p class="redtext">$!formData.getMessage()</p>
<table border="0" cellspacing="1" cellpadding="0">
    <tr>
        <td>
            <table border="0" width="100%" class="white">
                <form action="/submit/registration.do" method="post" name="register">

                                     <tr>
                    <td>*Логин:</td><td><input type="Text" name="userName"></td>
                </tr>
                              <tr>
                    <td>*Пароль:</td><td><input type="Password" name="password"></td>
                </tr>
                <tr>
                    <td>*Повторите пароль:</td><td><input type="Password" name="repassword"></td>
                </tr>
                <tr>
                 <td rowspan="2">Пол:</td>
                 <td><input type="radio" name="gender" value="male" id="rbmale" checked><label for="rbmale">мужской</label></td>
                </tr>
                <tr>
                 <td><input type="radio" name="gender" value="female" id="rbfemale"><label for="rbfemale">женский</label></td>
                </tr>
                <tr>
                    <td>Дата рождения:</td><td><input type="Text" name="birthday" maxlength="10" value=$!formData.                                                                                                                                                                                                      get("birthday")></td>
                </tr>
                <tr>
                    <td>Город:</td><td><input type="Text" name="city" value=$!formData.get("city")></td>
                </tr>
                <tr>
                    <td>Страна:</td><td><input type="Text" name="country" value=$!formData.get("country")></td>
                </tr>
                <tr>
                    <td>Подпись:</td><td><input type="Text" name="signature" value=$!formData.get("signature")></td>
                </tr>
                <tr>
                    <td>*e-mail:</td><td><input type="Text" name="mail" value=$!formData.get("mail")></td>
                </tr>
                <tr>
                    <td>icq:</td><td><input type="Text" name="icq" value=$!formData.get("icq")></td>
                </tr>
                <tr>
                    <td>Аватар:</td><td><input type="file" name="avatar" value="Обзор"></td>
                </tr>
                 <tr>
                    <td colspan="2"><br>* - отмеченны поля обязательные к заполнению.<br><br></td>
                </tr>
                                    <tr>
                    <td align="center" colspan="2"><input type="Submit" value="Зарегестрировать"></td>
                </tr>
                <tr>
                    <td><br></td>
                </tr>
                
                </form>
            </table>
        </td>
    </tr>
</table>

Соответсвующим образом изменю LoginWorker'ы


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 10.8.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(diablero @  10.8.2007,  10:21 Найти цитируемый пост)

        FormData formData = new FormData();
        Enumeration param = request.getParameterNames();
        while(param.hasMoreElements()) {
            String key = (String)param.nextElement();
            formData.put(key, request.getParameter(key));
        }


Два замечания. Первое: ты преждевременно заводишь и инициализируешь объект FormData. Если регистрация проходит успешно, то он нам и не понадобится вовсе. Это раз.

Второе: трюки с перебором параметров неоправданно загромождают код воркеров, тем более что это дело можно запросто инкапсулировать. Так что все-таки используй конструктор new FormData(request.getParameterMap()), а уж в конструкторе делай всякие переборы с проверками.

Далее, вот здесь:

Код

FormData formData = (FormData) request.getSession().getAttribute("formData");


добавь все-таки еще одну строчку:

Код

formData = (formData == null) new FormData() : formData;


Это обезопасит тебя от ошибок в шаблоне.

И еще парочка предложений для реализации.

1. Текст сообщений об ошибке

Сейчас мы вынужденно пишем это сообщение по-английски. А нам бы надо по нашенски. Можно, конечно, сделать по i18n-ному, через ResourceBundle  и пр. Но можно и по простому. Например, передавать в качестве мессаджа не текст сообщения, а некую текстовую константу, скажем, "DUPLICATE_NAME" или "PASSWORD_MISMATCH", а в теле шаблона анализировать и выводить соответствующую фразу по-русски.

2. Текст подтверждения

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

Предлагаю класс для этой инфы разработать самостоятельно.



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

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

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


 




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


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

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