Java 有没有办法将列表从servlet返回到html页面

Java 有没有办法将列表从servlet返回到html页面,java,html,servlets,Java,Html,Servlets,我想将请求从html页面发送到servlet,然后在java servlet中创建一个列表,然后我想将此列表返回到同一html页面。问题是,您从未初始化HttpSession s变量: @WebServlet(urlPatterns = {"/ShowPersonServlet"}) public class ShowPersonServlet extends HttpServlet { HttpSession s; //null by default //... p

我想将请求从html页面发送到servlet,然后在java servlet中创建一个列表,然后我想将此列表返回到同一html页面。

问题是,您从未初始化
HttpSession s
变量:

@WebServlet(urlPatterns = {"/ShowPersonServlet"})
public class ShowPersonServlet extends HttpServlet {

    HttpSession s; //null by default
    //...

    protected void processRequest(...) {
        //...
        //since never initialized, s is null
        user.add((Person) s.getAttribute("person"));
    }

    @Override
    protected void doGet(...) {
        //...
        //since never initialized, s is null
        s.setAttribute("person",person);
    }
}
使其工作解决方案:设置
s

s = request.getSession();
现实世界解决方案:

  • 删除Servlet中的所有字段,永远不要尝试处理Servlet中的状态,除非它们是由容器(如EJB)管理的资源
  • httpsessions
    的范围更改为每个方法的本地范围。另外,将其名称从
    s
    更改为
    session
    或更有用的名称
  • 将HTML代码移动到处理视图细节(如JSP)的组件上,然后执行一个到视图的转发
因此,您的代码如下所示:

@WebServlet(urlPatterns = {"/ShowPersonServlet"})
public class ShowPersonServlet extends HttpServlet {
    /*
    HttpSession s ; //moved as local variable
    Person person = new Person(); //moved as local variable
    private List<Person> user = new ArrayList<Person>(); //not sure where you want to store this
    */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session = request.getSession();
        List<Person> personList = (List<Person>) session.getAttribute("personList");
        if (personList == null) {
            personList = new ArrayList<>();
            session.setAttribute("personList", personList);
        }
        personList.add((Person) session.getAttribute("person"));
        /*
        try (PrintWriter out = response.getWriter()) {
            //removed to shorten this answer
        }
        */
        request.getRequestDispatcher("/showPerson.jsp").forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        Person person = new Person();
        person.setKey(request.getParameter("txt_Key"));
        person.setFirstName(request.getParameter("txt_firstName"));
        person.setLastName(request.getParameter("txt_lastName"));
        processRequest(request, response);
        HttpSession session = request.getSession();
        session.setAttribute("person",person);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        processRequest(request, response);
    }
}
@WebServlet(urlPatterns={”/ShowPersonServlet“})
公共类ShowPersonServlet扩展了HttpServlet{
/*
HttpSession s;//作为局部变量移动
Person=新Person();//作为局部变量移动
private List user=new ArrayList();//不确定要将其存储在何处
*/
受保护的void processRequest(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
setContentType(“text/html;charset=UTF-8”);
HttpSession session=request.getSession();
List personList=(List)session.getAttribute(“personList”);
if(personList==null){
personList=新的ArrayList();
setAttribute(“personList”,personList);
}
添加((Person)session.getAttribute(“Person”);
/*
尝试(PrintWriter out=response.getWriter()){
//删除以缩短此答案
}
*/
request.getRequestDispatcher(“/showPerson.jsp”).forward(请求,响应);
}
@凌驾
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
Person=新人();
person.setKey(request.getParameter(“txt_Key”);
person.setFirstName(request.getParameter(“txt_firstName”);
person.setLastName(request.getParameter(“txt_lastName”);
processRequest(请求、响应);
HttpSession session=request.getSession();
session.setAttribute(“person”,person);
}
@凌驾
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
processRequest(请求、响应);
}
}
更多信息:


您需要从获取会话,不能简单地期望通过
httpsessions获取会话-有
s
null

// Something like this (in processRequest), although I 
// would prefer a local session variable.
s = request.getSession();

您需要提供异常的stacktrace。但它看起来可能在两个地方:

  • s、 setAttribute(“person”,person);在那里,s永远不会被设定
  • out.println(“+p.getKey()+”);从未设置属性“person”
    祝你好运。

    未定义
    var s
    的值。它为空,因此使用
    s.getAttribute(“str”)
    将引发异常

    https会话

    s = request.getSession(false);
    

    不要把HTML放在Java代码中。不要将Java代码放在HTML中。不要在Servlet中处理状态,这将导致线程安全问题。@SotiriosDelimanolis我不会说您永远不必将HTML代码放在Servlet中。我想说的是,不要从servlet端处理整个HTML页面,“空错误异常”?从来没听说过这些。也许您可以给我们空错误异常的堆栈跟踪,并指出它所指的行号?@LuiggiMendoza对,如果您要编写HTML,请在专用组件中执行。但是如何将列表返回到HTML页面以在那里打印呢?我应该在所有用户添加的同一html页面中打印。我在这里遇到了一个错误:if(personList==null){personList=new List();session.setAttribute(“personList”,personList);列表是抽象的,无法实例化。此外,我还有一个错误:**NullPointerException()**@user3459148将
    新列表
    错误修复为
    新数组列表
    ,我的错误(快速键入)。