06月07, 2019

Java Web--JSP--JSP标签

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个servlet,这2个servlet的内容在执行时进行合并。

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

通过下面的例子来说明<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已经重复定义了

运行@include.jsp,结果如下:

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

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

<%!
    int i=10;
%>
<h1>demo.jsp中i的值为:<%=i%></h1>
<h1><jsp:include page="/jspfragments/demo.jsp" /></h1>

运行结果:

发现结果已经可以正确地显示,而且不会互相影响,这是因为使用jsp:include属于动态包含,动态包含就是指先将各个页面分别处理,处理完之后再将处理后的结果包含进来。

动态包含和静态包含的区别:

  1. 静态包含时,包含页面和被包含页面中的html.head,body等标签总共只有出现一次,否则会报错;而动态包含不会。
  2. 静态包含不会检查所包含文件中的变化;但是动态包含,可以检查所含文件中的变化,并且可以带参数
  3. 静态包含是先将文件中内容导入被包含的文件中,再一起编译,最后再展现给用户(先包含再编译)
  4. 动态包含可以自动区分被包含文件是静态的还是动态的,如果是静态,则与静态包含一样处理;若是动态页面,
  5. 则可以先进行动态的处理,再将结果包含进来。(先编译再包含)

2.3、<jsp:forward>标签

<jsp:forward>标签用于把请求转发给另外一个资源。

语法:

<jsp:forward page="relativeURL | <%=expression%>" />

page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。

jsp_forward01.jsp

<body>
<%--使用<jsp:forward>标签跳转到jsp_forward02.jsp--%>
<jsp:forward page="/jspfragments/jsp_forward02.jsp"/>
</body>

jsp_forward02.jsp

<body>
<h1>跳转之后的页面</h1>
</body>

运行结果如下: 从页面的显示效果来看,页面已经完成了跳转,但地址栏没有变化,地址栏中显示的地址还是jsp_forward01.jsp,但页面显示的内容却是jsp_forward02.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_param01.jsp:

<jsp:include page="/jspfragments/jsp_param02.jsp">
    <jsp:param name="parm1" value="hello" />
    <jsp:param name="parm2" value="world" />
</jsp:include>

jsp_param02.jsp:

<h1>接收从jsp_param01.jsp页面中传递过来的参数:</h1>
<h2><%=request.getParameter("parm1")%></h2>
<h2><%=request.getParameter("parm2")%></h2>

运行结果:

本文链接:http://www.yanhongzhi.com/post/jsp_6.html

-- EOF --

Comments