博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSP 技术(二)--详解
阅读量:5025 次
发布时间:2019-06-12

本文共 12380 字,大约阅读时间需要 41 分钟。

1 JSP指令                                                                                                       

  为了设置JSP页面中的一些信息,Sun公司提供了不提的JSP指令。JSP指令(directive)是为JSP引擎而设计的。它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

  jap的三个指令:

  • page指令
  • include指令
  • taglib指令

  JSP指令的基本语法格式<%@ 指令 属性名="值" %>。如果一个指令有多个属性,多个属性可以写在一个指令中,也可以分开写。

1.1 page指令

  page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

语法格式<%@ page 属性名1="值1"  属性名2="值2" ...%>

JSP指令常用的属性:

  (1)language:java。指明解释该JSP文件时采用的语言,默认为java。

  (2)import:任何包名和类名。指定JSP页面翻译称Servlet源文件中导入的包或类。import是唯一可以声明多次的page指令属性。一个import属性可以引用多个类,中间用(,)隔开。

可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号(,)分隔。例如:以下互相等价

1 <%@ page import="java.util.*,java.io.*,java.sql.*"%>
1 <%@ page import="java.util.*"%>2 <%@ page import="java.io.*" %>3 <%@ page import="java.sql.*" %>

  (3)session:true和false。指明该JSP内是否内置Session对象,如果为true,则说明内置了Session对象,可以直接使用,否则没有内置Session对象。在默认情况下,session属性值为true。

  (4)isErrorPage:true和false。指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,可直接使用。在默认情况下,isErrorPage的值为false。

 例如:将3.jsp页面显式声明为错误处理页面

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" isErrorPage="true"%> 3  4  5  6 
7 错误信息提示 8 9 10 输入有误 <%=exception.getMessage() %> //不会报错11 12

3.jsp页面显式声明为错误处理页面后,Jsp引擎在将jsp页面翻译成Servlet的时候,在Servlet的 _jspService方法中会声明一个exception对象,然后将运行jsp出错的异常信息存储到exception对象中。如下所示:

若没有设置isErrorPage="true",.java 文件如下:

  (5)errorPage:某个JSP页面的相对路径。指定一个出错后跳转的页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。errorPage指定页面的isErrorPage属性为true,且内置的exception对象为未捕捉的异常。

比如1.jsp如下:

1 <%@ page language="java" errorPage="/2.jsp" pageEncoding="UTF-8" %> 2  3  4  5 
6 测试page指令的errorPage属性 7 8 9 This is my first JSP 10 <%11 int x = 5/0;12 %>13 14

在1.jsp中,page指令的errorPage属性指明了出错后跳转到"/2.jsp",error.jsp页面代码如下:

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8"%> 3  4  5  6 
7 错误信息提示 8 9 10 输入有误 11 12

运行结果如下:

  • errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前Web应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面
  • 可以在web.xml文件中使用<error-page>元素为整个Web应用程序设置错误处理页面。
  • <error-page>元素有3个子元素,<error-code>、<exception-type>、<location>
  • <error-code>子元素指定错误的状态码,例如:<error-code>404</error-code>
  • <exception-type>子元素指定异常类的完全限定名,例如:<exception-type>java.lang.ArithmeticException</exception-type>
  • <location>子元素指定以“/”开头的错误处理页面的路径,例如:<location>/ErrorPage/404Error.jsp</location>
  • 如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。

例如:使用<error-page>标签配置针对404错误的处理页面

web.xml的代码下

1 
6
7
8
index.jsp
9
10 11
12
13
404
14
/404Error.jsp
15
16

404Error.jsp代码如下:

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8"%> 3  4  5  6 
7 404错误友好提示页面 8 9 10 对不起,你要访问的页面没找到!
12
13 3秒钟后自动跳转回首页,如果没跳转请点击这里14 15

${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> 。

也就是取出部署的应用程序名或者是当前的项目名称

当访问一个不存在的web资源时,就会跳转到在web.xml中配置的404错误处理页面404Error.jsp,如下图所示:

  (6)contentType:有效的文档类型。客户端浏览器根据该属性判断文档类型,例如,HTML格式为text/html、纯文本格式为text/plain、JPG图像为image/jpeg、GIF图像为image/gif、word文档为application/maword.

  (7)pageEnCoding:当前页面。指定页面编码格式。

 

1.2 include指令

  静态包含:把其它资源包含到当前页面中。<%@ include file="/include/header.jsp" %>:在翻译时就把两个文件合并

  动态包含<jsp:include page="/include/header.jsp"></jsp:include>:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

原则:能用静的就不用动的。

 

1.3 taglib指令

  作用:在JSP页面中导入JDTL标签库。替换jsp中java代码片段。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 

2 JSP 隐式对象                                                                   

  在JSP页面中,有一些对象需要频繁使用,如果每次都创建这些对象会非常麻烦,为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,他们是JSP默认创建的,可以直接在JSP页面中使用。

名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 用于用户请求信息
response javax.servlet.http.HttpServletResponse 服务端想客户端回应信息
session javax.servlet.http.HttpSession 用于保存用户信息
application javax.servlet.ServletContext 所有用户共享信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
pageContext javax.servlet.jsp.PageContext JSP页面容器
page java.lang.Object 将当前页面转换后的Servlet类实例
exception java.lang.Throwable 表示JSP页面发生的异常,仅在错误页面中能起作用

2.1 out对象

  out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。都是用于向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一直带缓存功能的PrintWriter。

  JSP页面的out对象与Servlet引擎提供的缓冲区之间的工作关系如图:

  通过out对象写入数据相当于将数据插入到JspWriter对象的缓冲去区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正的写入到Servlet引擎所提供的缓冲区中。

  只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

  • 设置page指令的buffer属性关闭了out对象的缓存功能
  • out对象的缓冲区已满
  • 整个JSP页面结束

例如:

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" isErrorPage="true"%> 3  4  5  6 
7 6 8 9 10 <%11 out.println("First
");12 response.getWriter().print("second
");13 %>14 15

结果如下图:

  尽管out.println();语句在response.getWriter().print();语句之前,在输出的内容在其后面。说明out对象通过print语句写入数据后,直到整个JSP页面结束,out对象中输入的缓冲区的数据(即First)才真正写入Servlet引擎提供的缓冲区中,而response.getWriter().print();语句则直接把内容写入Servlet引擎提供的缓冲区中。Servlet引擎按照缓冲区中的数据存放顺序输出内容。

2.2 page对象

  page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可

2.3 pageContext对象

   pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等

  •  Exception getException方法返回exception隐式对象
  • Object getPage方法返回page隐式对象
  • ServletRequest getRequest方法返回request隐式对象
  • ServletResponse getResponse方法返回response隐式对象
  • ServletConfig getServletConfig方法返回config隐式对象
  • ServletContext getServletContext方法返回application隐式对象
  • HttPSession getSession方法返回session隐式对象
  • JspWriter getOut方法返回out隐式对象

pageContext作为域对象

  pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。

  pageContext对象的常用方法 

1 void setAttribute(String name,Object value,int scope) //用于设置pageContext对象的属性2 Object getAttribute(String name,int scope)            //用于获取pageContext对象的属性3 void removeAttribute(String name,int scope)           //删除指定范围内名称为name的属性4 void removeAttribute(String name)                     //删除所有范围内名称为name的属性5 Object findAttribute(String name)                     //从四个对象中查找名称为name的属性

  scope指定属性的作用范围,pageContext对象的作用范围有四个值

  (1)pageContext.PAGE_SCOPE:表示页面范围

  (2)pageContext.REQYEST_SCOPE:表示请求范围

  (3)pageContext.SESSION_SCOPE:表示会话范围

  (4)pageContext.APPLICATION_SCOPE:表示web应用程序范围

  findAttribute方法,这个方法是用来查找各个域中的属性的,当要查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。

例如:使用pageContext的findAttribute方法查找属性值

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" isErrorPage="true"%> 3  4  5  6 
7 7 8 9 10 <%11 pageContext.setAttribute("name1", "page");12 pageContext.setAttribute("name2", "name2_page");13 request.setAttribute("name2", "name2_request");14 session.setAttribute("name3", "name3_session"); 15 application.setAttribute("name3", "name3_application");16 application.setAttribute("name4", "name4_application");17 %>18 <%19 //使用pageContext的findAttribute方法查找属性,由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型20 //查找name1属性,按照顺序"page→request→session→application"在这四个对象中去查找21 String refName1 = (String)pageContext.findAttribute("name1");22 String refName2 = (String)pageContext.findAttribute("name2");23 String refName3 = (String)pageContext.findAttribute("name3");24 String refName4 = (String)pageContext.findAttribute("name4");25 String refName5 = (String)pageContext.findAttribute("name5");//查找一个不存在的属性26 %>27

pageContext.findAttribute方法查找到的属性值:

28
pageContext对象的name1属性:<%=refName1%>
29
request对象的name2属性:<%=refName2%>
30
session对象的name3属性:<%=refName3%>
31
application对象的name4属性:<%=refName4%>
32
查找不存在的name5属性:<%=refName5%>
33

34 35

 结果:

2.4 exception对象

   exception对象只有在错误处理页面才能使用,即page指令中指定了属性<%@page isErrorPage="true"%>的页面。

例如:3.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" isErrorPage="true" errorPage="/4.jsp"%> 3  4  5  6 
7 3 8 9 10 <%=(5/0) %> 11 12

4.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" isErrorPage="true"%> 3  4  5  6 
7 3 8 9 10 <%=exception.getMessage() %>11 12

运行结果:

3 JSP动作元素                                                                                                    

  JSP动作元素用于控制JSP的行为,执行一些常用的JSP页面动作。通过动作元素可以实现使用多行javadiamante才能实现的效果。如包含页面文件和实现请求转发等。

 jsp的常用标签有以下三个

  • <jsp:include>标签  
  • <jsp:forward>标签  
  • <jsp:param>标签

 3.1 <jsp:include>标签

  在JSP页面中,为了把其他资源的输出内容插入到当前JSP页面的输出内容中,JSP技术提供了<jsp:include>动作元素。基本格式语法

 <jsp:include page="relativeURL" fluse="true|faluse" />

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

flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。

  <jsp:include>包含的原理是将被包含的页面编译处理后将页面包含在页面中。当浏览器第一次请求一个使用<jsp:include>包含其他页面的页面时,Web容器首先会编译被包含的页面,然后编译处理后返回结果包含在页面中,之后编译包含页面,最后将两个页面组合的结果回应给浏览器。

  include指令和<jsp:include>标签的区别:

  (1)<jsp:include>标签中要引用的资源和当前JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。而include指令智能引入遵循JSP格式的文件,被引入的文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件。

  (2)<jsp:include>标签中引入的资源在运行时才包含的,而且只包含运行结果。而include指令令引入的资源在编译时包含的,包含的是源代码。

  (3)<jsp:include>标签运行原理与RequestDisoatcher.include()方法类似,即被包含的页面不能改变响应状态码或者设置响应头,而include指令没有这方面的限制。

示例1: 使用jsp:include标签引入其它JSP页面,8.jsp页面中插入insert1.jsp

8.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" %> 3  4  5  6 
7 8 8 9 10 网页主体内容:jsp:include
11
12 13

insert1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" %>
6 <%--使用jsp:include标签引入其它JSP页面--%> 使用jsp:include标签引入其它JSP页面

编译时会分别产生.class文件:

_8_.java

insert1.java

 

运行结果:

示例2: 使用include指令引入其它JSP页面,9.jsp页面中插入insert2.jsp

 9.jsp 

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" %> 3  4  5  6 
7 9 8 9 10 网页主体内容:include指令
11 <%@include file="/insert2.jsp"%>12 13

 insert2.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" isErrorPage="true"%> 3  4  5  6 
7 6 8 9 10 <%--使用include指令引入其它JSP页面--%>11 使用include指令引入其它JSP页面12 13

编译时仅产生一个.class文件:

 

_9_.java

运行结果:

3.2  <jsp:forward>标签

  <jsp:forward>动作元素将当前请求转发到其他Web资源(HTML页面,JSP页面和Servlet页面),在执行请求转发后的当前页面不再执行,而是执行该元素指定的目标页面。基本语法格式

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

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

示例:使用<jsp:forward>标签跳转页面。10.jsp跳转至11.jsp

 10.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" %> 3  4  5  6 
7 10 8 9 10 网页主体内容:jsp:forward
11
12 13

11.jsp

1 <%@page import="java.util.Date"%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3     pageEncoding="UTF-8" %> 4  5  6  7 
8 11 9 10 11 跳转访问时间:12 <%13 out.print(new Date());14 %>15 16

运行结果:

 

从页面的显示效果来看,页面已经完成了跳转,但地址栏没有变化,地址栏中显示的地址还是10.jsp,但页面显示的内容却是11.jsp中的内容。因为此跳转属于服务器端跳转。只要是服务器端跳转,则地址栏永远没有变化

 3.3 <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:foeward>
  <jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。

 示例:使用<jsp:param>标签向被包含的页面传递参数

 1.使用语法112.jap包含13.jsp

12.jap

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" %> 3  4  5  6 
7 12 8 9 10
11
12
13
14 15

13.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" %>
13 接收从12.jsp页面中传递过来的参数:
<%=request.getParameter("parm1")%> <%=request.getParameter("parm2")%>

运行结果:

 2.使用语法214.jap包含15.jsp

14.jap

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" %> 3  4  5  6 
7 14 8 9 10
11
12
13
14 15

15.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8" %> 3  4  5  6 
7 15 8 9 10 接收从14.jsp页面中传递过来的参数:
11 <%=request.getParameter("parm1")%>12 <%=request.getParameter("parm2")%> 13 14

运行结果

 

参考:

2018-10-06 11:25:48

 

转载于:https://www.cnblogs.com/qqiua/p/9746237.html

你可能感兴趣的文章
ios __block typeof 编译错误解决
查看>>
android 插件形式运行未安装apk
查看>>
ios开发之 manage the concurrency with NSOperation
查看>>
Android权限 uses-permission
查看>>
NSEnumerator用法小结
查看>>
vim如何配置go语言环境
查看>>
机器学习好网站
查看>>
python 中的 sys , os 模块用法总结
查看>>
解题:国家集训队 Middle
查看>>
响应者链
查看>>
指针从函数内部带回返回值
查看>>
在使用webView播放flash或视频文件时无法关闭声音的问题
查看>>
redhat 7 源码安装 mysql5.5.49
查看>>
CCP浅谈
查看>>
NAT虚拟网络配置
查看>>
c#部分---需要实例化的内容;
查看>>
销售类
查看>>
技术项目,问题
查看>>
线程池总结
查看>>
Learning to rank (software, datasets)
查看>>