Java Web基础入门第二十五讲 JSP技术——JSP标签(上)

JSP标签介绍

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

JSP常用标签

JSP的常用标签有以下三个:
在这里插入图片描述

<jsp:include>标签

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

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

例如,使用<jsp:include>标签引入资源。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP的jsp:include标签测试</title>
</head>
<body>
	<%--使用jsp:include标签引入其它JSP页面--%>
    <jsp:include page="/public/head.jsp"></jsp:include>
    <h1>使用jsp:include标签引入其它JSP页面</h1><br/>
    <jsp:include page="/public/foot.jsp"></jsp:include>
</body>
</html>

使用浏览器访问以上JSP页面,运行结果如下:
在这里插入图片描述

<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" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:include标签与include指令的区别</title>
</head>
<body>
	<%!
        int i = 1000;
    %>
    <h1>demo.jsp中i的值为:<%=i %></h1>
</body>
</html>

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

  • 在demo1.jsp页面中使用@include指令包含内容

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>jsp:include标签与include指令的区别</title>
    </head>
    <body>
    	<%!
            int i = 10;
        %>
        <h1>demo1.jsp中i的值为:<%=i %></h1>
        <%@ include file="/demo.jsp" %>
    </body>
    </html>
    

    此时在编译JSP时就已经提示出错了,如下所示:
    在这里插入图片描述
    这个错误说的是变量i已经重复定义了。访问demo1.jsp,Eclipse控制台打印如下异常:
    在这里插入图片描述
    访问后发现出现了重复定义变量i的错误提示信息,因为静态包含是将全部内容包含进来之后,再进行处理,属于先包含后处理。由于被包含进来的页面demo.jsp中定义了一个变量i,而包含页面demo1.jsp本身又定义了一个变量i,所以服务器在处理demo1.jsp这个页面时就会发现里面有两个重复定义的变量i,因此就会报错。
    而如果现在使用的是<jsp:include>动态包含的话,观察以下程序。

  • 在demo1.jsp页面中使用动态包含

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>jsp:include标签与include指令的区别</title>
    </head>
    <body>
    	<%!
            int i = 10;
        %>
        <h1>demo1.jsp中i的值为:<%=i %></h1>
        <jsp:include page="/demo.jsp"></jsp:include>
    </body>
    </html>
    

    访问demo1.jsp,运行结果如下:
    在这里插入图片描述
    发现结果已经可以正确地显示,而且不会互相影响,这是因为使用<jsp:include>属于动态包含,动态包含就是指先将各个页面分别处理,处理完之后再将处理后的结果包含进来

不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。

*.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" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <h1 style="color:red;">网页头部</h1>
    
  • foot.jspf页面的内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <h1 style="color:blue;">网页尾部</h1>
    

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP的Include指令测试</title>
</head>
<body>
	<%-- 使用include指令引入jspf页面 --%>
	<%@ include file="/public/head.jspf" %>
	<h1>网页主体内容</h1>
	<%@ include file="/public/foot.jspf" %>
</body>
</html>

访问IncludeTagTest.jsp页面,运行结果如下:
在这里插入图片描述
jspf文件的内容会被解析并执行其中的JSP指令和tag,查看浏览器解析IncludeTagTest.jsp页面生成的源代码,如下所示:
在这里插入图片描述
然后再使用<jsp:include>标签将"head.jspf"和"foot.jspf" include到IncludeTagTest1.jsp页面中,如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP的jsp:include指令测试</title>
</head>
<body>
	<%-- 使用jsp:include标签引入其它JSPf页面 --%>
	<jsp:include page="/public/head.jspf"></jsp:include>
	<h1>网页主体内容</h1>
	<jsp:include page="/public/foot.jspf"></jsp:include>
</body>
</html>

访问IncludeTagTest1.jsp页面,运行结果如下:
在这里插入图片描述
查看浏览器解析IncludeTagTest1.jsp页面生成的源代码,如下所示:
在这里插入图片描述
可以看到,head.jspf和foot.jspf中的

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

没有解析执行,而是原封不动地作为文本内容输出到页面上了,在IE下是看不到其输出的,在Google Chrome和Firefox浏览器下访问则可以看到其输出。这说明对于Tomcat服务器而言,jspf文件被当作纯文本文件处理了,没有当作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>
    

    两种写法的效果都是一样的。添加这样的配置信息后,此时Tomcat服务器就可以正常解析执行*.jspf文件了,如下所示:
    在这里插入图片描述

  • 解决办法二:修改Tomcat服务器的web.xml文件,添加对扩展名为*.jspf文件的映射。找到Tomcat服务器的web.xml文件,如下所示:
    在这里插入图片描述
    找到名字为jsp的那个Servlet,如下所示:
    在这里插入图片描述
    然后根据Servlet名称找到对应的servlet-mapping配置,如下所示:
    在这里插入图片描述
    在这里可以看到,名字为jsp的那个Servlet只支持*.jsp*.jspx两种扩展名,因此可以在这个地方多添加一个<url-pattern>*.jspf</url-pattern>,如下所示:
    在这里插入图片描述
    经过这样的配置之后,Tomcat服务器就可以正常解析和执行*.jspf文件了。

<jsp:forward>标签

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

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

page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
例,有如下两个JSP页面,使用<jsp:forward>标签跳转页面。

  • forwardDemo1.jsp页面的内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>使用jsp:forward标签跳转页面</title>
    </head>
    <body>
    	<%--使用<jsp:forward>标签跳转到forwardDemo2.jsp--%>
    	<jsp:forward page="/forwardDemo2.jsp"></jsp:forward>
    </body>
    </html>
    
  • forwardDemo1.jsp页面的内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>使用jsp:forward标签跳转页面</title>
    </head>
    <body>
    	<h1>跳转之后的页面!!</h1>
    </body>
    </html>
    

在Chrome浏览器上访问forwardDemo1.jsp,运行的结果如下:
在这里插入图片描述
从页面的显示效果来看,页面已经完成了跳转,但地址栏没有变化,地址栏中显示的地址还是forwardDemo1.jsp,但页面显示的内容却是forwarDemo2.jsp中的内容。因为此跳转属于服务器端跳转。只要是服务器端跳转,则地址栏永远没有变化。

<jsp:forward>标签在实际开发中的应用场景

在实际开发中,我们要为网站设置首页,访问首页时,我们要将数据交给Servlet进行处理,但我们又不能在项目的web.xml文件中像下面这样这样配置:

<!-- 这儿是不能配置Servlet的!!! -->
<welcome-file-list>
	<welcome-file>/IndexServlet</welcome-file>
</welcome-file-list>

解决方案是在项目的web.xml中配置网站的首页,如下:

<welcome-file-list>
	<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>

然后在index.jsp在使用<jsp:forward>标签跳转到Servlet,如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- <jsp:forward>标签的应用场景 -->
	<jsp:forward page="/IndexServlet"></jsp:forward>
	这是网站首页!!!
</body>
</html>

<jsp:param>标签

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

  • 语法一:

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

    <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页面,使用<jsp:param>标签向被包含的页面传递参数。

  • IncludeTagTest2.jsp页面的内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>使用jsp:param标签向被包含的页面传递参数</title>
    </head>
    <body>
    	<jsp:include page="/inc.jsp">
    		<jsp:param value="hello" name="parm1"/>
    		<jsp:param value="world" name="parm2"/>
    	</jsp:include>
    </body>
    </html>
    
  • inc.jsp页面的内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>使用jsp:param标签向被包含的页面传递参数</title>
    </head>
    <body>
    	<h1>接收从IncludeTagTest2.jsp页面中传递过来的参数:</h1>
    	<h2><%=request.getParameter("parm1") %></h2>
    	<h2><%=request.getParameter("parm2") %></h2>
    </body>
    </html>
    

在IncludeTagTest2.jsp页面中使用<jsp:include>标签将inc.jsp页面包含进来,使用<jsp:param/>标签向inc.jsp页面传递了两个参数parm1和parm2。使用Chrome浏览器访问IncludeTagTest2.jsp页面,运行的结果如下:
在这里插入图片描述
例二,有如下两个JSP页面,使用<jsp:param>标签向要跳转的页面传递参数。

  • forwardDemo3.jsp页面的内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>使用jsp:param标签向要跳转的页面传递参数</title>
    </head>
    <body>
    	<%
    		int x = 10;
    	%>
    	<%--使用<jsp:forward>标签跳转到forwardDemo4.jsp--%>
    	<%--使用<jsp:param>标签向forwardDemo4.jsp传递参数--%>
    	<jsp:forward page="/forwardDemo4.jsp">
    		<jsp:param value="<%=x %>" name="ref1"/>
    		<jsp:param value="liayun" name="ref2"/>
    	</jsp:forward>
    </body>
    </html>
    
  • forwardDemo4.jsp页面的内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>使用jsp:param标签向要跳转的页面传递参数</title>
    </head>
    <body>
    	<h1>跳转之后的页面!!</h1>
    	<h1>接收从forwardDemo3.jsp传递过来的参数:</h1>
    	<h1>ref1:<%=request.getParameter("ref1") %></h1>
    	<h1>ref2:<%=request.getParameter("ref2") %></h1>
    </body>
    </html>
    

使用Chrome浏览器访问forwardDemo3.jsp页面,运行的结果如下:
在这里插入图片描述

映射JSP

例如,将forwardDemo3.jsp映射为15.html,和Servlet设置一样,只需在项目的web.xml文件中添加如下代码:

<servlet>
	<servlet-name>xxxxxx</servlet-name>
	<jsp-file>/forwardDemo3.jsp</jsp-file>
</servlet>

<servlet-mapping>
	<servlet-name>xxxxxx</servlet-name>
	<url-pattern>/15.html</url-pattern>
</servlet-mapping>

在Chrome浏览器访问,运行的结果如下:
在这里插入图片描述

如何查找JSP页面中的错误

JSP页面中的JSP语法格式有问题,导致其不能被翻译成Servlet源文件,JSP引擎将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。例如,有如下一个页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查找jsp的错误</title>
</head>
<body>
	<%
		int x = 1;
	%>
	
	<%=x; %>
</body>
</html>

Chrome浏览器访问该页面,运行的结果如下:
在这里插入图片描述
JSP页面中的JSP语法格式没有问题,但被翻译成的Servlet源文件中出现了Java语法问题,导致JSP页面翻译成的Servlet源文件不能通过编译,JSP引擎也将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。例如,有如下一个页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查找jsp的错误</title>
</head>
<body>
	<%
		int x = 1 / 0;
	%>
</body>
</html>

Chrome浏览器访问该页面,Eclipse控制台会报如下异常:
在这里插入图片描述
说明_13_jsp.java源文件中的第119行有问题。找到_13_jsp.java源文件,发现第119行代码为:
在这里插入图片描述
所以对照着看就明白JSP中哪儿出现了错误。这类错误是最恶心的!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值