【问题标题】:Sessions showing null error会话显示空错误
【发布时间】:2014-03-20 12:13:31
【问题描述】:

我有一个 JSP 页面,比如 xyz.jsp,我在其中设置了会话

request.getSession().setAttribute("path", loc);

在 a.java 中我成功使用了这个会话并将响应发送回 jsp 页面,

String fpath = request.getSession().getAttribute("path").toString();

但是,当我在 b.java 中使用相同的会话值时,我得到了空指针异常。

my.jsp->on button click->a.java->get session1->send response to my.jsp->my.jsp reloads->b.java 试图使用 session1->NullPointerExceptionError

我试过了,

  1. 使用不同的会话变量

    session.setAttribute("session1", loc);
    session.setAttribute("session2", loc);
    
  2. 在 a.java 中创建一个新的会话变量并在 b.java 中访问它

还是同样的错误。

my.jsp 看起来像,

String loc = "/u/poolla/workspace/FirstServlet/WebContent/WEB-INF/" + ip +"/" +timeStamp;
session.setAttribute("path", loc);

a.java 看起来像

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

    HttpSession session = request.getSession();
    String fpath = session.getAttribute("path").toString();


    if(!new File(fpath).exists())
    {
        File uploadedFile = new File(fpath, fileName);
                    item.write(uploadedFile);
        two_file = "Right file " +fileName;
            request.setAttribute("file2", two_file);
        String f2 = "<span class='blue'>" +"Uploaded file " +fileName+ " at " +uploadedFile.getAbsolutePath()+ "<br>" + "</span>";
                    request.setAttribute("f2stat", f2);
    }

RequestDispatcher rd = request.getRequestDispatcher("geco.jsp");
rd.forward(request, response);

b.java 的样子

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    HttpSession session = request.getSession();
    String b = session.getAttribute("path").toString();
            File file = new File(b);
            if(!file.exists())
            {
                file.createNewFile();
            }
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write("hi");
            bw.close();
}

【问题讨论】:

  • 你能再添加一些代码吗?
  • 你想要哪一部分?
  • 向我们展示您的 servlet 代码?
  • 您的 String fpath 是否具有正确的值?我的意思是您是否正确设置了会话属性。为什么不 request.getSession().setAttribute("session1", loc);
  • 我将分享我尝试过的代码。基本上它应该可以工作,你可以和我的比较一下,如果你在处理会话的方式上有一些变化,请告诉我

标签: java jsp session


【解决方案1】:

这只是为了帮助您解决问题。我的意思是在jsp中使用scriptlet,命名约定,在这种情况下使用两个servlet都不推荐..

代码 sn-ps

web.xml

<servlet>
    <servlet-name>myservleta</servlet-name>
    <servlet-class>com.examples.example.MyServletA</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>myservletb</servlet-name>
    <servlet-class>com.examples.example.MyServletB</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>myservleta</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>myservletb</servlet-name>
    <url-pattern>*.go</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

index.jsp

<body>
    <%
        session.setAttribute("location", "tvm");
    %>
    <form action="gotoajava.do" method="post">
        <input type="Submit" />
    </form>
</body>

page2.jsp

<body>
    <form action="gotobjava.go" method="get">
        <input type="Submit" />
    </form>
</body>

MyServletA.java

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

        String loc = request.getSession().getAttribute("location").toString();
        System.out.println("location in ServletA from session is " + loc);

        RequestDispatcher rd = request.getRequestDispatcher("geco.jsp");
        rd.forward(request, response);
    }

MyServletB.java

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession session = request.getSession();
        String loc = session.getAttribute("location").toString();
        System.out.println("location in ServletB from session is " + loc);

    }

控制台日志:

Mar 20, 2014 9:28:33 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 343 ms
location in ServletA from session is tvm
location in ServletB from session is tvm

edit:根据 OP 的编辑请求,执行“gotobjava.go”操作的 jsp 被重命名为 page2.jsp

【讨论】:

  • 我做的都是一样的兄弟,空指针仍然存在。
  • 好的,你是按照我的代码还是你尝试了这个参考?,你还提到了 my.jsp->on button click->a.java->get session1->send response to my.jsp ->my.jsp reloads->b.java 试图使用 session1->NullPointerExceptionError 。你能告诉我你是如何实现的吗? “my.jsp 重新加载->b.java”?
  • 是的,我做到了..但我实际上无法将其拼接到我的 servlet 中,因为很多事情是相互依赖的,我想做的就是能够将会话传递给多个接收器.无论如何,感谢您的代码,我会重新检查并尝试根据您的方法编辑我的代码。
  • 嘿,我想我在某个地方做错了,我正在检查它。可能需要更长的时间。完成后我会留下反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2012-05-22
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2020-04-27
相关资源
最近更新 更多