Не могли бы вы помочь мне написать 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.Pass HttpSession для метода:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6.MakeAttribute в сеансе по @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) имеет беспорядочный подход, это не хорошо для unit test.
Для доступа к сеансу jsp
<%=session.getAttribute("ShoppingCart.prop")%>
в Jstl:
<c:out value="${sessionScope.ShoppingCart.prop}"/>
в тимелеафе:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
Используйте @SessionAttributes
См. документы: Использование атрибутов @SessionAttributes для хранения атрибутов модели в сеансе HTTP между запросами
"Понимание Spring MVC Model And Session Attributes" также дает очень хороший обзор Spring сеансов MVC и объясняет, как/когда @ModelAttribute
передаются в сеанс (если контроллер @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;
}
}
В приведенном ниже аннотированном коде значение "значение" будет "name"
@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
см. ссылку
Когда я пытаюсь выполнить мой логин (который является модально загрузочным модулем), я использовал аннотацию @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-выражения (вот ссылка на установку тегов jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-correctly/)
Не проще ли это и кратчайший? Я знал это и просто проверял его - работа здесь идеальна:
@GetMapping
public String hello(HttpSession session) {
session.setAttribute("name","value");
return "hello";
}
p.s. Я пришел сюда, чтобы найти ответ " Как использовать атрибуты сеанса в Spring -mvc", но читайте так много, не видя наиболее очевидного, что я написал в своем коде. Я этого не видел, поэтому я подумал, что это неправильно, но это не так. Поэтому давайте поделиться этими знаниями с самым простым решением для основного вопроса.
hi dear try this...
@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();
}
}
}