Чи можете ви допомогти мені написати аналоговий код цього весняного стилю mvc?
session.setAttribute("name","value");
І як додати @ModelAttribute
до сеансу елемент, який позначається анотацією, а потім отримати доступ до нього?
Чи можете ви допомогти мені написати аналоговий код цього весняного стилю 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: навесні -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.Зробіть 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 у класі tha, також встановлено session
масштаб, інакше якщо не існує сеансу, то це викине виняток, оскільки не було б жодного активного сеансу в контексті @runtime, коли ми вводимо user
bean i інший клас !!
Використовуйте @SessionAttributes
Див. Документи: Використання @SessionAttributes для зберігання атрибутів моделі в сеансі HTTP між запитами
" Розуміння весняних моделей MVC і атрибутів сеансу " також дає дуже хороший огляд весняних сеансів MVC та пояснює, як / коли @ModelAttribute
s передаються в сеанс (якщо контролер @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";
}
ps Я прийшов сюди, шукаючи відповідь " Як використовувати атрибути сесії у 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- (тут посилання для встановлення тегів jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project- правильно / )
Використовувати Цей метод дуже простий у використанні
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();
request.getSession().setAttribute("errorMsg", "your massage");
в jsp один раз використовуйте потім видаліть
<c:remove var="errorMsg" scope="session"/>
Навесні 4 Веб MVC. Ви можете використовувати @SessionAttribute
в методі з @SessionAttributes
на рівні контролера
@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {
GetMapping("/showOrder")
public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
// method body
}