GVKun编程网logo

会话范围的bean作为Spring MVC Controller的类属性(会话bean是什么)

3

在本文中,我们将详细介绍会话范围的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 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应用程序中如何工作?

Bean的会话范围在Spring MVC应用程序中如何工作?

我在Spring MVC中还很陌生,我对bean 的 会话范围 有疑问。

进入一个项目,我有一个Cartbean,这个:

@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类

java – Spring MVC中的@Controller注释和Controller类

当我使用 Spring 3.x时
在使用注释时,我很难知道我们要使用这个@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的返回值

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的类属性

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实例.怎么样?

最佳答案
这是预期的行为.当您用< aop:scoped-proxy />标记一个bean时,为此创建一个代理.如果Bean有接口,则将创建Java动态代理,否则将创建基于cglib的代理-在您的情况下,由于User类没有父类/接口,将为您创建基于cglib的代理.

现在要注意的是,此代理将注入到您的所有类中,这就是为什么您只看到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的类属性的相关信息,请在本站查询。

本文标签: