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

在项目结构中删除web.xml文件,然后重新添加该文件,删除重建的步骤请看下方链接中的修改web.xml文件标题下的内容

链接:maven搭建web项目步骤_maven怎么运行web项目_AIains的博客-CSDN博客

重新添加后的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的加载过程配置详解请参考下面链接中的文章

链接:web.xml的加载过程配置详解-腾讯云开发者社区-腾讯云

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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值