JSP标签、JSTL标签、EL表达式

声明

本文部分内容参考自其他作者原创文章,仅供个人学习留档,特此声明

参考文章链接

[javaweb学习总结(十九)——JSP标签 - 孤傲苍狼 - 博客园 (cnblogs.com)](https://www.cnblogs.com/xdp-gacl/p/3788369.html#:~:text=JSP标签也称之为Jsp,Action (JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。)

JSP 动作元素 | 菜鸟教程 (runoob.com)

JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)

JSP标签、JSTL标签、EL表达式

EL 表达式

EL表达式: ${变量名},如果是null,则不显示,
它的寻找顺序是:pageScope-->requestScope-->sessionScope-->applicationScope
都没找到,就返回null,就不在浏览器显示了

  • 获取数据
  • 执行运算
  • 获取 web 开发的常用对象

JSP标签

[javaweb学习总结(十九)——JSP标签 - 孤傲苍狼 - 博客园 (cnblogs.com)](https://www.cnblogs.com/xdp-gacl/p/3788369.html#:~:text=JSP标签也称之为Jsp,Action (JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。)

JSP 动作元素 | 菜鸟教程 (runoob.com)

1、JSP标签介绍

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

2、JSP常用标签

jsp的常用标签有以下三个

  • jsp:include标签
  • jsp:forward标签
  • jsp:param标签

2.1 jsp:include 标签

jsp:include标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入

语法:
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。

范例:使用jsp:include标签引入资源

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>jsp的jsp:include标签测试</title>
  </head>

  <body>
  	<%--使用jsp:include标签引入其它JSP页面--%>
  	<jsp:include page="/jspfragments/head.jsp"/>
  	<h1>网页主体内容</h1>
  	<jsp:include page="/jspfragments/foot.jsp"/>
  </body>
</html>


jsp:include标签与include指令的区别

jsp:include标签是动态引入 jsp:include标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。

include指令是不能重复定义同一变量的

因为静态包含是将全部内容包含进来之后,再进行处理,属于先包含后处理。 如果被包含进来的页面中定义了一个变量i,而包含页面本身又定义了一个变量i,服务器在处理页面时就会发现里面有两个重复定义的变量i,因此就会报错。


*.jspf扩展名文件在jsp:include、@include和c:import中的区别

JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。今天无意中发现,把一个JSP文件命名为jspf扩展名,然后include到另一个jsp文件中的

发现只有用"@include"指令的时候,jspf文件的内容才会被解析并执行其中的jsp指令和tag,而使用"jsp:include"和JSTL的"c:import"都没有用,jspf文件被当作纯文本文件处理了。

比如现在有一个head.jspf页面和foot.jspf页面

head.jspf

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:red;">网页头部</h1>

foot.jspf

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:blue;">网页尾部</h1>

首先使用"@include"指令将"head.jspffoot.jspf" include到IncludeTagTest.jsp页面,如下所示:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
    <title>jsp的Include指令测试</title>
  </head>

 <body>
 	<%--使用include标签引入引入jspf页面--%>
    <%@include file="/jspfragments/head.jspf" %>
    <h1>网页主体内容</h1>
    <%@include file="/jspfragments/foot.jspf" %>
 </body>
</html>

运行IncludeTagTest.jsp页面,运行结果如下:

jspf文件的内容会被解析并执行其中的jsp指令和tag,查看浏览器解析JspIncludeTagTest.jsp页面生成的源代码,如下所示:


然后再使用"jsp:include"标签将"head.jspffoot.jspf" include到JspIncludeTagTest.jsp页面中,如下所示:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>jsp的jsp:include标签测试</title>
  </head>

  <body>
  <%--使用jsp:include标签引入其它JSPf页面--%>
  <jsp:include page="/jspfragments/head.jspf"/>
    <h1>网页主体内容</h1>
    <jsp:include page="/jspfragments/foot.jspf"/>
  </body>
</html>

运行JspIncludeTagTest.jsp页面,运行结果如下:

查看浏览器解析JspIncludeTagTest.jsp页面生成的源代码,如下所示:

这说明jspf文件Tomcat服务器被当作纯文本文件处理了,没有当作jsp页面来解析执行


那么该如何解决这个问题呢?如何让tomcat服务器能够解析执行*.jspf文件中的java代码和标签呢,有如下的几种解决办法:

解决办法一:修改web.xml文件,添加对扩展名为*.jspf文件的映射

<!-- 让jspf扩展名同样成为JSP Servlet处理的文件。 -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jspf</url-pattern>
    </servlet-mapping>
    <!-- 让jsp扩展名同样成为JSP Servlet处理的文件。 -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

解决办法二:修改Tomcat服务器的web.xml文件,添加对扩展名为*.jspf文件的映射

找到tomcat服务器的web.xml文件,如下所示:

找到名字为jsp的那个Servlet,如下所示:

<servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
</servlet>

然后根据Servlet名找到对应的servlet-mapping配置,如下所示:

<!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

在这里可以看到,名字为jsp的那个Servlet只支持* .jsp和 * .jspx两种扩展名,添加 * .jspf 即可

<!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
        <url-pattern>*.jspf</url-pattern>
    </servlet-mapping>

2.2 jsp:forward 标签

jsp:forward标签用于把请求转发给另外一个资源。
语法:
<jsp:forward page="relativeURL | <%=expression%>" />
page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。

范例:使用 jsp:forward 标签跳转页面

forwarddemo01.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--使用<jsp:forward>标签跳转到forwarddemo02.jsp--%>
<jsp:forward page="/forwarddemo02.jsp"/>

forwarddemo02.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<h1>跳转之后的页面!!</h1>

运行结果如下:

从页面的显示效果来看,页面已经完成了跳转,但地址栏没有变化,地址栏中显示的地址还是forwarddemo01.jsp,但页面显示的内容却是forwardemo02.jsp中的内容。因为此跳转属于服务器端跳转只要是服务器端跳转,则地址栏永远没有变化。


2.3 jsp:param标签

当使用< jsp:include >和< jsp:forward >标签引入或将请求转发给其它资源时,可以使用< jsp:param >标签向这个资源传递参数。
语法1:

<jsp:include page="relativeURL | <%=expression%>">
   <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include >

语法2:

<jsp:forward page="relativeURL | <%=expression%>">
  <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include >

< jsp:param >标签的name属性用于指定参数名,value属性用于指定参数值。在< jsp:include >和< jsp:forward>标签中可以使用多个< jsp:param >标签来传递多个参数。


范例:使用< jsp:param >标签向被包含的页面传递参数

JspIncludeTagDemo03.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<h1>JspIncludeTagDemo03.jsp</h1>
<hr/>
<jsp:include page="/jspfragments/Inc.jsp">
    <jsp:param name="parm1" value="hello" />
    <jsp:param name="parm2" value="gacl" />
</jsp:include>

Inc.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<h1>接收从JspIncludeTagDemo03.jsp页面中传递过来的参数:</h1>
<h2><%=request.getParameter("parm1")%></h2>
<h2><%=request.getParameter("parm2")%></h2>

在JspIncludeTagDemo03.jsp页面中使用jsp:include标签将Inc.jsp页面包含进来,使用jsp:param/标签向Inc.jsp页面传递了两个参数parm1和parm2

JspIncludeTagDemo03.jsp页面运行结果如下:


范例:使用< jsp:param >标签向要跳转的页面传递参数

forwarddemo03.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--使用<jsp:forward>标签跳转到forwarddemo04.jsp--%>
<%--使用<jsp:param>标签向forwarddemo04.jsp传递参数--%>
<jsp:forward page="/forwarddemo04.jsp">
    <jsp:param name="ref1" value="hello" />
    <jsp:param name="ref2" value="gacl" />
</jsp:forward>

forwarddemo04.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<h1>跳转之后的页面!!</h1>
<h1>接收从forwarddemo03.jsp传递过来的参数:</h1>
<h1>ref1:<%=request.getParameter("ref1")%></h1>
<h1>ref2:<%=request.getParameter("ref2")%></h1>

运行结果如下:


JSTL 标签

JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能

根据JSTL标签所提供的功能,可以将其分为5个类别。

  • 核心标签
  • 格式化标签
  • SQL 标签
  • XML 标签
  • JSTL 函数

JSTL标签库使用步骤

  • 引入对应的 taglib

  • 使用其中的方法

  • 在 Tomcat 的 lib 下也需要引入 jstl 的包,否则会报错:JSTL 解析错误

    复制 jstl jar 包的绝对路径,找到 jar 包,复制到 tomcat\apache-tomcat-9.0.60\lib 下

  • standard 包也需要复制到 lib


在 web 目录下新建 core.jsp

c:if

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h4>if测试</h4>
    <hr>
    <form action="core.jsp" method="get">
        <%--
            EL表达式获取表单中的数据
            ${param.参数名}
        --%>
        <input type="text" name="username" value="${param.username}">
        <input type="submit" value="登录">
    </form>

    <%--判断如果提交的用户名是管理员,则登录成功, var是接收test的返回值:false或者true--%>
    <c:if test="${param.username=='admin'}" var="isAdmin">
        <c:out value="管理员欢迎您!"/>
    </c:if>

    <%--自闭合标签--%>
    <c:out value="${isAdmin}"/>
</body>
</html>

c:choose
c:when

<body>
    <h4>choose,when测试</h4>
    <hr>
    <%--定义一个变量score,值为55--%>
    <c:set var="score" value="55"/>

    <c:choose>
        <c:when test="${score>=90}">
            你的成绩为优秀
        </c:when>
        <c:when test="${score>=80}">
            你的成绩为一般
        </c:when>
        <c:when test="${score>=70}">
            你的成绩为良好
        </c:when>
        <c:when test="${score<=60}">
            你的成绩为不及格
        </c:when>
    </c:choose>
</body>

c:forEach

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h4>forEach测试</h4>
    <hr>
    <%
        ArrayList<String> people = new ArrayList<>();
        people.add(0,"张三");
        people.add(1,"李四");
        people.add(2,"王五");
        people.add(3,"赵六");
        people.add(4,"田六");
        request.setAttribute("list",people);
    %>
    <%--
        var , 每一次遍历出来的变量
        items, 要遍历的对象
        begin, 哪里开始
        end,  到哪里
        step, 步长
    --%>
    <c:forEach var="people" items="${list}">
        <c:out value="${people}"/> <br>
    </c:forEach>

    <hr>

    <c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
        <c:out value="${people}"/> <br>
    </c:forEach>

</body>
</html>
posted @ 2022-05-30 16:54  无关风月7707  阅读(75)  评论(0编辑  收藏  举报