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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальные переменные в контроллере 
:(
    Опции темы
DissDoc
Дата 29.4.2013, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет. Есть контроллер
Код

@Controller
@RequestMapping("/search")
public class SearchController {

   private int limit = 0; 

   @RequestMapping(value = "/")
    public void init(@RequestParam("limit") int limit) {
        this.limit = limit;
    }

    @RequestMapping(value = "/result") 
    public int result() {
        return result;
    }

}


Понятное дело, что такой код не сработает (знаю из теории сервлетов). Но как мне работать с такой переменной глобальной и чтобы в сессии для конкретного пользователя своя переменная была?

PM MAIL WWW   Вверх
Farmazon
Дата 29.4.2013, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



Скоп сессии слышал?... Можно как ModelAttribute запихивать, так и обычные бины...


http://static.springsource.org/spring/docs...-global-session вот пример 2-го подхода, пример первого можно найти в доках про MVC



--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
DissDoc
Дата 29.4.2013, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ок. Думал есть еще какие варианты. Делал через @SessionAttributes
Но не срабатывает. Сейчас буду снова все перепроверять, почему не работает
PM MAIL WWW   Вверх
DissDoc
Дата 29.4.2013, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я не могу сохранить свой объект в сессии. Как быть?
PM MAIL WWW   Вверх
Farmazon
Дата 29.4.2013, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



код давай(зарегайся на github или bitbucket)


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
DissDoc
Дата 30.4.2013, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кода очень много. Я тут выкладываю саму проблему с комментариями.
Давайте с самого начала проблему. Уберу все Scope, чтобы не засорять код. И обращу внимание на саму проблему. В идеале что есть и чего хочу.
Вначале, сервис. Из-за чего все началось
Код

@Service("queryService")
public class QueryServiceImpl implements QueryService {
    
     // Некрасивое неработающее решение
     private Query query;

    @Override
    public void compileQuery(String... args) {
         query = new Query();
         // Здесь анализирую все параметры и собираю запрос
         query = <compile_query>;
    }

    @Override
    public List<Person> pageable(int page) {
         query.getPage(page);
    }
}

Далее сам контроллер
Код

@RequestMapping("/search")
@Controller
public class SearchController {
     @Autowired 
     private QueryService queryService;

     @PreAuthorize("permitAll")
     @RequestMapping(value = "/photos", method = RequestMethod.GET)
     public @ResponseBody String init(@RequestParam("field") String field) {
          // Парсим field, получаем аргументы
          queryService.compileQuery(argsFromField);
          // Тут формируем строку
          return "Ok!";
     }

     @PreAuthorize("permitAll")
     @RequestMapping(value = "/photos/result", method = RequestMethod.GET) 
     public @Response List<Person> result(@RequestParam("page") int page) {
          // Тут QUERY равно NULL, поскольку новый объект.
          return queryService.pageable(page);
     }
}

И вот тут проблема. Как мне в сервисе сохранить мою переменную query
PM MAIL WWW   Вверх
Pawl
Дата 11.5.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуйте явно положить объект Query в сессию:
Код

session.setAttribute("query", query);

Тогда получать его можно при помощи аннотации
Код

@SessionAttributes("query")



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


Опытный
**


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

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



Да, я так и делаю сейчас.
Но мне казалось, что это некрасивое решение.
Но раз так считается нормальным, я так и оставлю  smile 
PM MAIL WWW   Вверх
Pawl
Дата 12.5.2013, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На самом деле можно ограничиться только аннотациями. Приложу как пример сильно урезанное для наглядности приложение.
Обратите внимание на строчку 
Код

@SessionAttributes("loginForm")
 в классах LoginController и SuccessController. в первом случае она помещает объект - форму с именем пользователя - в сессию, а во втором - извлекает эту форму из сессии, чтобы отобразить имя пользователя на странице hello.jsp.
Попробуйте закомментировать эту строчку, посмотрите, что получится smile . 

Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  sessionScope.zip 6,81 Kb


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


Разработчик
**


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

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



можно и реквест дёрнуть... 

в объектах реквест-скопа можно:
Код

private @Autowired HttpServletRequest request;


Потом  пропишешь бину  proxyMode = TARGET_CLASS и инъектить его можно хоть где... а там уж и сессии и переменные запроса и параметры...


Это сообщение отредактировал(а) Farmazon - 21.5.2013, 06:51


--------------------
Таково моё общее мнение.
PM MAIL 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.0753 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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