Web应用首页index.jsp无法显示表格,仅Servlet路径可正常显示的问题
你遇到的核心问题很清晰:当直接访问欢迎页index.jsp时,没有任何代码为request对象设置名为table的属性,所以request.getAttribute("table")返回null,页面自然就显示了这个值。而访问ServlentToRead时,这个Servlet类里肯定有代码生成了表格内容,并把它存入request属性中,之后转发到展示页面(大概率是关联的JSP),所以表格能正常渲染。
看你的index.jsp代码,它直接尝试从request中获取table属性,但用户直接访问首页时,请求是Tomcat直接转发到index.jsp的,中间没有经过任何处理请求的Servlet,自然没有地方给request注入这个属性值。
根据你的需求,有两种常用的处理方式:
方式1:让首页请求先经过Servlet(推荐)
修改web.xml的配置,让访问根路径的请求先经过ServlentToRead,由它生成表格数据后再转发到index.jsp。
首先给ServlentToRead添加映射配置:
<servlet> <servlet-name>ServlentToRead</servlet-name> <servlet-class>你的完整包名.ServlentToRead</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServlentToRead</servlet-name> <url-pattern>/</url-pattern> <!-- 映射到根路径,即首页访问路径 --> </servlet-mapping>
然后在ServlentToRead的doGet方法中,生成表格内容并转发到index.jsp:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 这里替换成你实际生成表格HTML的逻辑 String tableHtml = "<table border='1'><tr><td>示例数据1</td><td>示例数据2</td></tr></table>"; request.setAttribute("table", tableHtml); // 转发到index.jsp展示数据 request.getRequestDispatcher("/index.jsp").forward(request, response); }
方式2:在JSP中添加默认逻辑(快速临时方案)
如果不想调整Servlet映射,也可以在index.jsp里判断table是否为null,如果是则生成默认表格内容:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <% String table = (String) request.getAttribute("table"); // 当table为null时,生成默认表格 if (table == null) { table = "<table border='1'><tr><td>默认数据1</td><td>默认数据2</td></tr></table>"; } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Mytable</title> </head> <body> <h1>Mytable</h1> <%= table %> </body> </html>
不过这种方式把业务逻辑写在JSP里,不符合MVC的分层设计思想,仅适合快速测试,不推荐长期使用。
另外注意你的Servlet名字拼写:ServlentToRead应该是ServletToRead(少了一个字母e),虽然不影响运行,但规范的命名能让代码更易维护。
内容的提问来源于stack exchange,提问作者student

