You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

request.setAttribute传递文件内容至JSP显示为null问题排查求助

我来帮你分析下为什么JSP里拿到的是null,然后一步步解决问题:

问题根源

你混淆了同步请求转发AJAX异步请求的核心区别:

  • 页面里的<%=request.getAttribute("chat") %>是在页面第一次加载时执行的,此时这个请求属性根本没被设置,所以输出null
  • 你用AJAX发起getAllFile.do请求后,控制器执行转发到Live_index6.jsp,但这个转发的结果是把整个JSP页面作为AJAX的响应返回,而不是把聊天数据单独传给AJAX回调——这完全不是你想要的逻辑。

我们需要调整思路:让getAllFile.do直接返回聊天文本内容,再通过AJAX回调把内容填充到页面的textarea中。


具体修改步骤

1. 修改 fileGet.java

去掉request.setAttribute,直接向HTTP响应输出聊天内容:

package Services;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class fileGet implements fileImpl{
    @Override
    public void fileWork(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String path = request.getSession().getServletContext().getRealPath("/") + "/Chat_Log/chat_log.txt";
        String chat = "";
        try{
            File file = new File(path);
            FileReader filereader = new FileReader(file);
            BufferedReader bufReader = new BufferedReader(filereader);
            String line = "";
            while((line = bufReader.readLine()) != null){
                chat += line + "\n";
            }
            bufReader.close();
        }catch (Exception e) {
            System.out.println(e.getMessage());
        }
        // 直接向响应输出聊天内容,设置编码避免乱码
        response.setContentType("text/plain;charset=UTF-8");
        response.getWriter().write(chat);
    }
}

2. 修改 FileController.java

处理getAllFile.do时,执行完业务逻辑后直接返回,避免后续的JSP转发(AJAX不需要整个页面):

package frontController;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Services.fileGet;
import Services.fileImpl;
import Services.fileInsert;

@WebServlet("*.do")
public class FileController extends HttpServlet {
    public FileController() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("완료");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        
        String c =request.getRequestURI().substring (request.getContextPath().length());
        String str = "Live_index6.jsp";
        fileImpl fi = null;

        switch(c) {
            case "/insertFile.do":
                fi = new fileInsert();
                try {
                    fi.fileWork(request, response);
                }catch(Exception e){
                    System.out.println(e.getMessage());
                }
                break;
            case "/getAllFile.do":
                fi = new fileGet();
                try {
                    fi.fileWork(request, response);
                }catch(Exception e) {
                    System.out.println(e.getMessage());
                }
                // 终止方法,避免执行后续的JSP转发
                return;
        }

        // 仅非AJAX请求会走到这里,执行转发
        RequestDispatcher rd1 = request.getRequestDispatcher(str);
        rd1.forward(request, response);
    }
}

3. 修改 Live_index6.jsp 的AJAX回调

把返回的聊天内容填充到textarea中,同时可以删掉页面里无效的<%=request.getAttribute("chat") %>代码:

window.onload = function(){
    const name = document.getElementById("who1").value;
    $.ajax({
        url:"getAllFile.do",
        data: { name : name },
        dataType:"text",
        type:"post",
        success: function(result1){
            // 将返回的聊天内容填充到文本框
            document.getElementById("ta1").value = result1;
        },
        error: function(xhr1,status){
            alert("에러상태: " + "\t" + xhr1.status);
        }
    });
}

额外修正点

  • 页面里的chat1.focuse()是拼写错误,改成chat1.focus()
  • 确保Chat_Log/chat_log.txt文件存在且应用有读取权限,否则会抛出异常导致无内容返回;
  • 编码设置已统一为UTF-8,避免乱码问题。

这样修改后,页面加载时AJAX会请求文件内容,成功后自动填充到textarea中,就能正常显示聊天记录了。

内容的提问来源于stack exchange,提问作者Park Bo

火山引擎 最新活动