1、问题描述
servlet代码如下:
el-demo.jsp代码如下:
正常情况下用浏览器访问到的结果为:
而我访问到的情况如下:
问题:JSP在用EL表达式的时候,EL表达式不起作用,比如我遇到的情况(访问不到集合中的数据)
2、问题起因
servlet版本过低,在默认情况下,Servlet 2.3 (及之前版本)/ JSP 1.2(及之前版本)是不支持EL表达式的,而Servlet 2.4 / JSP 2.0支持。 servlets 2.4这个版本(以及之后的版本)的isELIgnored默认设置为false。而servlets2.3以及之前的版本isELIgnored默认值为true。就导致了出现EL表达式无效的情况。
3、解决方案
方式1
在需要使用EL表达式的页面加上下面的指令,这个方法使用的时候,每一个用到EL的jsp文件中都需要添加这行代码。
<%@ page isELIgnored="false" %>
例如下图中的样子:
方式2
在项目结构中删除web.xml文件,然后重新添加该文件,删除重建的步骤请看下方链接中的修改web.xml文件标题下的内容
链接:https://blog.csdn.net/aiains/article/details/129171641?spm=1001.2014.3001.5501
重新添加后的web.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
3、方式1和方式2的缺点
方式1使用的过程中,如果这个页面需要用到EL表达式,就必须在这个页面中添加那一行配置。
方式2使用的过程中,每次创建一个新的项目的时候,都需要删除重建web.xml文件。
所以方式1和方式2在使用的过程中,站在长期使用的角度来看,还是非常麻烦的,因此我们采用第三种方法来优化方式1和方式2
4、最佳解决方案
1、通过下面的路径找到下图中的jar包(路径中的红色部分是maven仓库路径,该jar包在maven仓库中)
D:\IDEA2020\Maven\maven_repository\org\apache\maven\archetypes\maven-archetype-webapp\1.4
2、然后在预览中找到src\main\webapp\WEB-INF目录下的web.xml文件,然后点中web.xml文件,右击选择编辑
3、用下面的代码替换掉web.xml文件中原来的内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
</web-app>
4、然后保存退出,此时会弹出下面的界面,点击是即可
5、总结:
采用最佳方案之后,以后每次创建项目的时候,都不用在担心本文标题中的问题了。
关于web.xml的加载过程配置详解请参考下面链接中的文章
链接:https://cloud.tencent.com/developer/article/2109926
6、遗留问题
在查找资料的过程中,发现了下面的内容,虽然前面的步骤已经把问题解决了,然后对下面的内容比较好奇,但是下面的内容还未进行测试。暂且保留下来,说不定以后能够用到。
这个方法使用的时候,每一个用到EL的jsp文件中都需要添加上面刚刚提到的那行代码,为了解决此问题,可以在web.xml文件中配置下面的代码,
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
上面的配置就足够使用,但是网上还有跟这个有关的详细的配置,具体如下:
<jsp-config>
<jsp-property-group>
<description>指定JSP文件的配置属性</description>
<display-name>jspConfiguration</display-name>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>utf-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude></include-prelude>
<include-coda></include-coda>
</jsp-property-group>
<jsp-property-group>
<description>指定htm文件的配置属性</description>
<display-name>jspConfiguration</display-name>
<url-pattern>*.htm</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>utf-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude></include-prelude>
<include-coda></include-coda>
</jsp-property-group>
<jsp-property-group>
<description>指定html文件的配置属性</description>
<display-name>jspConfiguration</display-name>
<url-pattern>*.html</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>utf-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude></include-prelude>
<include-coda></include-coda>
</jsp-property-group>
</jsp-config>
上面配置过程中的属性说明:
<description>:设定的说明
<display-name>:设定名称
<url-pattern>:设定值所影响的范围,如:/CH2或/*.jsp
<el-ignored>:若为true,表示不支持EL语法
<scripting-invalid>:若为true,表示不支持<% scripting %>语法
<page-encoding>:设定JSP网页的编码
<include-prelude>:设置JSP网页的抬头,扩展名为.jspf
<include-coda>:设置JSP网页的结尾,扩展名为.jspf