Одесса: °С (вода °С)
Киев: 2°С

Тема: Java. Spring Web MVC. Вопросик.

Ответить в теме
Показано с 1 по 7 из 7
  1. Вверх #1
    Постоялец форума Аватар для Peroxide
    Пол
    Мужской
    Адрес
    Город твой - двуликий зверь. Для тебя он днём откроет дверь, а вот в полночь..
    Возраст
    31
    Сообщений
    2,937
    Репутация
    441

    По умолчанию Java. Spring Web MVC. Вопросик.

    Изучаю данный фреймворк. Решил немного переделать переделать исходный туториал. Я понимаю, что решение таких задач такими средствами, это забивание гвоздей даже не микроскопом, а, наверное, тепловозом, но уж очень хочется этим тепловозом поуправлять.
    Изначально он (туториал) принимал строку в поле ввода на одной странице и при вводе отображал другую страницу, где эта строка выводилась. Модификация заключается в том, что я просто добавил в следующую строку поле ввода, чтобы иметь возможность это действие повторять неограниченное количество раз.
    Страничка JSP, в которой производится первичный ввод строки выглядит так:
    Код:
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Enter Post</title>
        </head>
        <body>
            <h1>Enter Your Post</h1>
            
            <spring:nestedPath path="name">
        <form action="" method="post">
            Name:
            <spring:bind path="value">
                <input type="text" name="${status.expression}" value="${status.value}">
            </spring:bind>
            <input type="submit" value="OK">
        </form>
    </spring:nestedPath>
        </body>
    </html>
    Страничка, на которой строка отображается и, по идее, должна вводиться новая, выглядит так:
    Код:
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>NewPost:</title>
        </head>
        <body>
            <h5>${helloMessage} (Reply)</h5>
                  <spring:nestedPath path="name">
        <form action="" method="post">
            Name:
            <spring:bind path="value">
                <input type="text" name="${status.expression}" value="${status.value}">
            </spring:bind>
            <input type="submit" value="OK">
        </form>
    </spring:nestedPath>
        </body>
    </html>
    Значение строки присваивается, хранится и извлекается из класса с такой логикой:
    Код:
    package controller;
    
    /**
     *
     * @author stas
     */
    public class Name {
        private String value;
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }
    Класс контроллера, создающего образ выводимой строки, выглядит вот так:
    Код:
    package controller;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.SimpleFormController;
    import service.HelloService;
    
    /** 
     *
     * @author stas
     */
    public class HelloController extends SimpleFormController {
        private HelloService helloService;
         public void setHelloService(HelloService helloService) {
        this.helloService = helloService;
    }
        public HelloController() {
            //Initialize controller properties here or 
            //in the Web Application Context
    
            setCommandClass(Name.class);
            setCommandName("name");
            setSuccessView("newView");
            setFormView("nameView");
        }
        
    
        
        //Use onSubmit instead of doSubmitAction 
        //when you need access to the Request, Response, or BindException objects
        
        @Override
    protected ModelAndView onSubmit(Object command) throws Exception {
        Name name = (Name)command;
        ModelAndView mv = new ModelAndView(getSuccessView());
        mv.addObject("helloMessage", helloService.sayHello(name.getValue()));
    
        return mv;
    }
         
    }
    И зарегистрирован в диспетчере сервлета он следующим образом:
    Код:
    <bean class="controller.HelloController" p:helloService-ref="helloService"/>

    Служба, формирующая строку вывода, имеет такой вид:
    Код:
    package service;
    
    /**
     *
     * @author stas
     */
    public class HelloService {
            public String sayHello(String name) {
            return "Peroxide: " + name;
        }
    }
    И зарегистрирована она в applicationContext.xml таким образом:
    Код:
    <bean name="helloService" class="service.HelloService" />
    И, наконец, web.xml имеет вот такой вид:
    Код HTML:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>2</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>*.htm</url-pattern>
        </servlet-mapping>
        <session-config>
            <session-timeout>
                30
            </session-timeout>
        </session-config>
        <welcome-file-list>
            <welcome-file>redirect.jsp</welcome-file>
        </welcome-file-list>
    </web-app>

    Проблема заключается в том, что при добавлении
    Код:
     <spring:bind path="value">
                <input type="text" name="${status.expression}" value="${status.value}">
            </spring:bind>
            <input type="submit" value="OK">
        </form>
    </spring:nestedPath>
    к ответной странице, поле ввода и кнопочка нормально отобразились. Но при вводе и нажатии твёрдо выводили null. Путём несложных манипуляций, было выяснено, что службе HelloService просто не присваивается новое значение с поля ввода ответной странички. Но со стартовой почему-то присваивается. Притом, вся разница между ними - что на ответной просто есть поле вывода, помимо всего прочего.
    Я добавил страничке вывода ссылку на библиотеки для обработки ввода новой строки
    Код HTML:
    <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
    , что не только не исправило ситуацию, но и повлекло появление HTTP Status 500
    вместо ответной странички с сообщением об ошибке:
    "javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name 'name' available as request attribute

    root cause javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name 'name' available as request attribute"
    Кто-то из понимающих в Spring может подсказать, какие настройки ответной странички я не учёл? И так ли она должна выглядеть? Спасибо.
    Что за люди? Уже и в лицо не плюнуть - в драку лезут...


  2. Вверх #2
    Не покидает форум Аватар для Fallout
    Пол
    Мужской
    Сообщений
    6,915
    Репутация
    795
    Eсли бегло, то кажется в методе onSubmit(Object command) ты забыл воткнуть command в ModelAndView назад, о чем и пишет последнее сообщение что не находит атрибута с именем 'name'.

    ps эту книгу, читал? вернее первую половину ее для ознакомления?

    pps примеры что то выглядят очень старыми

    ppps а почему Spring MVC?

  3. Вверх #3
    Постоялец форума Аватар для Peroxide
    Пол
    Мужской
    Адрес
    Город твой - двуликий зверь. Для тебя он днём откроет дверь, а вот в полночь..
    Возраст
    31
    Сообщений
    2,937
    Репутация
    441
    Цитата Сообщение от Fallout Посмотреть сообщение
    Eсли бегло, то кажется в методе onSubmit(Object command) ты забыл воткнуть command в ModelAndView назад, о чем и пишет последнее сообщение что не находит атрибута с именем 'name'.
    Можно с этого места чуть подробнее?
    Воткнуть в какое поле?
    У класса ModelAndView, если верить официальной документации, аргументы такие: ModelAndView(String viewName), а метод getSuccessView() класса SimpleFormController, находящийся у него в аргументах, как раз этот параметр возвращает в требуемом виде String.
    Присвоение, если я правильно понял код примера, происходит уже в следующей строчке:

    mv.addObject("helloMessage", helloService.sayHello(name.getValue()));

    Цитата Сообщение от Fallout Посмотреть сообщение
    ps эту книгу, читал? вернее первую половину ее для ознакомления?
    Не сталкивался раньше с такой книгой, спасибо.


    Цитата Сообщение от Fallout Посмотреть сообщение
    pps примеры что то выглядят очень старыми
    Стандартный тутор с официального сайта нэтбинс, немного доработанный мной. В исходном варианте работал идеально.

    Цитата Сообщение от Fallout Посмотреть сообщение
    ppps а почему Spring MVC?
    Ну, вроде как, основной инструмент разработки веб-приложений на Java на сегодняшний день..
    Что за люди? Уже и в лицо не плюнуть - в драку лезут...

  4. Вверх #4
    Не покидает форум Аватар для Fallout
    Пол
    Мужской
    Сообщений
    6,915
    Репутация
    795
    Цитата Сообщение от Peroxide Посмотреть сообщение
    Можно с этого места чуть подробнее?
    Воткнуть в какое поле?
    У класса ModelAndView, если верить официальной документации, аргументы такие: ModelAndView(String viewName), а метод getSuccessView() класса SimpleFormController, находящийся у него в аргументах, как раз этот параметр возвращает в требуемом виде String.
    Присвоение, если я правильно понял код примера, происходит уже в следующей строчке:

    mv.addObject("helloMessage", helloService.sayHello(name.getValue()));


    Не сталкивался раньше с такой книгой, спасибо.



    Стандартный тутор с официального сайта нэтбинс, немного доработанный мной. В исходном варианте работал идеально.


    Ну, вроде как, основной инструмент разработки веб-приложений на Java на сегодняшний день..
    mv.addObject("name", command);

    Туториал похоже устарел, принципе сейчас все почти тоже но немного по другому

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

  5. Вверх #5
    Постоялец форума Аватар для Peroxide
    Пол
    Мужской
    Адрес
    Город твой - двуликий зверь. Для тебя он днём откроет дверь, а вот в полночь..
    Возраст
    31
    Сообщений
    2,937
    Репутация
    441
    Цитата Сообщение от Fallout Посмотреть сообщение
    mv.addObject("name", command);
    Под command здесь понимается submit. В результате, выводятся не данные, а команда [email protected]
    Задачка стоит: передать содержимое поля ввода классу Name под видом строковой переменной value, а потом сослаться на метод этого класса, который эту переменную возвращает. Чтобы использовать её уже в качестве аргумента для метода sayHello службы helloService (вывести-то нужно не просто ту строку, которую мы ввели, но ещё и авторство её указать, что метод sayHello и делает).
    Проблемка в том, что с одной страницы операция успешно осуществляется, а с другой - нет. Хотя, они почти и идентичны.

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

  6. Вверх #6
    Не покидает форум Аватар для Fallout
    Пол
    Мужской
    Сообщений
    6,915
    Репутация
    795
    Цитата Сообщение от Peroxide Посмотреть сообщение
    Под command здесь понимается submit. В результате, выводятся не данные, а команда [email protected]
    Задачка стоит: передать содержимое поля ввода классу Name под видом строковой переменной value, а потом сослаться на метод этого класса, который эту переменную возвращает. Чтобы использовать её уже в качестве аргумента для метода sayHello службы helloService (вывести-то нужно не просто ту строку, которую мы ввели, но ещё и авторство её указать, что метод sayHello и делает).
    Проблемка в том, что с одной страницы операция успешно осуществляется, а с другой - нет. Хотя, они почти и идентичны.
    Под command здесь понимается command, тот бин который спринг маппит на форму и обратно. Возможно при GET и POST спринг немного по разному подготавливает данные для JSP. Это можно посмотреть в исходниках спринга той версии которую ты используешь. А вообще конечно не стоит использовать старые подходы оставленные для совместимости наверное, и использовать современное.

    это приблизительно как то так

    @Controller
    public class MyController {

    @RequestMapping(value = "/my.do", method = RequestMethod.GET)
    public ModelAndView blablabla() {
    ModelAndView mv = new ModelAndView("nameView");
    mv.addObject("name", new Name());
    return mv;
    }

    @RequestMapping(value = "/my.do", method = RequestMethod.POST)
    public ModelAndView blablabla2(@ModelAttribute("name") Name name) {
    ModelAndView mv = new ModelAndView("nameView");
    mv.addObject("name", name);
    return mv;
    }


    И в JSP

    <form:form id="myForm" commandName="name" action="my.do" method="POST">
    <form:input path="value"/>
    </form:form>
    Цитата Сообщение от Peroxide Посмотреть сообщение
    Я хочу, вначале, этот фреймворк освоить.
    Как я понял ты не знаешь английский хорошо, поэтому используешь русскоязычные переводы древних туториалов. Лучше освоить английский вперед.

  7. Вверх #7
    Постоялец форума Аватар для Peroxide
    Пол
    Мужской
    Адрес
    Город твой - двуликий зверь. Для тебя он днём откроет дверь, а вот в полночь..
    Возраст
    31
    Сообщений
    2,937
    Репутация
    441
    Цитата Сообщение от Fallout Посмотреть сообщение
    Под command здесь понимается command, тот бин который спринг маппит на форму и обратно. Возможно при GET и POST спринг немного по разному подготавливает данные для JSP. Это можно посмотреть в исходниках спринга той версии которую ты используешь. А вообще конечно не стоит использовать старые подходы оставленные для совместимости наверное, и использовать современное.

    это приблизительно как то так





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


Ответить в теме

Похожие темы

  1. Требуется Web-программист (PHP, JAVA)
    от LjYurchik в разделе Предлагаю работу
    Ответов: 4
    Последнее сообщение: 04.07.2012, 22:46
  2. Ответов: 0
    Последнее сообщение: 06.06.2012, 13:16
  3. Web Camera
    от Ruslan.V. в разделе Железо
    Ответов: 13
    Последнее сообщение: 02.08.2005, 00:47
  4. DVDIdle + Dr.Web
    от Макс в разделе Программное обеспечение
    Ответов: 0
    Последнее сообщение: 13.04.2004, 23:04
  5. web-сервер
    от iFog в разделе Программирование
    Ответов: 12
    Последнее сообщение: 02.03.2004, 13:10

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения