你能帮我写这段代码的spring mvc风格模拟吗?
session.setAttribute("name","value");
以及如何将一个由@ModelAttribute
注释注释的元素添加到会话中,然后访问它?
你能帮我写这段代码的spring mvc风格模拟吗?
session.setAttribute("name","value");
以及如何将一个由@ModelAttribute
注释注释的元素添加到会话中,然后访问它?
如果您想在不需要会话的每个响应后删除对象,
如果你想在用户会话期间保留对象,有一些方法:
直接给session加一个属性:
@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.通过@SessionAttributes("ShoppingCart")在会话中创建ModelAttribute:
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>
采用@SessionAttributes
请参阅文档:使用 @SessionAttributes 在请求之间的 HTTP 会话中存储模型属性
“了解 Spring MVC 模型和会话属性”还很好地概述了 Spring 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 中使用 Session 属性”的答案,但是读了这么多,却没有看到我在代码中写的最明显的内容。我没有看到它,所以我认为它是错误的,但不,它不是。因此,让我们通过主要问题的最简单解决方案来分享这些知识。
试试这个...
@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();
}
}
}
在 Spring 4 Web MVC 中。您可以在控制器级别@SessionAttribute
的方法中使用@SessionAttributes
@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {
GetMapping("/showOrder")
public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
// method body
}
当我尝试登录时(这是一个引导模式),我使用了 @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"/>