Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Глобальные переменные в контроллере


Автор: DissDoc 29.4.2013, 18:17
Всем привет. Есть контроллер
Код

@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;
    }

}


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

Автор: Farmazon 29.4.2013, 19:41
Скоп сессии слышал?... Можно как ModelAttribute запихивать, так и обычные бины...


http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-global-session вот пример 2-го подхода, пример первого можно найти в доках про MVC

Автор: DissDoc 29.4.2013, 19:53
Ок. Думал есть еще какие варианты. Делал через @SessionAttributes
Но не срабатывает. Сейчас буду снова все перепроверять, почему не работает

Автор: DissDoc 29.4.2013, 20:47
Я не могу сохранить свой объект в сессии. Как быть?

Автор: Farmazon 29.4.2013, 22:10
код давай(зарегайся на github или bitbucket)

Автор: DissDoc 30.4.2013, 10:59
Кода очень много. Я тут выкладываю саму проблему с комментариями.
Давайте с самого начала проблему. Уберу все 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

Автор: Pawl 11.5.2013, 15:51
попробуйте явно положить объект Query в сессию:
Код

session.setAttribute("query", query);

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

@SessionAttributes("query")

Автор: DissDoc 12.5.2013, 17:50
Да, я так и делаю сейчас.
Но мне казалось, что это некрасивое решение.
Но раз так считается нормальным, я так и оставлю  smile 

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

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

Автор: Farmazon 20.5.2013, 23:55
можно и реквест дёрнуть... 

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

private @Autowired HttpServletRequest request;


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)