9 ответов:
если вы хотите удалить объект после каждого ответа не нужно сеанса,
если вы хотите сохранить объект в сессии пользователя , Он имеет несколько способов:
непосредственно добавьте один атрибут в сеанс:
@RequestMapping(method = RequestMethod.GET) public String testMestod(HttpServletRequest request){ ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value); return "testJsp"; }и вы можете получить его для контроллера следующим образом:
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");сделайте свой сеанс контроллера областью
@Controller @Scope("session")область действия объектов, например у вас есть пользователь объект, который хочет быть в сессии каждый раз:
@Component @Scope("session") public class User { String user; /* setter getter*/ }затем введите класс В каждый контроллер, который вы хотите
@Autowired private User userчто держать класс на сессии.
AOP прокси инъекции : весной-xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <bean id="user" class="com.User" scope="session"> <aop:scoped-proxy/> </bean> </beans>затем введите класс В каждый контроллер, который вы хотите
@Autowired private User user5.Передайте HttpSession методу:
String index(HttpSession session) { session.setAttribute("mySessionAttribute", "someValue"); return "index"; }6.Сделать ModelAttribute в сеансе с помощью @SessionAttributes ("ShoppingCart"):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) { //Spring V4 //you can modify session status by sessionStatus.setComplete(); }или вы можете добавить модель ко всему классу контроллера такой
@Controller @SessionAttributes("ShoppingCart") @RequestMapping("/req") public class MYController { @ModelAttribute("ShoppingCart") public Visitor getShopCart (....) { return new ShoppingCart(....); //get From DB Or Session } }каждый из них имеет преимущества и недостатки:
@session может использовать больше памяти в облачных системах он копирует сеанс на все узлы, а прямой метод (1 и 5) имеет беспорядочный подход, это не хорошо для модульного теста.
для доступа к сеансу jsp
<%=session.getAttribute("ShoppingCart.prop")%>в Jstl:
<c:out value="${sessionScope.ShoppingCart.prop}"/>in Thymeleaf:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
использовать
@SessionAttributesпосмотреть документы: использование @ SessionAttributes для хранения атрибутов модели в сеансе HTTP между запросами
"Понимание модели Spring MVC и атрибутов сеанса " также дает очень хороший обзор весенних сессий MVC и объясняет, как / когда
@ModelAttributes переносятся в сеанс (если контроллер@SessionAttributesаннотированный).эта статья также объясняет, что лучше использовать
@SessionAttributesна модель вместо установки атрибутов непосредственно на HttpSession, потому что это помогает Spring MVC быть агностиком представления.
SessionAttributeаннотация является самым простым и прямым вместо получения сеанса от объекта запроса и атрибута настройки. любой объект может быть добавлен в модель в контроллере, и он будет сохранен в сеансе, если его имя совпадает с аргументом в@SessionAttributesПримечание. В ниже, например,personObjбудет доступен в сессии.@Controller @SessionAttributes("personObj") public class PersonController { @RequestMapping(value="/person-form") public ModelAndView personPage() { return new ModelAndView("person-page", "person-entity", new Person()); } @RequestMapping(value="/process-person") public ModelAndView processPerson(@ModelAttribute Person person) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("person-result-page"); modelAndView.addObject("pers", person); modelAndView.addObject("personObj", person); return modelAndView; } }
ниже аннотированный код будет установить "значение "в"имя"
@RequestMapping("/testing") @Controller public class TestController { @RequestMapping(method = RequestMethod.GET) public String testMestod(HttpServletRequest request){ request.getSession().setAttribute("name", "value"); return "testJsp"; } }чтобы получить доступ к тому же в JSP использовать
${sessionScope.name}.на
@ModelAttributeпосмотреть этот ссылке
Не проще ли и короткий в ту сторону? Я знал это и просто проверил его-работает отлично здесь:
@GetMapping public String hello(HttpSession session) { session.setAttribute("name","value"); return "hello"; }p.s. Я пришел сюда в поисках ответа на "Как использовать атрибуты сеанса в Spring-mvc", но прочитал так много, не видя самого очевидного, что я написал в своем коде. Я не видел его, поэтому подумал, что это неправильно, но нет, это не так. Так что давайте поделимся этим знанием с самым простым решением для главного вопрос.
попробуйте это...
@Controller @RequestMapping("/owners/{ownerId}/pets/{petId}/edit") @SessionAttributes("pet") public class EditPetForm { @ModelAttribute("types") public Collection<PetType> populatePetTypes() { return this.clinic.getPetTypes(); } @RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { new PetValidator().validate(pet, result); if (result.hasErrors()) { return "petForm"; }else { this.clinic.storePet(pet); status.setComplete(); return "redirect:owner.do?ownerId=" + pet.getOwner().getId(); } } }
когда я пытаюсь войти в систему (которая является модальной загрузкой), я использовал аннотацию @sessionattributes. Но проблема была, когда представление является перенаправлением ("redirect:/home"), значения, которые я ввел в сеанс, отображаются в url. Некоторые интернет-источники предлагают следовать http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting но вместо этого я использовал HttpSession. Эта сессия будет там до закрытия браузера. Вот пример кода
@RequestMapping(value = "/login") @ResponseBody public BooleanResponse login(HttpSession session,HttpServletRequest request){ //HttpServletRequest used to take data to the controller String username = request.getParameter("username"); String password = request.getParameter("password"); //Here you set your values to the session session.setAttribute("username", username); session.setAttribute("email", email); //your code goes here }вы не меняете конкретную вещь на стороне просмотра.
<c:out value="${username}"></c:out> <c:out value="${email}"></c:out>после входа добавьте вышеуказанные коды в любое место на вашем веб-сайте. Если сеанс установлен правильно, вы увидите значения там. Убедитесь, что вы правильно добавили теги jstl и El-выражения (вот ссылка для установки тегов jstlhttps://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-correctly/)
используйте этот метод, очень простой простой в использовании
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest(); request.getSession().setAttribute("errorMsg", "your massage");в jsp один раз использовать, а затем удалить
<c:remove var="errorMsg" scope="session"/>
весной 4 Web MVC. Вы можете использовать
@SessionAttributeв методе с@SessionAttributesна уровне контроллера@Controller @SessionAttributes("SessionKey") public class OrderController extends BaseController { GetMapping("/showOrder") public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) { // method body }
Comments