Java 使用arraylist保存servlet中的字符串,并在其他servlet中检索相同的arraylist以检索数据
大家好,我是java新手,我正在尝试通过一个通过html发送的servlet将表单数据保存到数组列表中,并使用第二个servlet检索相同的数组列表。 问题是,我可以使用ServletOne使用“is.setAl(str);”将数据添加到列表中,也可以在ServletOne中检索数据。但当我尝试使用“arrList=is.getAl();”检索servlet 2中的数据时,它给出了null值 下面是我的servlet和目标代码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
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对象以访问其方法