Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用arraylist保存servlet中的字符串,并在其他servlet中检索相同的arraylist以检索数据_Java_Servlets_Arraylist - Fatal编程技术网

Java 使用arraylist保存servlet中的字符串,并在其他servlet中检索相同的arraylist以检索数据

Java 使用arraylist保存servlet中的字符串,并在其他servlet中检索相同的arraylist以检索数据,java,servlets,arraylist,Java,Servlets,Arraylist,大家好,我是java新手,我正在尝试通过一个通过html发送的servlet将表单数据保存到数组列表中,并使用第二个servlet检索相同的数组列表。 问题是,我可以使用ServletOne使用“is.setAl(str);”将数据添加到列表中,也可以在ServletOne中检索数据。但当我尝试使用“arrList=is.getAl();”检索servlet 2中的数据时,它给出了null值 下面是我的servlet和目标代码 Servlet 1: public class TestServl

大家好,我是java新手,我正在尝试通过一个通过html发送的servlet将表单数据保存到数组列表中,并使用第二个servlet检索相同的数组列表。 问题是,我可以使用ServletOne使用“is.setAl(str);”将数据添加到列表中,也可以在ServletOne中检索数据。但当我尝试使用“arrList=is.getAl();”检索servlet 2中的数据时,它给出了null值

下面是我的servlet和目标代码


Servlet 1:

public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public static InfoSave is = new InfoSave();
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doPost(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    BufferedReader br =request.getReader();

    String str = br.readLine();
    System.out.println("The String Recieved is:\n"+str);

    is.setAl(str);  


    System.out.println("----> "+is.getAl()+"\n");

    response.setContentType("application/json");
    response.getWriter().write(str);
}
...
InfoSave is = new InfoSave();
is.setAl(str);
request.getSession().setAttribute("IS", is);
...

Servlet 2:

public class SearchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static InfoSave is = new InfoSave();
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    doPost(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    BufferedReader br = request.getReader();

    String str = br.readLine();
    System.out.println(str);


     ArrayList<String> arrList = null, result = null;

      arrList = is.getAl();
      System.out.println("\n"+arrList);
      result = new ArrayList<>();
      for (Iterator iterator = arrList.iterator(); iterator.hasNext();)
      {
        String string = (String) iterator.next();
        if(string.contains(str)){
            result.add(string);
        }else{
            String message = "No Matching result Found";
            response.setContentType("application/json");
            response.getWriter().write(str);
        }

      }
      System.out.println("Size: "+result.size());
      String json = new Gson().toJson(result);


    response.setContentType("application/json");
    response.getWriter().write(json);
}
}
...
InfoSave is = (InfoSave) request.getSession().getAttribute("IS");
arrList = is.getAl();
...
公共类SearchServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
private static InfoSave is=new InfoSave();
/**
*@参见HttpServlet#doGet(HttpServletRequest请求,HttpServletResponse
*(答复)
*/
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
//TODO自动生成的方法存根
doPost(请求、响应);
}
/**
*@参见HttpServlet#doPost(HttpServletRequest,HttpServletResponse
*(答复)
*/
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
//TODO自动生成的方法存根
BufferedReader br=request.getReader();
字符串str=br.readLine();
系统输出打印项次(str);
ArrayList arrList=null,result=null;
arrList=is.getAl();
System.out.println(“\n”+arrList);
结果=新的ArrayList();
for(Iterator Iterator=arrList.Iterator();Iterator.hasNext();)
{
字符串=(字符串)迭代器。下一步();
if(string.contains(str)){
结果。添加(字符串);
}否则{
String message=“未找到匹配结果”;
setContentType(“应用程序/json”);
response.getWriter().write(str);
}
}
System.out.println(“大小:+result.Size());
字符串json=new Gson().toJson(结果);
setContentType(“应用程序/json”);
response.getWriter().write(json);
}
}

ArrayList对象:

public class InfoSave {
private ArrayList<String> al = new ArrayList<>();

public ArrayList<String> getAl() {
    return al;
}

public void setAl(String s) {
    al.add(s);
}
}
公共类信息保存{
private ArrayList al=new ArrayList();
公共数组列表getAl(){
返回al;
}
公共无效集合(字符串s){
等。添加(s);
}
}
在Servlet 2中:

public class SearchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static InfoSave is = new InfoSave();
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    doPost(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    BufferedReader br = request.getReader();

    String str = br.readLine();
    System.out.println(str);


     ArrayList<String> arrList = null, result = null;

      arrList = is.getAl();
      System.out.println("\n"+arrList);
      result = new ArrayList<>();
      for (Iterator iterator = arrList.iterator(); iterator.hasNext();)
      {
        String string = (String) iterator.next();
        if(string.contains(str)){
            result.add(string);
        }else{
            String message = "No Matching result Found";
            response.setContentType("application/json");
            response.getWriter().write(str);
        }

      }
      System.out.println("Size: "+result.size());
      String json = new Gson().toJson(result);


    response.setContentType("application/json");
    response.getWriter().write(json);
}
}
...
InfoSave is = (InfoSave) request.getSession().getAttribute("IS");
arrList = is.getAl();
...
arrList=is.getAl()更改为
TestServlet.is.getAl()


在Servlet 2中,
,Servlet 1是不同的对象。

在Servlet 2中,您访问的是Servlet 2的静态变量
,而不是Servlet 1的
变量;它们不引用相同的
InfoSave
对象。servlet 2中的变量未填充,当调用
时,返回的列表为空

在这种情况下,如果您想在这两个servlet之间共享信息,可以将对象放在servlet 1的会话中,并从servlet 2中的会话中检索

Servlet 1:

public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public static InfoSave is = new InfoSave();
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doPost(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    BufferedReader br =request.getReader();

    String str = br.readLine();
    System.out.println("The String Recieved is:\n"+str);

    is.setAl(str);  


    System.out.println("----> "+is.getAl()+"\n");

    response.setContentType("application/json");
    response.getWriter().write(str);
}
...
InfoSave is = new InfoSave();
is.setAl(str);
request.getSession().setAttribute("IS", is);
...
Servlet 2:

public class SearchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static InfoSave is = new InfoSave();
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    doPost(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    BufferedReader br = request.getReader();

    String str = br.readLine();
    System.out.println(str);


     ArrayList<String> arrList = null, result = null;

      arrList = is.getAl();
      System.out.println("\n"+arrList);
      result = new ArrayList<>();
      for (Iterator iterator = arrList.iterator(); iterator.hasNext();)
      {
        String string = (String) iterator.next();
        if(string.contains(str)){
            result.add(string);
        }else{
            String message = "No Matching result Found";
            response.setContentType("application/json");
            response.getWriter().write(str);
        }

      }
      System.out.println("Size: "+result.size());
      String json = new Gson().toJson(result);


    response.setContentType("application/json");
    response.getWriter().write(json);
}
}
...
InfoSave is = (InfoSave) request.getSession().getAttribute("IS");
arrList = is.getAl();
...
这样,您就不需要在servlet中使用静态变量

有关servlet会话的更多信息:

嗯,甚至不要尝试这样做

Servlet旨在以可能的多线程方式从Servlet容器中为不同的客户端会话调用。这意味着它们应该是无状态对象。您可以在一个servlet中使用一个可公开访问的静态
InfoSave
对象,并从另一个servlet中使用它,但这不是javaee的方式

如果希望每个活动会话都有一个InfoSave,或者在servlet上下文中使用一个单独的共享列表,那么使用session属性是正确的。这样做的好处是,您可以更轻松地从一路切换到另一路

下面是使用会话的示例代码:

public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    ...    
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Get access to a session scoped InfoSave - local to keep the servlet stateless
        HttpSession session = request.getSession();
        InfoSave is = (InfoSave) session.getAttribute("INFOSAVE");
        if (is == null) { // no InfoSave here: create a brand new one
            is = new InfoSave();
            session.setAttribute("INFOSAVE", is); // store it into the session
        }
        // the remaining of the code can safely access the session scoped InfoSave
        ...
    }
}

顺便说一句,如果您想使用静态InfoSave或将其存储在servlet上下文属性中,您应该同步访问,因为多个线程可以同时执行一个servlet-但希望只有一个线程可以使用给定的会话…

您需要创建InfoSave对象以访问其方法