Demo介绍
制作了一个简单的登录界面login.jsp,在基本的表单里面填写数据然后点击登录,后端程序LoginAction来进行业务逻辑的编写,从数据库里根据昵称关键字查找密码与读取到的表单数据进行登录验证,登录成功则跳转至成功界面,失败则跳转至失败界面并且使用EL表达式,即${变量名}来展示登录失败的具体原因。
Bug描述
跳转到失败界面时无法展示失败的具体原因,${}表达式失效,并没有读取到回填的具体信息,而直接原样展示变量
如下图所示:
问题根源
低版本的 web.xml 中EL表达式: ${ } 该取值方式是默认关闭的,导致${}表达式失效不可用,在展示时直接被浏览器解析为一个字符串直接输出在了页面上
解决方案
方案一:修改web.xml配置文件
- 注意这里的修改要根据不同版本的Tomcat/conf/web.xml文件中的具体版本信息来修改
- 以我的为例,本人使用的是Tomcat 9.0.65
第一步:找到Tomcat/conf/web.xml文件,使用记事本打开(编译器打开也可以)
第二步:对照Tomcat/conf文件夹下的web.xml文件内容重新配置项目中的web.xml文件
- 在写入新的配置代码前,需要将前面的空行全部删除,否则会报错:Xml declaration should precede all document content
第三步:重新运行Servlet进行错误的登录,来检测是否能够在浏览器上回填出具体的错误信息
可以看到,登录失败的具体原因已经成功回填到浏览器页面了!问题得到解决!!!
方案二:设置JSP页面头部page参数中设置 isELIgnored=”false”
原来在低版本的JSP标准版本中,默认是忽略EL表达式的,现在的这个参数的含义是不忽略EL标签。,从而开启EL表达式的功能
- JSP原来的头部代码
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
- JSP修改后的头部代码
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
若第二种方案不行,那么大概率是web版本过低导致忽略了EL表达式,即造成${}该种取值方式被默认关闭不可用。此时就要使用方案一去修改原来项目中的web.xml配置文件
参考文章
Xml declaration should precede all document content——问题解决
结语
特此感谢我的朋友三金c_c 博主大晚上帮我进行远程调试,最终精准定位到web.xml文件问题!
分享Bug解决方案,让搜到我文章的人少走弯路!Bug就此终结!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93451.html