zoukankan      html  css  js  c++  java
  • JavaWeb---总结(十)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标签引入资源

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
    2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    3 <html>
    4 <head>
    5 <title>jsp的jsp:include标签测试</title>
    6 </head>
    7
    8 <body>
    9 <%--使用jsp:include标签引入其它JSP页面--%>
    10 <jsp:include page="/jspfragments/head.jsp"/>
    11 <h1>网页主体内容</h1>
    12 <jsp:include page="/jspfragments/foot.jsp"/>
    13 </body>
    14 </html>

    运行结果:

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

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

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

    demo.jsp:

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

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

    范例:使用@include包含内容

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

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

      

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

      运行JspIncludeTagDemo01.jsp,结果如下:

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

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

    范例:使用动态包含

    1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    2 <h1>JspIncludeTagDemo02.jsp</h1>
    3 <%!4 int i=10;
    5 %>
    6
    7 <h1>JspIncludeTagDemo02.jsp中i的值为:<%=i%></h1>
    8 <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

    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页面,如下所示:

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
    2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    3 <html>
    4 <head>
    5 <title>jsp的Include指令测试</title>
    6 </head>
    7
    8 <body>
    9  <%--使用include标签引入引入jspf页面--%>
    10 <%@include file="/jspfragments/head.jspf" %>
    11 <h1>网页主体内容</h1>
    12 <%@include file="/jspfragments/foot.jspf" %>
    13 </body>
    14 </html>

      

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

      

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

      

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

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
    2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    3 <html>
    4 <head>
    5 <title>jsp的jsp:include标签测试</title>
    6 </head>
    7
    8 <body>
    9 <%--使用jsp:include标签引入其它JSPf页面--%>
    10 <jsp:include page="/jspfragments/head.jspf"/>
    11 <h1>网页主体内容</h1>
    12 <jsp:include page="/jspfragments/foot.jspf"/>
    13 </body>
    14 </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文件的映射

    如下所示:

     1     <!-- 让jspf扩展名同样成为JSP Servlet处理的文件。 --> 2     <servlet-mapping> 
    3 <servlet-name>jsp</servlet-name>
    4 <url-pattern>*.jspf</url-pattern>
    5 </servlet-mapping>
    6 <!-- 让jsp扩展名同样成为JSP Servlet处理的文件。 --> 7 <servlet-mapping>
    8 <servlet-name>jsp</servlet-name>
    9 <url-pattern>*.jsp</url-pattern>
    10 </servlet-mapping>

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

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

      两种写法的效果都是一样的。

    添加这样的配置信息后,此时tomcat服务器就可以正常解析执行*.jspf文件了,如下所示:

      

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

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

      

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

     1 <servlet>
    2 <servlet-name>jsp</servlet-name>
    3 <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    4 <init-param>
    5 <param-name>fork</param-name>
    6 <param-value>false</param-value>
    7 </init-param>
    8 <init-param>
    9 <param-name>xpoweredBy</param-name>
    10 <param-value>false</param-value>
    11 </init-param>
    12 <load-on-startup>3</load-on-startup>
    13 </servlet>

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

    1     <!-- The mappings for the JSP servlet -->
    2 <servlet-mapping>
    3 <servlet-name>jsp</servlet-name>
    4 <url-pattern>*.jsp</url-pattern>
    5 <url-pattern>*.jspx</url-pattern>
    6 </servlet-mapping>

    在这里可以看到,名字为jsp的那个Servlet只支持*.jsp和*.jspx两种扩展名,因此可以在这个地方添加多一个<url-pattern>*.jspf</url-pattern>,如下所示:

    1     <!-- The mappings for the JSP servlet -->2     <servlet-mapping>
    3 <servlet-name>jsp</servlet-name>
    4 <url-pattern>*.jsp</url-pattern>
    5 <url-pattern>*.jspx</url-pattern>
    6 <url-pattern>*.jspf</url-pattern>
    7 </servlet-mapping>

      经过这样的配置之后,Tomcat服务器就可以正常解析和执行*.jspf文件了。

    2.3、<jsp:forward>标签

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

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

    forwarddemo01.jsp

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

    forwarddemo02.jsp

    1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <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

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

    Inc.jsp

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

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

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

      

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

    forwarddemo03.jsp

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

    forwarddemo04.jsp

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

    运行结果如下:

      

  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6219040.html
Copyright © 2011-2022 走看看