• jsp的标签


    一、JSP标签介绍

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

    二、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>
    

    运行结果:

    2.2<jsp:include>标签与include指令的区别

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

    通过下面的例子来说明<jsp:include>标签与include指令的区别

    demo.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     <%!
         int i=1000;
     %>
     <h1>demo.jsp中i的值为:<%=i%></h1>

    分别使用include指令和<jsp:include>标签两种包含语句,包含以上的demo.jsp

    范例:使用@include包含内容

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%!
         int i=10;
     %>
     <h1>JspIncludeTagDemo01.jsp中i的值为:<%=i%></h1>
    <h1><%@include file="/jspfragments/demo.jsp"%></h1>
    

    此时在编译jsp时就已经提示出错了,如下所示:

     

    这个错误说的是变量i已经重复定义了

      运行JspIncludeTagDemo01.jsp,结果如下:

    运行后发现出现了重复定义变量i的错误提示信息,因为静态包含是将全部内容包含进来之后,再进行处理,属于先包含后处理。由于被包含进来的页面demo.jsp中定义了一个变量i,而包含页面JspIncludeTagDemo01.jsp本身又定义了一个变量i,所以服务器在处理JspIncludeTagDemo01.jsp这个页面时就会发现里面有两个重复定义的变量i,因此就会报错。

    而如果现在使用的是<jsp:include>动态包含的话,观察以下程序:

    范例:使用动态包含

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <h1>JspIncludeTagDemo02.jsp</h1>
    <%!
        int i=10;
    %>
    
    <h1>JspIncludeTagDemo02.jsp中i的值为:<%=i%></h1>
    <h1><jsp:include page="/jspfragments/demo.jsp" /></h1>
    

    运行结果:

    发现结果已经可以正确地显示,而且不会互相影响,这是因为使用jsp:include属于动态包含,动态包含就是指先将各个页面分别处理,处理完之后再将处理后的结果包含进来。
      不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。

    2.3、*.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

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

    foot.jspf

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <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页面生成的源代码,如下所示:

    可以看到,head.jspffoot.jspf中的<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>没有解析执行,而是原封不动地作为文本内容输出到页面上了,在IE下看不到<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>的输出,在google和火狐浏览器下运行可以看到页面上输出<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>,如下所示:

     

    这说明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>
    

    上面的配置方式也可以简写成这样:  

     

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

    2.3、<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.4、<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>

    运行结果如下:

      

      

     

      

     

      

  • 相关阅读:
    剑指 Offer 22. 链表中倒数第k个节点
    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
    Leetcode1450. 在既定时间做作业的学生人数
    Leetcode1572. 矩阵对角线元素的和
    Leetcode 1480. 一维数组的动态和
    Idea连接数据库报错
    Java实现二叉树层次遍历并存入List的方法:从上往下,从左往右
    SpringCloud资源网站
    Java循环对list进行remove
    Java中字符串判空的正确打开方式
  • 原文地址:https://www.cnblogs.com/sunli0205/p/5924153.html
Copyright © 2020-2023  润新知