Web应用程序中静态对象的范围是什么

时间:2017-01-10 18:49:28

标签: java servlets javabeans

我有一个由HTML表单和Servlet组成的应用程序,它根据用户提交的参数创建一个新对象,然后将创建的bean添加到列表中。

有JavaBean类:

public class Client{

private String name, adress, tel, email;

public Client(String name, String adress, String tel, String email) {
    this.name = name;
    this.adress = adress;
    this.tel = tel;
    this.email = email;
}

//A bunch of Getters and Setters
}

以下是ClientsMan类:

public abstract class ClientsMan {

private static List<Client> clientsList;

static
{
    clientsList= new ArrayList<Client>();
}

public static void addClient(Client c)
{
    clientsList.add(c);
}
}

这是处理表单的servlet的doPost()方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //Getting the parametres
    String name = request.getParameter("name");
    String adress = request.getParameter("adress");
    String tel = request.getParameter("tel");
    String email = request.getParameter("email");

    //Creating a Client object from the user inputs
    Client client = new Client(name, adress, tel, email);

    //Adding the bean in an arrayList
    ClientsMan.addClient(client);

}

我需要保留所有添加的客户列表供以后使用。

我的问题是: 我的应用程序中List的范围是什么,是请求范围还是应用程序范围? 用户退出应用程序后,我是否会丢失列表?

3 个答案:

答案 0 :(得分:1)

  

我的应用程序中List的范围是什么,是请求范围   或申请范围?

它们都不是因为它的生命周期不是由您的应用程序管理的,List clientsList是类static的{​​{1}}字段,这意味着它的范围相当广泛到初始化类ClientsMan的{​​{1}},即使在用户退出应用程序之后,它也应存在。

答案 1 :(得分:1)

静态类不是bean,因为它不是容器管理的,因此没有任何与此类相关的范围。 当用户退出您的应用程序时,您的List仍然存在。

如果需要,您还应该管理列表的线程安全性。

答案 2 :(得分:1)

对象的默认范围是请求范围。在服务方法中实例化的任何变量都有请求范围。每个请求和响应对都是以服务开头的线程的一部分,并在该服务类结束时结束。

如上所述,列表是静态类型,因此它将持续到JVM。但是在运行它时会遇到问题,因为它不是线程安全的对象。你需要使静态块snychronized。