0
点赞
收藏
分享

微信扫一扫

深入分析JavaWeb 15 -- 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>

运行结果:

深入分析JavaWeb 15 -- jsp标签_jsp页面

  

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时就已经提示出错了,如下所示:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_02

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

  运行​​JspIncludeTagDemo01.jsp​​,结果如下:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_03

  运行后发现出现了重复定义变量​​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>

运行结果:

  

深入分析JavaWeb 15 -- jsp标签_标签_04

  发现结果已经可以正确地显示,而且不会互相影响,这是因为使用​​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.jspf​​​和​​foot.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​​页面,运行结果如下:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_05

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

  

深入分析JavaWeb 15 -- jsp标签_标签_06

  然后再使用​​<jsp:include>​​​“标签将​​"head.jspf​​​和​​foot.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​​页面,运行结果如下:

深入分析JavaWeb 15 -- jsp标签_标签_07

  查看浏览器解析​​JspIncludeTagTest.jsp​​页面生成的源代码,如下所示:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_08

  可以看到,​​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"%>​​,如下所示:

  

深入分析JavaWeb 15 -- jsp标签_java_09

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

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

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

  

深入分析JavaWeb 15 -- jsp标签_jsp_10

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

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

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_11

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

<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

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

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>

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

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
<url-pattern>*.jspf</url-pattern>
</servlet-mapping>

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

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>

运行结果如下:

  

深入分析JavaWeb 15 -- jsp标签_java_12

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

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_13

范例:使用<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>

运行结果如下:

 

深入分析JavaWeb 15 -- jsp标签_java_14

 


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

运行结果:

深入分析JavaWeb 15 -- jsp标签_jsp页面

  

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时就已经提示出错了,如下所示:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_02

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

  运行​​JspIncludeTagDemo01.jsp​​,结果如下:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_03

  运行后发现出现了重复定义变量​​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>

运行结果:

  

深入分析JavaWeb 15 -- jsp标签_标签_04

  发现结果已经可以正确地显示,而且不会互相影响,这是因为使用​​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.jspf​​​和​​foot.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​​页面,运行结果如下:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_05

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

  

深入分析JavaWeb 15 -- jsp标签_标签_06

  然后再使用​​<jsp:include>​​​“标签将​​"head.jspf​​​和​​foot.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​​页面,运行结果如下:

深入分析JavaWeb 15 -- jsp标签_标签_07

  查看浏览器解析​​JspIncludeTagTest.jsp​​页面生成的源代码,如下所示:

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_08

  可以看到,​​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"%>​​,如下所示:

  

深入分析JavaWeb 15 -- jsp标签_java_09

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

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

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

  

深入分析JavaWeb 15 -- jsp标签_jsp_10

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

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

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_11

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

<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

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

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>

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

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
<url-pattern>*.jspf</url-pattern>
</servlet-mapping>

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

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>

运行结果如下:

  

深入分析JavaWeb 15 -- jsp标签_java_12

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

  

深入分析JavaWeb 15 -- jsp标签_jsp页面_13

范例:使用<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>

运行结果如下:

 

深入分析JavaWeb 15 -- jsp标签_java_14

 

举报

相关推荐

0 条评论