按CSDN的惯例,首先先描述问题情况:
在servlet中用request.getAttribute()存储的域对象,在进行转发到相应的jsp文件后,在该jsp文件里用EL表达式${域对象的键名},提示找不到该键,用Tomcat启动服务器后,提示HTTP 500异常,异常的位置就在于EL表达式获取域对象那一行。
- Servlet的关键代码如下(简化后):
//1.创建字符串
String hello = "hello";
//2.将字符串数据存入request域中
request.setAttribute("hello",hello);
//3..转发到list.jsp页面中展示
request.getRequestDispatcher("/list.jsp").forward(request,response);
- JSP的关键代码如下(简化后):
<h1>${hello}<h1>
如果这时候hello颜色变了并提示无法找到该对象,那么很遗憾地告诉现在看到这篇文章的你们,遇到了和我相同的情况。
我当时查阅了网上很多篇文章,包括CSDN里面的回答,但基本上是说必须先访问servlet文件后jsp才能获得相应的域对象,直接访问jsp会取得空值,也就是null。这么说并没有错,事实上也正是如此。但这些回答都没有解决关键问题,那就是和我出现同样问题的朋友,在jsp中编写的EL表达式中根本无法获取到servlet中传来的域对象。
那么,这种情况该如何解决呢?其实很简单。主要在jsp中用jsp指令<% %>获取request域对象,再存入request中即可。
- 修改后的jsp文件代码如下:
<%
<%-- 取出servlet中转发来的request域对象,并返回一个object对象,这个Object对象就是转发过来的域对象 --%>
Object hello = request.getAttribute("hello");
<%-- 再存储到request域中 --%>
request.setAttribute("hello",hello);
%>
<%-- 现在EL表达式就可以正常获取到该域对象了 --%>
${hello}
写在最后的一些话:这里我借助的是JSP指令来让间接EL表达式获取域对象,众所周知,EL表达式${域对象的键名}是根据四大域对象从小到大依次查找获取的。在JSP中用<% %>指令存放的域对象EL表达式都能获取到,但从servlet中转发过来的域对象EL不知为何无法直接获取(我用的IDE是IDEA 2019.2)。
作为IT届的小白,第一次写这种类型的博客,希望能帮助到和我遇到同样问题的朋友。如果文中有错误或不当的地方,还望恳请大家多多包涵。倘若有更好的解决办法,也欢迎大家在评论区交流学习。