EL表达式在JSP中不生效问题

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

扫描二维码关注公众号,回复: 17025428 查看本文章

在项目结构中删除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

猜你喜欢

转载自blog.csdn.net/aiains/article/details/129466693
今日推荐