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.jspf和foot.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.jspf和foot.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.jspf和foot.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>
运行结果如下:
JavaWeb---总结(十)JSP标签的更多相关文章
- javaweb学习总结(十九)——JSP标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- JavaWeb学习 (十八)————JSP标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- javaweb(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- javaweb(十九)——JSP标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- javaWeb 使用jsp标签进行防盗链
/** * 1.新建类继承SimpleTagSupport * 新建2个属性, 添加对应的set方法 * 覆盖doTag()方法 */ import java.io.IOException; impo ...
- JavaWeb之 JSP:内置对象,EL表达式,JSP标签基础
JSP的内置对象 什么是JSP的内置对象呢? 在JSP页面进行编程的时候,如果我们要使用一些对象,如:HttpSession,ServletConfig,ServletContext这些对象,如果每次 ...
- javaWeb学习总结(8)- JSP标签(6)
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- javaweb之jsp标签
1.JSP标签简介 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 2.JSP常用标签 ...
- JavaWeb学习之JSP(二) JSP标签
JSP常用标签 什么是JSP标签 JSP标签,有的地方也叫做JSP动作,在JSP中编写大量的java代码会使JSP页面显得杂乱无章,看起来非常不舒服,因此JSP提供了一些类似html的标签,通过这些标 ...
随机推荐
- Bootstrap系列 -- 40. 导航条二级菜单
在导航条中添加二级菜单也非常简单 <div class="navbar navbar-default" role="navigation"> < ...
- .Net相关
Lucene 全文搜索 http://lucenenet.apache.org/ Memcached 分布式缓存 http://memcached.org/ selenium UI自动化测试 http ...
- MATLAB读取和写入Excel文件
1. 读取Excel文件 (a) 命令方式xlsread: 读取命令:[data,text] = xlsread(FileName, SheetName, Range); data保存的是数据单元 ...
- jvm中的动态分派
动态分派与复写密不可分,因为java中存在向上转型,这样就涉及到方法的调用问题.先看一下示例代码 package com.dy.xidian; class Test1 { public void sa ...
- 如何设置div高度为100%
div高度通常都是固定值,直接将div高度设为100%是无效的,那么如何设置才能有效呢? 直接给div设置height:100%即可,无效的原因一定是父元素的高度为0,最常见的就是给body的直接元素 ...
- iOS 自定义NavigationBar右侧按钮rightBarButtonItem--button
//两个按钮的父类view UIView *rightButtonView = [[UIView alloc] initWithFrame:CGRectMake(, , , )]; //历史浏览按钮 ...
- PHP 文件创建/写入
<?php /* PHP 文件创建/写入 fopen() 函数也用于创建文件.也许有点混乱, 但是在 PHP 中,创建文件所用的函数与打开文件的相同. 如果您用 fopen() 打开并不存在的文 ...
- mysql explain知道
- Ubuntu下安装Django
正式开始Django学习历程.要用Django第一步就是要配置好环境啊. 我的配置: OS: Ubuntu 12.10 Server: Apache 2. ...
- poj1655 树的重心 树形dp
树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 处理处每个节点的孩子有几个,和树的大小就好了. #include< ...