在本文中,我们将详细介绍会话范围的bean作为SpringMVCController的类属性的各个方面,并为您提供关于会话bean是什么的相关解答,同时,我们也将为您带来关于Bean的会话范围在Spr
在本文中,我们将详细介绍会话范围的bean作为Spring MVC Controller的类属性的各个方面,并为您提供关于会话bean是什么的相关解答,同时,我们也将为您带来关于Bean的会话范围在Spring MVC应用程序中如何工作?、java – Spring MVC中的@Controller注释和Controller类、JAVA 框架 springmvc controller的返回值、java-会话范围的bean作为Spring MVC Controller的类属性的有用知识。
本文目录一览:- 会话范围的bean作为Spring MVC Controller的类属性(会话bean是什么)
- Bean的会话范围在Spring MVC应用程序中如何工作?
- java – Spring MVC中的@Controller注释和Controller类
- JAVA 框架 springmvc controller的返回值
- java-会话范围的bean作为Spring MVC Controller的类属性
会话范围的bean作为Spring MVC Controller的类属性(会话bean是什么)
我有一个User类:
@Component@Scope("session")public class User { private String username;}
和一个控制器类:
@Controllerpublic class UserManager { @Autowired private User user; @ModelAttribute("user") private User createUser() { return user; } @RequestMapping(value = "/user") public String getUser(HttpServletRequest request) { Random r = new Random(); user.setUsername(new Double(r.nextDouble()).toString()); request.getSession().invalidate(); request.getSession(true); return "user"; }}
我使会话无效,以便下次我进入/
users时,我得到另一个用户。由于用户的会话范围,我期望使用其他用户,但是我得到的是同一用户。我在调试模式下进行了检查,它与内存中的对象ID是相同的。我的bean声明为:
<bean id="user"> <aop:scoped-proxy/> </bean>
我是春季新手,所以我显然做错了什么。我希望每个会话有一个User实例。怎么样?
答案1
小编典典这是预期的行为。当标记带有<aop:scoped-proxy/>
代理的bean时,将为其创建代理。如果该bean有接口,则将创建Java动态代理,否则将创建基于CGLIB的代理-
在您的情况下,由于User类没有父类/接口,将为您创建基于CGLIB的代理。
现在要注意的是,此代理将注入您的所有类中,这就是为什么您只看到一个(本质上是该代理的)实例的原因,但是该代理知道如何管理范围-
只要您继续通过类的方法,因此,在这种情况下,如果您通过getter和setter调用来获取User类的属性,则应该看到反映了该会话的值。
Bean的会话范围在Spring MVC应用程序中如何工作?
我在Spring MVC中还很陌生,我对bean 的 会话范围 有疑问。
进入一个项目,我有一个Cart
bean,这个:
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Cart {
private Map<Product,Integer> contents = new HashMap<>();
public Map<Product,Integer> getContents() {
return contents;
}
public Set<Product> getProducts() {
return contents.keySet();
}
public void addProduct(Product product,int count) {
if (contents.containsKey(product)) {
contents.put(product,contents.get(product) + count);
}
else {
contents.put(product,count);
}
}
public void removeProduct(Product product) {
contents.remove(product);
}
public void clearCart() {
contents.clear();
}
@Override
public String toString() {
return contents.toString();
}
public double getTotalCost() {
double totalCost = 0;
for (Product product : contents.keySet()) {
totalCost += product.getPrice();
}
return totalCost;
}
}
因此,容器会自动将该bean识别为组件,并通过以下方式将其设置为 会话bean :
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode = ScopedProxyMode.TARGET_CLASS)
因此,据我了解,这意味着它将为每个用户会话自动创建一个bean。
在我的示例中,Cart
该类表示购物车,已登录的用户将想要购买的物品放入其中。这是否意味着Cart
每个登录的用户部分都存在一个bean
HttpSession
?因此,此bean进入了会话,用户可以在会话中添加或删除项目。这种解释正确吗?或者我缺少什么?
另一个疑问与proxyMode = ScopedProxyMode.TARGET_CLASS
属性有关。这到底是什么意思呢?为什么将它应用于此bean?
java – Spring MVC中的@Controller注释和Controller类
在使用注释时,我很难知道我们要使用这个@Controller获取哪种类型的Controller类
参考
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/Controller.html
这些是实现Controller类
AbstractController AbstractUrlViewController MultiActionController ParameterizableViewController ServletForwardingController ServletWrappingController UrlFilenameViewController AbstractWizardFormController SimpleFormController
但是当我们在Spring MVC中使用@Controller注释时
程序如何知道我们的@Controller注释正在实现
任何这些控制器,请有人解释我
解决方法
如今,当我们有注释时,模型已经改变了.我们可以为每个控制器类处理多个请求类型.因为在单个@Controller注释类中,我们可以处理许多请求映射.
Controller注释是一个专门的@Component,它告诉Spring它内部会找到@RequestMapping处理程序.这些处理程序可用于返回Json,HTML或上传文件.
现在,与同一模块连接的逻辑可以放在单个控制器类下,您可以更灵活地实现所需的功能.其次,@ Controller使我们能够显着减少代码量.
JAVA 框架 springmvc controller的返回值
一、返回值:ModleView对象。
使用modelAndView.setViewName设置返回的页面。使用modelAndView.addObject设置返回的数据。
1 @RequestMapping("/edit")
2 public ModelAndView editTable(HttpServletRequest request){
3 ModelAndView modelAndView=new ModelAndView();
4 String id=request.getParameter("id");
5 goods goodser= this.goodsService.findByIdSer(Integer.parseInt(id));
6 modelAndView.setViewName("edit");
7 modelAndView.addObject("goods",goodser);
8 return modelAndView;
9 }
二、返回值:字符串
字符串为页面名称除去扩展名
1 @RequestMapping("/edit")
2 public String editTable(HttpServletRequest request,Model model){
3 String id=request.getParameter("id");
4 goods goodser= this.goodsService.findByIdSer(Integer.parseInt(id));
5 model.addAttribute("goods",goodser);
6 return "edit";
7 }
三、返回值:void
通过参数httpservletrequest来确定设置返回值,通过request 设置值和转发。
1 @RequestMapping("/edit")
2 public void editTable(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
3 String id=request.getParameter("id");
4 goods goodser= this.goodsService.findByIdSer(Integer.parseInt(id));
5 request.setAttribute("gooods",goodser);
6 request.getRequestDispatcher("WEB-INF/jsp/success.jsp").forward(request,response);
7 }
四:转发
通过return forward:*.action 方式进行转发,通过Model设置数据。绝对路径是带有/
1 @RequestMapping("/update")
2 public String upddateById(goods goods,Model model){
3 this.goodsService.updateById(goods);
4 model.addAttribute("id",goods.getId());
5 return "forward:edit.action";
6 }
绝对路径写法:根据需求来适用绝对路径和相对路径。
1 @RequestMapping("/update")
2 public String upddateById(goods goods,Model model){
3 this.goodsService.updateById(goods);
4 model.addAttribute("id",goods.getId());
5 return "redirect:/goods/edit.action";
6 }
注意这里需要带上扩展名.action
url没发生变化。
五、重定向:
通过return "redirect:*.action" 通过Model设置数据。绝对路径是带有/。
1 @RequestMapping("/update")
2 public String upddateById(goods goods,Model model){
3 this.goodsService.updateById(goods);
4 model.addAttribute("id",goods.getId());
5 return "redirect:edit.action";
6 }
url发生变化。
Modle 底层也是通过request.setAttribute来设置属性,但是对request上做了更好的封装,无论是转发还是重定向都可以设置值。
java-会话范围的bean作为Spring MVC Controller的类属性
我有一个User类:
@Component
@Scope("session")
public class User {
private String username;
}
和一个控制器类:
@Controller
public class UserManager {
@Autowired
private User user;
@modelattribute("user")
private User createuser() {
return user;
}
@RequestMapping(value = "/user")
public String getUser(HttpServletRequest request) {
Random r = new Random();
user.setUsername(new Double(r.nextDouble()).toString());
request.getSession().invalidate();
request.getSession(true);
return "user";
}
}
我使会话无效,以便下次我进入/ users时,我得到另一个用户.由于用户的会话范围,我期望使用其他用户,但是我得到的是同一用户.我在调试模式下进行了检查,它与内存中的对象ID相同.我的bean声明为:
<bean id="user">
<aop:scoped-proxy/>
</bean>
我是春季新手,所以我显然做错了什么.我希望每个会话都有一个User实例.怎么样?
现在要注意的是,此代理将注入到您的所有类中,这就是为什么您只看到1个(本质上是代理的)实例的原因,但是代理知道如何管理范围-只要您继续通过类的方法,因此,在这种情况下,如果您通过getter和setter调用来获取User类的属性,则应该看到反映了该会话的值.
我们今天的关于会话范围的bean作为Spring MVC Controller的类属性和会话bean是什么的分享已经告一段落,感谢您的关注,如果您想了解更多关于Bean的会话范围在Spring MVC应用程序中如何工作?、java – Spring MVC中的@Controller注释和Controller类、JAVA 框架 springmvc controller的返回值、java-会话范围的bean作为Spring MVC Controller的类属性的相关信息,请在本站查询。
本文标签: