jsp

幻灯片1

JavaServer Pages(JSP)

网页程序设计 

幻灯片2

JSP简介

  1. JavaServer Page
    1. HTML文件中加入Java程序片段(Scriptlet)和JSP标记(Tag),文件后缀通常为.jsp

l 程序片段和JSP标记可以实现操作数据库、重新定向网页以及发送电子邮件等操作

l 服务器端组件,需要Web Container的支持

2015-7-30

2

幻灯片3

JSP生成页面过程 

2015-7-30

3

幻灯片4

JSP工作原理 

l JSP页面的具体执行步骤 

2015-7-30

4

幻灯片5

缓存机制

l 在原来的JSP页面没有发生改变的情况下,任何浏览器向JSP容器发出对该JSP页面的再次请求时,会直接把响应的输出结果发送到浏览器端 

2015-7-30

5

幻灯片6

JSP页面生命周期

l JSP页面生命周期包括两个阶段

l 转换阶段(Translation Phase)

l 执行阶段(Execution Phase)

2015-7-30

6

幻灯片7

转换阶段

l 将JSP页面转换成实现类(Servlet)

l 一般是在接收和处理客户端请求JSP页面时转换

l 也可以在JSP页面初始配置到容器时转换。

l 每个JSP页面最终都会由JSP容器创建对应的实现类。

l JSP容器检查JSP页面语法、生成对应JSP页面的Java实现类(Servlet)的Java源码(.java),并将源码编译成类的字节码文件(.class)。

l 转换阶段生成的页面实现类及对应的编译结果存放位置:workCatalinalocalhost应用程序名orgapachejsp

2015-7-30

7

幻灯片8

执行阶段

l Web容器将请求定位到相应的实例,处理请求、生成响应结果,返回给客户端

2015-7-30

8

幻灯片9

JSP文件结构及主要标签

<%@ page contentType="text/html;charset=gb2312" %>

<%@ page import="java.util.*“ %>

...

<HTML>

  <BODY>

其他 HTML 语言

<%

  符合JAVA 语法的 JAVA 语句

%>

  其他 HTML 语言

  </BODY>

</HTML>

幻灯片10

JSP示例(Hello.jsp)

<HTML>

  <BODY>

    你好<br>

    你好<br>

  </BODY>

</HTML>

<%@ page contentType="text/html;charset=gb2312" %>

<%@ page import="java.util.*"%>

<HTML>

  <BODY>

  <%

  for ( int i=0; i<2; i++ ) 

  {

  %>

     你好<br>

  <%  

  }

  %>

  </BODY>

</HTML>

幻灯片11

HttpJspBase类的继承结构

l java.lang.Object    

l javax.servlet.GenericServlet      

l javax.servlet.http.HttpServlet        

l org.apache.jasper.runtime.HttpJspBase 

l Jsp的本质是Servlet

幻灯片12

JSP执行过程

l  

servlet

servlet 分析器

*.jsp

*.java

*.class

幻灯片13

JSP

l 执行过程

幻灯片14

JSP示例(Hello_Date.jsp)

<%@ page import="java.util.*" %>

<%@ page contentType="text/html;

                  charset=gb2312" %>

<HTML>

  <BODY>

    你好,今天是

  <%

    Date today=new Date();

  %>

    <%=today.getDate()%>号,

    星期<%=today.getDay()%>

  </BODY>

</HTML>

import java.util.*;

response.setContentType("text/html;

               charset=gb2312");

out = pageContext.getOut();

out.write( <HTML>   

         <BODY> 你好,今天是 "); 

Date today=new Date();

out.print(today.getDate());

out.write("号,星期");

out.print(today.getDay());

out.write("    </BODY> </HTML>  ");

servlet文件

JSP文件

幻灯片15

JSP语法概述

l JSP元素分为三种不同的类型 

编译器指令(DIRECTIVE) 例如: <%@ page import=“java.io.*” %>

脚本语法(SCRIPTING) 例如:<%  int i; %>

动作语法(ACTION) 例如: <jsp:forward>,<jsp:getProperty>,<jsp:include>

幻灯片16

脚本语法

l 脚本语法包括

l “HTML注释”:<!— comments -->

l “隐藏注释”:<%-- comments --%>

l “声明”

l “表达式”

l “脚本段”

幻灯片17

JSP注释

l HTML格式注释

l 浏览器端可以看到注释的内容 

l <!-- 这里是HTML格式的注释 - -> 

l JSP代码注释

l 一行或多行

l <%- - 开发人员专用注释标记 - -%>

l Java语言注释

l 单行注释 //;多行 /* */

l Java源文件会保留这些注释 

l 例:expression.jsp 

2015-7-30

17

幻灯片18

HTML注释 

l JSP 语法格式如下:

l <!-- comment [ <%= expression %> ] --> 或

l <!-- 注释 [<%= 表达式 %> ] -->

l 这种注释发送到客户端,但不直接显示,在源代码中可以查看到。

幻灯片19

JSP基本元素 

l JSP页面组成

l 模板数据:指的是JSP引擎不处理的部分,例如代码

l   中的HTML的内容等 ,这些数据会直接传送到客户端的浏览器

l JSP元素:是指将由JSP引擎直接处理的部分,这一部分必须符合JSP语法,否则会导致编译错误。 

l JSP容器支持的元素类型有三种

l 指令元素(Directive Elements)

l 行为元素(Action Elements)

脚本元素(Scripting Elements)

2015-7-30

19

幻灯片20

JSP基本元素

l <html>
<head>
<title>Hi-JSP实验</title>
</head>
<body> 
<%
String Msg = "This is JSP test."; 
out.print("Hello World!");
%>
<h2> <%=Msg%> </h2>
</body>
</html> 

Template data

JSP元素

幻灯片21

指令元素 

l 发生在转换阶段,用来影响Web容器的行为

l 语法格式:

l <%@ 指令名 属性1=”值1” 属性2=”值2” ...%>

l JSP中包括三种指令:

l page指令

l taglib指令

include指令 

2015-7-30

21

幻灯片22

page指令 

l page指令定义JSP页面相关的属性。语法格式如下:

l <%@ page 属性1=”值1” 属性2=”值2” ... %>

l page指令是位置无关的,但由于属性pageEncoding和contentType决定页面的字符编码,因此必须在页面的开始设置。 

l page指令的属性:language、extends、import、session、buffer、autoFlush、isThreadSafe、info、errorPage、isErrorPage、contentType、pageEncoding和isELIgnored等。

2015-7-30

22

幻灯片23

page指令

l 语法格式:

l <%@ page

l [language=“java”]

l [info=“text”]

l [import=“{package.class|package.*},…”]

l [session=“true|false”]

l [contentType=“mimeType[;charset=characterSet]”|”text/html;charset=8859-1”]

l [pageEncoding=“GBK|8859-1|……”]

l [errorPage=“relativeURL”]

l [isErrorPage=“true|false”]

l [buffer=“none|8kb|sizekb”]

l [autoFlush=“true|false”]

l [isELIgnored=“true|false”]

l %>

2015-7-30

23

幻灯片24

page指令

l language属性

l 定义在转换单元中声明、脚本片段和表达式中所使用的语言

l 默认值是java,目前JSP中只能使用java

l 可以不写,如果写必须写在声明、脚本片段和表达式的前面

l 例如:<%@ page language=“java” %>

2015-7-30

24

幻灯片25

page指令

l info属性

l 通常用于定义JSP页面的描述信息。

l 属性值是任意的一个字符串,该字符串与页面一起编译。

l 属性值使用getServletInfo()方法得到。

l 例:infotest.jsp

2015-7-30

25

幻灯片26

page指令

l import属性

l 用于导入JSP文件中要使用到的java包或者类的列表。是唯一一个可以重复使用的属性。

l JSP中默认的导入列表是:java.lang.*;javax.servlet.* ;javax.servlet.jsp.* ;javax.servlet.http.*

l 例如:<%@ page import=“java.io.*,java.util.*” %>

2015-7-30

26

幻灯片27

page指令

l session属性

l 属性值为“true”,在页面中可以使用内部对象session,

l 属性值为“false”,在页面中不允许使用session,

l session的默认值为“true”。

2015-7-30

27

幻灯片28

page指令

l contentType属性

l 用于设置返回浏览器网页的内容类型和字符编码格式。内容类型包括:text/plain,text/html(默认),application/x-msexecl,application/msword等。字符编码格式默认为西欧字符编码ISO-8859-1。

l 如果需要在返回浏览器的HTML页面中显示中文,我们经常会用到字符集GBK。

l 例如:<%@page contentType=“text/html;charset=GBK” %>

2015-7-30

28

幻灯片29

page指令

l pageEncoding属性

l 指定JSP页面的字符编码,默认为ISO-8859-1

l 例如:

l    <%@ page pageEncoding=“GBK”%>

2015-7-30

29

幻灯片30

page指令

l errorPage属性

l 指定当前页面产生异常时的处理文件

l <%@ page errorPage=“Error.jsp”%>

l isErrorPage 属性

l 指定当前JSP页面是否可以作为另一个JSP页面的错误处理页面 

l 如果值为“true”,说明是异常处理页面,能够使用exception对象。

l 如果isErrorPage属性的值为“false”,说明不是异常处理页面,不能够使用exception对象。

l isErrorPage的默认值是false 。

l 例:testError.jsp 和  Error.jsp 

2015-7-30

30

幻灯片31

page指令

l buffer属性

l 指定处理页面输出内容时的缓冲区大小。

l 默认值是8kb。

l 如果buffer的取值为“none”,输出将不使用缓冲,所有输出都直接写到客户端。

l 置缓冲区的大小只能是kb的整数倍,页面的输出首先被写入指定大小的缓冲区内。当缓冲区变满时如何处理取决于autoFlush属性的值

l buffer指定的值只是缓冲区的最小值,JSP容器选择的缓冲区可能比指定的大。

例如:<%@ page buffer=“16kb”%>

2015-7-30

31

幻灯片32

page指令

l autoFlush属性

l autoFlush属性控制的是当页面输出进入缓冲区并且缓冲区变满的情况。

l 如果autoFlush属性取值“true”,那么缓冲区变满之后需要强制输出。

l 如果autoFlush属性取值“false”,那么缓冲区变满之后将引发一个异常。

l autoFlush属性的默认值是“true”。

2015-7-30

32

幻灯片33

page指令

l isELIgnored属性

l JSP2.0中引入了表达式语言(Expression Language,EL),利用EL可以在不使用脚本的情况下构造动态网页。

l isELIgnored属性值为”true”时,会禁止EL表达式的计算。

2015-7-30

33

幻灯片34

声明

l JSP 语法格式如下:

l <%! declaration; [ declaration; ] ... %> 或

l <%  声明; [声明; ] ... %>

幻灯片35

声明

<%@ page language=”java” import=”java.util.*” %>

<html>

<head>

<title> test.jsp </title>

</head>

<body>

<%! int i = 0; %> 

<%  int a, b, c; %>

<%! Date date; %>

</body>

</html>

幻灯片36

表达式

l 用于在页面上输出信息,语法格式如下:

l <%= expression %>

幻灯片37

脚本段 

l JSP 语法格式如下:

l <% code fragment %> 或

l <% 代码 %>

幻灯片38

 包含指令

l include指令:向当前页中插入一个文件的内容。

l JSP 语法格式如下:

l <%@ include file="relativeURL" %> 或

l <%@ include file="相对位置" %>

幻灯片39

JSP内置对象

l JSP 有以下九种内置对象,包括:

l  ·request,请求对象

l ·response,响应对象

l ·pageContext,页面上下文对象

l ·session,会话对象

l ·application,应用程序对象

l ·out,输出对象

l ·config,配置对象

l ·page,页面对象

l ·exception,例外对象

幻灯片40

幻灯片41

2. 隐含对象

l JSP 2.0中有9个隐含对象

JSP隐含对象

实现类

对象说明

request

HttpServletRequest

请求信息

response

HttpServletResponse

响应信息

out

JspWriter

一个带缓冲的页面输出流对象

session

HttpSession

HTTP联机会话信息

application

ServletContext

服务端Servlet上下文信息

pageContext

PageContext

当前JSP页面的上下文信息

config

ServletConfig

JSP页面的Servlet配置信息,由Web应用配置描述文件(web.xml)指定。

page

Object

如同Java中的this

exception

Throwable

异常处理信息

2015-7-30

41

幻灯片42

2. 隐含对象

l 隐含对象是被JSP容器自动定义的变量,具体位置在JSP页面的servlet的_jspService()方法中。因此,仅仅表达式和scriptlet可以使用隐含对象,而声名却不能。

2015-7-30

42

幻灯片43

(1)request对象 

l 包括如下类型的方法:

l 请求有效的属性操作

l 获取HTTP Header信息

l 获取HTTP请求参数,如HTML表单提交的参数信息

l 获取服务器端相关信息,包括服务器名字、地址和端口等

l 获取客户端相关信息,包括客户端名字、地址和端口等

l 获取协议版本、协议

l 获取数据及数据相关信息的操作

l 会话相关方法

l 例1:requestHeader.jsp 

l 例2:requestGet.jsp 

2015-7-30

43

幻灯片44

(1)request对象

l request” 对象代表的是来自客户端的请求,关于它的方法使用较多的是getParameter、getParameterNames和getParameterValues,通过调用这几个方法来获取请求对象中所包含的参数的值

l request.getParameter(“parameterName”)

l 返回给定参数的值,如果参数不存在则返回null。

l String name=request.getParameter("name");

2015-7-30

44

幻灯片45

(1) request对象

l getParameterValues(“parameterName”)

l 返回值类型: 字符串数组 String[]

l 能够取出参数的多个值,主要用于复选框值的获取。

l    String mybox[]; mybox=request.getParameterValues("mybox");

l     if(mybox!=null) { 

l          for(int i=0;i<mybox.length;i++)

l               out.println(mybox[i]); 

    }

2015-7-30

45

幻灯片46

(1) request对象

l setCharacterEncoding(String)

l 设置请求信息所用的字符编码格式,默认为西欧字符编码ISO-8859-1,如果想正确获取请求中的中文信息,需要将字符编码格式设置为GBK或者gb2312。

2015-7-30

46

幻灯片47

(1) request对象

l getParameterNames()

l 返回值类型:枚举类型Enumeration

l 得到所有请求参数的名称

l 例:params.htm params.jsp

2015-7-30

47

幻灯片48

(1) request对象示例

<html><body>

  <form action="./Hello_req.jsp">

    姓名<input type="text" name="UserName">

    <input type="submit"  value="提交">

  </form>

</body></html>

幻灯片49

(1) request对象示例

<%@ page contentType="text/html;gb2312" %>

<%@ page import="java.util.*" %>

<HTML>

  <BODY>

    你好,

  <%! String Name;%>  

  <%

    Name=request.getParameter("UserName");

  %>

  <%=Name%>,

  今天是

  <%

    Date today=new Date();

  %>

    <%=today.getDate()%>号,星期<%=today.getDay()%>

  </BODY>

</HTML>

幻灯片50

(1) request对象示例(输出结果)

<HTML>

  <BODY>

    你好,

独孤求败,

  今天是

  9号,星期1

  </BODY>

</HTML>

幻灯片51

(2) response对象

l 类型:HttpServletResponse

l response对象负责将服务器端的数据发送回浏览器客户端,主要方法包括如下几类:

l HTTP Header信息处理

l 设置数据内容的类型和长度setContentType()。

l 在设置数据类型时,也会设置字符编码。例如,类型设置为"text/html; charset=ISO-8859-1“

l text/html(标准html文件)、text/plain(纯文本文件)、application/x-msexecl(Excel文件)、application/msword(Word文件) 

l 获取输出流。

l 字符数据getWriter() 

l 二进制数据应使用getOutputStream()

2015-7-30

51

幻灯片52

(2) response对象

l 缓冲控制

l 浏览器重定向:sendRedirect(URL) 

l 与行为元素<jsp:forward>直接在服务端重定向不同,该方法需要先返回浏览器,然后由浏览器发送重定向的URL请求,参数中的URL也可以是其他服务器的URL资源。 

l 响应状态控制

l 当需要在会话中存储数据而浏览器不支持Cookies时,使用encodeURL会将会话ID附加到URL后。

l 向浏览器发送Cookie 

l 例1:response1.jsp (Word输出)

l 例2:response2.jsp (no-cache,每隔3秒显示当前时间 )

2015-7-30

52

幻灯片53

(2) response对象

l public void sendRedirect(String url)

l 将对用户端的响应重新定向到指定的url上。

l response的重定向方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令,使浏览器发送重定向的url请求。

l public printWriter getWriter()

l    获取输出流,将字符写到浏览器上。

l    例:responseGetWriter.jsp

l public void setContentType(String type)

l    设置响应的MIME类型

2015-7-30

53

幻灯片54

(2) response对象

l public void addCookie(Cookie cookie)

l 向浏览器发送Cookie。

l public String encodeRedirectURL(String url)

l public String encodeURL()

l 通常,会话管理是通过将session ID作为一个Cookie存储在客户端浏览器中来唯一标识每个用户会话的。上面两个方法首先判断浏览器是否支持Cookie,如果支持,将参数表示的URL原样返回,否则将session ID 和URL一起编码。

2015-7-30

54

幻灯片55

(2) response对象

l 设置浏览器无缓冲:

l    setHeader(“Pragma”,“no-cache”);

l    setHeader(“Cache-Control”,”no-cache”);

l 设置自动刷新

l    response.setHeader(“Refresh”,”30”);

l    //每隔30秒自动刷新当前页面response.setHeader(“Refresh”, “ 10;URL=http://192.168.102.16”);

l    //10秒后加载新的页面

2015-7-30

55

幻灯片56

(3) pageContext对象

l  “pageContext” 对象直译时可以称作“页面上下文”对象,代表的是当前页面运行的一些属性,常用的方法包括findAttribute、getAttribute、getAttributesScope和getAttributeNamesInScope,一般情况下“pageContext” 对象用到得也不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。

l  在pageContext对象中保存的属性,只能在当前页面中去获取,也就是说,pageContext对象具有页面范围 

幻灯片57

(3) pageContext对象

l JSP利用页面上下文对象pageContext获取页面所有相关的信息。

l 通过pageContext对象可以得到当前页面中所有其他的JSP隐含对象。

l pageContext对象还可以访问所有范围的属性和属性名。

2015-7-30

57

幻灯片58

(3) pageContext对象

l pageContext对象方法:

l 获取当前页面的其它JSP隐含对象getXxx():request、response、out、session、application、config、page、exception等

l 页内有效属性的相关操作 getAttribute() setAttribute() removeAttribute() 

l 所有范围的属性操作

l 页面重定向 forward() 

l 页面包含其它页面操作 include ()

l 例:pageContext.jsp,访问不同范围的属性

2015-7-30

58

幻灯片59

(3) pageContext对象

l 获取当前JSP页面的其他隐含对象

l public ServletRequest getRequest()

l public ServletResponse getResponse()

l public JspWriter  getOut()

l public HttpSession getSession()

l public ServletContext getServletContext()

l public ServletConfig getServletConfig()

l public Object getPage()

l public Throwable getException()

2015-7-30

59

幻灯片60

(3) pageContext对象

l 所有范围的属性操作

l public Object getAttribute(String name,int scope) 

l    scope参数的取值可以是PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE, APPLICATION_SCOPE

l public void setAttribute(String name,Object object int scope)

2015-7-30

60

幻灯片61

(3) pageContext对象

l 其中的scope参数用于指定要获取哪一个范围对象的属性,有四个可能的取值,其中PageContext. PAGE_SCOPE表示页面范围,PageContext.REQUEST_SCOPE表示请求范围,PageContext.SESSION_ SCOPE表示会话范围,PageContext.APPLICATION_SCOPE表示Web应用程序范围。

幻灯片62

(3) pageContext对象

l pageContext对象也提供了请求转发的两个方法forward()和include(),其内部实现是调用RequestDispatcher对象的forward()和include()方法。

l 从pageContext对象提供的方法可以看出,pageContext对象实际上是为我们提供了访问其他隐含对象的统一入口,在多数情况下,直接利用pageContext对象就可以完成想要实现的功能。

幻灯片63

(3) pageContext对象

l pageContext的findAttribute方法会依次从四个作用域去找。是按什么先后顺序找的?

l 会按作用域由小到大的顺序来查找.即(page-->request-->session-->application).用pageContext.findAttribute("key");
的好处就是不用指定作用域的类型.只要这四个作用域中有指定的key.就可以得到其对应的value;

幻灯片64

(4) session对象

l session对象的常用方法

l 存储和获取会话有效的属性对象getAttribute()、setAttribute()、removeAttribute()、 getAttributeNames()

l 会话控制invalidate ()、 getMaxInactiveInterval ()、 setMaxInactiveInterval () 

l 会话状态getId ()、 isNew ()、 getCreationTime ()、 getLastAccessedTime ()

l 获取会话相关的Servlet上下文getServletContext () 

l 例:session.jsp 

2015-7-30

64

幻灯片65

(4) session对象

l “session” 对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。“session” 对象建立在cookie的基础上,所以使用时应注意判断一下客户端是否打开了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。 

幻灯片66

(4) session对象

l 概要

l HTTP是无状态(stateless)协议;

l Web Server 对每一个客户端请求都没有历史记忆;

l Session用来保存客户端状态信息;

l 由Web Server 写入;

l 存于客户端;

l 客户端的每次访问都把上次的session记录传递给Web Server;

l Web Server读取客户端提交的session来获取客户端的状态信息;

幻灯片67

(4) session对象示例(Form表单—Logon_session.html)

<html><body>

  <form action="./Logon_session.jsp">

    姓名<input type="text" name="UserName">

    <input type="submit"  value="提交">

  </form>

</body></html>

幻灯片68

(4) session对象示例Logon_session.jsp

<%@page contentType="text/html;gb2312" %>

<%@page import="java.util.*" %>

<HTML>

  <BODY>

  <%

    String Name=request.getParameter("UserName");

    session.putValue("LogName", Name);

  %>

  你的名字"<%=Name%>"已经写入session 

  <br>

  <a href='./check_session.jsp'>check</a>

  </BODY>

</HTML>

幻灯片69

(4) session对象示例(Check_session.jsp)

<%@page contentType="text/html;gb2312" %>

<HTML><BODY>

  <%

    String yourName=(String)session.getValue("LogName");

    if (yourName= =null)

    {

    %>您还未登录

    <%

    }else

    {

    %>

    "<%=yourName%>"已经登录

    <%

    }

  %>

</BODY></HTML>

幻灯片70

(5) application对象

l “application” 对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMimeType和getRealPath等。

幻灯片71

(5) application对象 

l 同一个Web应用的不同Servlet和JSP页面中共享信息

l application对象中存储的信息不是对具体用户而是对同一个Web应用都有效的信息,例如,数据库应用需要共享的数据库连接池就可以存储在application对象中

l application对象存储与应用相关的信息;

l 所有用户都可以共享这样的信息;

l application对象在服务器关闭时撤销

2015-7-30

71

幻灯片72

(5) application对象 

l application对象的常用方法 :

l 存储和获取应用有效的属性对象

l 获取服务器信息

l 返回web 应用名

l 获取服务器支持的Java Servlet API 版本

l 返回指定文件的MIME类型。典型的值如"text/plain"、 "text/html"和"image/jpg"等

2015-7-30

72

幻灯片73

(5) application对象 

l 获取参数指定的Servlet上下文对象

l 获取初始参数

l 获取指定path的实际路径

l 获取资源

l 日志管理

l 例:application.jsp ,获取应用名称需要用到WEB-INFweb.xml文件中的<display-name>元素定义,日志文件名为{Tomcat}logslocalhost.xxxx-xx-xx.log 

2015-7-30

73

幻灯片74

(5) application_example

l 该实例完成计数器的功能,计数器的值存放在application对象中。

l 每当一个用户登陆到系统时候,首先从application对象中读取当前计数器的值,然后把该值增加1,然后修改application中的值,这样就完成了计数器的功能。

l count.jsp 

2015-7-30

74

幻灯片75

(5) application对象实现网页计数器

<%--用application对象实现网页计数器文件代码:count.jsp--%>

<%@ page contentType="text/html;charset=gb2312"%>

<html>

<head><title>网页计数器</title><head>

<body>

<%  if (application.getAttribute("counter")==null)

application.setAttribute("counter","1");

else{

String strnum=null;

strnum=application.getAttribute("counter").toString();

int icount=0;

icount=Integer.valueOf(strnum).intValue();

icount++;

application.setAttribute("counter",Integer.toString(icount));

}  %>

您是第<%=application.getAttribute("counter")%>位访问者!

</body>

</html>

幻灯片76

(6) out对象

l “out” 对象代表了向客户端发送数据的对象,与“response” 对象不同,通过“out” 对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“out” 对象直接向客户端写一个由程序动态生成HTML文件。常用的方法除了pirnt和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为“out” 对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。

幻灯片77

(6) out对象

l out对象的类型是javax.servlet.jsp.JspWriter,该类从java.io.Writer 类派生,以字符流的形式输出数据。out对象实际上是PrintWriter对象的带缓冲的版本(在out对象内部使用PrintWriter对象来输出数据),可以通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb。 

幻灯片78

(6) out对象

l out对象针对不同的数据类型,提供了多个重载的print()和println()方法,用于输出数据。要注意的是,虽然println()方法会输出一个换行,但是客户端的浏览器在显示页面时会忽略输出的换行。

幻灯片79

(6) out对象 

l JSP文件中的模板数据在转换成Servlet实现类时,会自动生成out.print()或out.println()语句来输出数据。

l Out对象包含方法:

l print()、println()、newLine()、write()、flush() 、clear() 等

l 例: out.jsp

2015-7-30

79

幻灯片80

(7) Config对象

l “config” 对象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以获得Servlet初始化时的参数。

幻灯片81

(7) config对象 

l Web应用配置描述文件:web.xml

l 例: web.xml,将requestHeader.jsp映射到/requesthd

l config对象可以获取web.xml的相关信息,方法:

l 获取指定名字的初始参数getInitParameter() 

l 获取所有初始参数getInitParameterNames() 

l 获取ServletContext对象(application)getServletContext() 

l 获取Servlet名字getServletName() 

l 例:web.xml,设置Web应用的初始参数;  config.jsp,访问Web应用的初始参数 

2015-7-30

81

幻灯片82

(7) config对象

l 一般情况下,JSP容器会自动配置JSP页面。例如,将文件a.jsp复制到tomcat安装目录的webappsmyweb下面,该文件会被自动映射到对应Web应用的URL:/a.jsp,使用地址http://localhost:8888/myweb/a.jsp就可以访问该页面。

l 也可以手工配置页面的映射,这时需要修改应用的配置描述文件web.xml,该文件位于每个应用的WEB-INF目录下。

2015-7-30

82

幻灯片83

(8) page对象 

l page对象是JSP页面对应的Servlet类的实现对象

l 例:page.jsp,使用page指令定义属性info,然后使用getServletInfo()方法取得属性info的值。 

l page对象是JSP页面对应的Servlet类的实现对象,相当于this。

l 由于page对象占用内存较多,一般情况下,不推荐使用page对象。

2015-7-30

83

幻灯片84

(8) Page对象

l page对象是当前页面转换后的Servlet类的实例。从转换后的Servlet类的代码中,可以看到这种关系:

l Object page = this;

l 在JSP页面中,很少使用page对象。

l page作用域 :是JSP页面编译成JAVA文件时的service方法.方法结束,生命周期也结束 

幻灯片85

(9) exception对象

l exception对象表示了JSP页面运行时产生的异常,该对象只有在错误页面(在page指令中指定属性isErrorPage=true的页面)中才可以使用。

l 在JSP页面中,我们可以利用page指令的errorPage属性指定一个错误处理页面,当JSP页面运行发生错误时,JSP容器会自动调用指定的错误处理页面。要注意的是,如果一个JSP页面使用errorPage属性定义了错误页面,那么在web.xml文件中定义的任何错误页面将不会被使用。

l 下面我们看一个例子:price.jsp

l <%@ page errorPage="excep.jsp" %>

l <%

l String strPrice=request.getParameter("price");

l double price=Double.parseDouble(strPrice);

l out.println("Total price = "+price * 3);

l %>

幻灯片86

(9) exception对象

l excep.jsp

l <%@page isErrorPage="true" %>

l <%

l out.println("exception.toString():");

l out.println("<br>");

l out.println(exception.toString());

l out.println("<p>");

l out.println("exception.getMessage():");

l out.println("<br>");

l out.println(exception.getMessage());

l %>

幻灯片87

(9) exception对象

l 在price.jsp页面中,通过page指令的errorPage属性指定错误处理页面为excep.jsp。在 excep.jsp页面中,通过page指令的isErrorPage属性指定当前页面是错误处理页面,只有设置了isErrorPage为true,在此页面中才可以使用exception对象。

l 我们访问price.jsp页面时,输入URL:http://localhost:8080/ch12/price.jsp?price=5.0

l 将看到输出:Total price = 15.0

l 如果输入:http://localhost:8080/ch12/price.jsp?price=abc

l 将看到如下的错误信息:

l exception.toString(): 

l java.lang.NumberFormatException: For input string: "abc" 

l exception.getMessage(): For input string: "abc" 

幻灯片88

(9) exception对象 

l 常用的方法:

l 输出错误信息 getLocalizedMessage() getMessage() toString() 

l 输出详细错误信息  printStackTrace()

l 例:exception.jsp ,直接使用throw产生异常,利用exception对象处理异常  

2015-7-30

88

幻灯片89

(9) exception对象

l 返回错误信息

l public String  getMessage()

l public String  toString()

l 输出详细错误信息:

l public void printStackTrace()

l public void printStackTrace(PrintStream ps)

l public void printStackTrace(PrintWriter pw)

2015-7-30

89

幻灯片90

 (10) cookie对象

l 作用:Cookie对象通常用于在浏览器端保存会话过程中的一些参数。

l Cookie信息保存在客户机上,当浏览器请求服务器的页面时自动发送到服务器上。

l Cookie是文本文件,保存路径C:Documents and Settings登录用户名Cookies

幻灯片91

cookie对象

l name:Cookie名称

l value:Cookie值

l domain:只有在该域的服务器才会发送该cookie。

l maxAge:Cookie持续的时间。-1表示一直有效

l path:只有URL中包含指定的路径的服务器才发送Cookie

l secure:是否仅当使用https协议才发送Cookie。

幻灯片92

cookie对象

对于cookie的写入,要结合response对象来实现

<%

Cookie c=new Cookie("season","spring");

c.setMaxAge(30);//cookie的有效期为30秒

response.addCookie(c);

%>

幻灯片93

cookie对象

对于cookie的读取,要结合request对象来实现

<%

Cookie[] a=request.getCookies();

//根据设置时的cookie个数决定数组元素个数

String s1=(String)a[0].getName();

String s2=(String)a[0].getValue();

out.println(s1+s2);

%> 

幻灯片94

cookie对象

l Cookie的有效期

l 1)过期属性是按秒为单位记录的,使用正整数

l 2)负值表示该cookie的生存期是当前浏览器会话

l 3)零值表示立即删除该cookie

l 注意:

l 如果不设置cookie的有效期,就不能在硬盘上保存cookie的信息,一旦浏览器关闭,cookie信息就消失。

cookie有效期的设置必须在response.addCookie()方法之前。 

幻灯片95

内置对象小结

l 全面介绍了JSP的几种内置对象。熟练使用这些内置对象是开发JSP应用程序的基本要求,尤其是对于request、session和application对象更是必须要掌握的。

l 会使用对象所具有的方法,能熟练使用每一种对象的几种常用方法。

幻灯片96

PrintWriter和JspWriter有什么区别

l 第一个区别:PrintWriter的print方法中不会抛出IOException,而JspWriter会。 

l 第二个区别:JspWriter是抽象类而PrintWriter不是,也就是说你可以通过new操作来直接新建一个PrintWriter的对象而JspWriter不行,它必须是通过其子类来新建。 

l JspWriter对PrintWriter有依赖。初始化一个JspWriter对象的时候要关联ServletResponse对象的一个PrintWriter类型对象,最终JspWriter对象的输出任务还是通过这个PrintWriter类型对象做的。

幻灯片97

原文地址:https://www.cnblogs.com/feifeikui/p/4689571.html