Не могли бы вы помочь мне написать аналог этого кода в стиле spring mvc?
session.setAttribute("name","value");
А как добавить @ModelAttribute
в сессию аннотированный аннотацией элемент и потом получить к нему доступ?
источник
Не могли бы вы помочь мне написать аналог этого кода в стиле spring mvc?
session.setAttribute("name","value");
А как добавить @ModelAttribute
в сессию аннотированный аннотацией элемент и потом получить к нему доступ?
Если вы хотите удалять объект после каждого ответа, вам не нужен сеанс,
Если вы хотите сохранить объект во время сеанса пользователя, есть несколько способов:
напрямую добавить один атрибут в сеанс:
@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: в spring -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 user
5. передать 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}"/>
в Тимелеафе:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
User
bean-компонента будет работать только в том случае, если вы вызываете bean-компонент в классе, который также имеетsession
область видимости, в противном случае, если сеанс не существует, он выдает исключение, поскольку не будет активного сеанса в контексте @runtime, когда мы внедряемuser
bean-компонент в другой класс !!Использовать
@SessionAttributes
См. Документы: Использование @SessionAttributes для хранения атрибутов модели в сеансе HTTP между запросами
« Понимание модели Spring MVC и атрибутов сеанса » также дает очень хороший обзор сеансов Spring MVC и объясняет, как / когда
@ModelAttribute
они передаются в сеанс (если контроллер@SessionAttributes
аннотирован).В этой статье также объясняется, что лучше использовать
@SessionAttributes
в модели вместо того, чтобы устанавливать атрибуты непосредственно в HttpSession, потому что это помогает Spring MVC быть независимым от просмотра.источник
SessionAttribute
аннотация является наиболее простой и понятной вместо получения сеанса из объекта запроса и установки атрибута. Любой объект может быть добавлен в модель в контроллере, и он будет сохранен в сеансе, если его имя совпадает с аргументом в@SessionAttributes
аннотации. Ниже, например,personObj
будет доступно в сеансе.источник
В приведенном ниже аннотированном коде "value" будет установлено "name".
Чтобы получить доступ к тому же используется JSP
${sessionScope.name}
.Для
@ModelAttribute
просмотра этой ссылкиисточник
Разве это не самый простой и короткий путь? Я знал это и просто протестировал - здесь отлично работает:
ps Я пришел сюда в поисках ответа « Как использовать атрибуты сеанса в Spring-mvc », но прочитал так много, не увидев наиболее очевидного из того, что я написал в своем коде. Я не видел этого, поэтому подумал, что это неправильно, но нет, это не так. Итак, давайте поделимся этими знаниями и предложим самый простой ответ на главный вопрос.
источник
Попробуй это...
источник
Когда я пытаюсь войти в систему (что является модальной загрузкой), я использовал аннотацию @sessionattributes. Но проблема заключалась в том, что когда представление является перенаправленным ("redirect: / home"), значения, которые я ввел для сеанса, отображаются в URL-адресе. Некоторые источники в Интернете предлагают следовать http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting Но вместо этого я использовал HttpSession. Этот сеанс будет там, пока вы не закроете браузеры. Вот пример кода
Вы не меняете конкретную вещь на стороне просмотра.
После входа в систему добавьте указанные выше коды в любое место на своем веб-сайте. Если сеанс настроен правильно, вы увидите там значения. Убедитесь, что вы правильно добавили теги jstl и выражения El- (вот ссылка для установки тегов jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project- правильно / )
источник
Использование Этот метод очень прост и удобен в использовании
в jsp один раз использовать, затем удалить
источник
В Spring 4 Web MVC. Вы можете использовать
@SessionAttribute
метод@SessionAttributes
на уровне контроллераисточник