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

运行结果如下:

  


Java Web学习总结(18)——JSP标签的更多相关文章

  1. Java Web学习笔记之---JSP

    Java Web学习笔记之---JSP (一)JSP常用语法 (1)HTML注释 <!--所要注释的内容 --> 在客户端显示一个注释. (2)隐藏注释 <%--所要注释的内容--% ...

  2. [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. java web学习之初识jsp

    用java语言(+html语言)开发动态资源的技术: jsp的运行过程,1:tomcat服务器将jsp代码翻译成java代码,并且编译成class文件 2:tomcat服务器构造类对象 3:tomca ...

  4. java web学习笔记-jsp篇

    1.java web简介 1.1静态页面与动态页面   表现形式 所需技术 静态网页 网页内容固定,不会更新 html,css 动态网页 网页内容由程序动态显示,自动更新 html,css,DB,ja ...

  5. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  6. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Java Web学习笔记之---EL和JSTL

    Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression  Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...

  8. JAVA Web学习笔记

    JAVA Web学习笔记 1.JSP (java服务器页面) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . JSP全名为Java Server Pages,中文名叫java服务器 ...

  9. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  10. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 【Henu ACM Round#14 E】Kefa and Watch

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 在做之前需要了解一个知识点. 就是如果一个字符串s是一个a循环串. (字符串的长度设为n,下标从1开始 那么s[1..n-a]和s[ ...

  2. cogs 1755. 爱上捉迷藏

    1755. 爱上捉迷藏 ☆   输入文件:kadun.in   输出文件:kadun.out   简单对比时间限制:0.001 s   内存限制:2 MB [背景] 乃们都玩过赛尔号吧……,那有木有玩 ...

  3. JAVA基础针对自己薄弱环节总结02(循环)

    循环 A:水仙花. classShuiXianHua { public static void main(String[] args) { for(int i=101;i<1000;i++) { ...

  4. android图像处理系列之五-- 给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  5. a标签中的javascript:;是什么

    a标签中的javascript:;是什么 一.问题 <a>标签中href="javascript:;"表示什么意思?? <a id="jsPswEdit ...

  6. CHROME开发者工具的小技巧

    我猜不能转载,但是必须分享. http://coolshell.cn/articles/17634.html

  7. 4. Brackets 前端编辑器试用

    转自:https://blog.csdn.net/wuji3390/article/details/71170579 Brackets编辑器介绍 "一个现代的,开源的,了解网页设计的编辑器& ...

  8. js实现 导航移入移出效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Spring模块作用

    0.模块整理 Spring模块整理(http://www.kuqin.com/shuoit/20150805/347434.html) 模块名 作用 资料 aop  spring的面向切面编程,提供A ...

  10. php开启openssl扩展

    windows下开启方法: 1: 首先检查php.ini中:extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘:’, 如果不存在这行,那么添加extensio ...