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




