章节二 :JSP 九大对象、四大作用域、七大行为动作、三大指令

  • jsp九大内置对象

 

对象

描述

request

HttpServletRequest类的实例

response

HttpServletResponse类的实例

out

JspWriter类的实例,用于把结果输出至网页上

session

HttpSession类的实例

application

ServletContext类的实例,与应用上下文有关

config

ServletConfig类的实例

pageContext

PageContext类的实例,JSP独有,Servlet没有,javax.servlet.jsp.JspContext 的子类
默认的单参数set、get方法,对作用域page的内容做存取,page域的作用域最小。
pageContext.setAttribute("x", "X");

但其支持双参数的set、get方法,去存取request、session、application作用域。

双参数使用时,1个顶9个,可以使用pageContext, 向request、session、application对象中存取数据
void  setAttribute(String name, Object value, int scope):在指定范围中添加数据;
比如:
pageContext.setAttribute("x", "XX",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("x", "XXX",PageContext.SESSION_SCOPE);
pageContext.setAttribute("x", "XXXX", PageContext.APPLICATION_SCOPE);

javax.servlet.jsp.JspContext 的方法,PageContext类对象可用

abstract  java.lang.Object findAttribute(java.lang.String name)
          Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.
abstract  java.lang.Object getAttribute(java.lang.String name)
          Returns the object associated with the name in the page scope or null if not found.
abstract  java.lang.Object getAttribute(java.lang.String name, int scope)
          Return the object associated with the name in the specified scope or null if not found.
 
abstract  void setAttribute(java.lang.String name, java.lang.Object value)
          Register the name and value specified with page scope semantics.
abstract  void setAttribute(java.lang.String name, java.lang.Object value, int scope)
          Register the name and value specified with appropriate scope semantics.
abstract  void removeAttribute(java.lang.String name)
          Remove the object reference associated with the given name from all scopes.
abstract  void removeAttribute(java.lang.String name, int scope)
          Remove the object reference associated with the specified name in the given scope.

page


对应page域

在JSP中,类似于Java类中的this关键字
从转换后的Servlet类的代码中,可以看到这种关系:Object page = this;
在JSP页面中,很少使用page对象。

exception

Exception类的对象,代表发生错误的JSP页面中对应的异常对象,page指令的isErrorPage属性为true时有效

1>JspWriter类的out 向客户端浏览器输出数据,用法 out.print(" dgaweyr");

  • PrintWriter与JspWriter的区别与联系

可以用pageContext.getOut() 得到JspWriter对象out,可以直接用out对象输出;   
而PrintWriter在JSP页面中必须用response.getWriter(); 方法得到。

两者的区别:

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

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

两者的联系:(JspWriter的out.print在满足一定的条件时,才会调用PrintWriter的out.print )

联系一:JspWriter和PrintWriter都是继承于java.io.Writer ,
但PrintWriter是Servlet中利用response.getWriter()得到的 ; 而JspWriter的out是JSP内置对象,或者使用pageContext.getOut()得到。

联系二:JspWriter可以在JSP页面中直接用out对象输出.可以用pageContext.getOut();   得到JspWriter对象。

备注:利用pageContext.getOut();来得到JspWriter对象, 和JSP页面中封装的out对象是同一个对象。

PrintWrietr在JSP页面中必须用response.getWriter();方法得到其对象;   二者作用域不同。

联系三:在Jsp页面上用两种方法同时输出数据,PrintWriter中的数据会先输出。
 

先后输出举例:
JspWriter out1 = pageContext.getOut();

out1.print("222");
//或者直接用 out.print("222");

PrintWriter pw = response.getWriter();

pw.print("111");

 会输出: "111"   "222"
 这是因为JspWriter 的 out 对象,在默认情况下,插入到 PrintWriter  缓冲区的后面。

out对象满足一定条件时,才会调用PrintWriter对象的print()方法,把out缓冲区中的内容输出到浏览器端。

  •  附上: out对象调用PrintWriter对象的print( )方法输出缓冲区中的内容的条件:

            ^设置page指令的buffer属性为"none",关闭了out对象的缓存功能,但默认是开启的。

            ^写入到out对象中的内容充满了out对象的缓冲区

            ^整个JSP页面结束

            ^JSP中调用了out.flush()或response.flushbuffer()


 如果按照下面输出:

JspWriter jspOut1 = pageContext.getOut();

jspOut1.print("222");

jspOut1.flush(); //刷新缓冲区

PrintWriter pw = response.getWriter();

pw.print("111");

那么,会输出 “222” “111”

  • 手册对JspWriter解释:

初始JspWriter对象与ServletResponse的PrintWriter对象关联的方式取决于JSP页面是否缓冲,即JSP页面的page指令的buffer属性值。
如果页面没有缓冲,(buffer属性值为"none"),则写入此JspWriter对象的输出将直接写入PrintWriter

JSP的超过缓冲区时,是刷新还是引发I/O异常,由page的autoFlush属性控制,默认为true,即超过缓冲会刷新,而不是引发异常。
如果autoflush=“false”,那么如果执行当前操作若导致缓冲区溢出,则该类上的所有I/O操作都将引发IOException

2>request 对象           代表客户端浏览器发送的HTTP请求对象.
String getParameter(String name):得到表单参数名name的值.
String[] getParameterValues(String name):(得到String[]复选框时常用).
setAttribute(String name,Object obj):设置属性名为name,属性值为obj.
getAttribute(String name);得到属性值.

  • 关于请求转发

request.getRequestDispatcher("success.jsp").forward(request,response);  把请求转发到当前web项目的Web-Content/WEB-INF/success.jsp页面(建议使用这种相对路径)。

如果不使用request,而是使用ServletContext.getRequestDispatcher(String   url),则其中的url只能使用绝对路径。

request.getContextPath() ; 得到当前Web应用,比如test的运行目录  http://IP:8080/test

  • getServletContext().getRealPath("");  得到当前的Web应用的路径的硬盘路径,也可以如下用:

——————————————————————————————————————————————————————

  • request.getSession().getServletContext() 获取的是Servlet容器对象,相当于tomcat容器了.

getRealPath(“/”) 获取实际路径,“/”指代项目根目录,所以代码返回的是项目在容器中的实际发布运行的根路径。

如:D:\apachetomcat6.0.32\webapps\cloudOABaseV4\hwtt_upload

PS:文件分隔符(在 UNIX 系统中是“/”),window 是”\”

Window: D:\apache-tomcat-6.0.32\webapps

Linux: ​D:/apache-tomcat-6.0.32/webapps

故文件上传时,若服务器是linux系统,需进行分隔符转换。​

this.savePath = this.savePath.replace(“\”, “/”);

————————————————————————————————————————————————
 
3>response对象            代表服务器对客户端浏览器的HTTP响应对象
addCookie(Cookie cookie):
sendRedirect("/welcome.jsp"):    重定向,使得客户端浏览器重新发送请求到当前服务器http://IP:8080下的welcome.jsp页面,但一般这样不行,一般写成response.sendRedirect(request.getContextPath() + "/welcome.jsp");


4>session对象              用于保存用户信息,跟踪用户行为,当前打开的浏览器内,多个页面共享数据. 
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApp开始,直到客户端与服务器断开连接为止.
它是HttpSession类的实例.

setAttribute(String name,Object obj):设置属性名为name,属性值为obj.
getAttribute(String name):得到属性值.
 
5>application对象       转化为Servlet后,它是ServletContext类的实例。包含全局的含义,实现多个Servlet间数据的共享。

java.lang.Object getAttribute(java.lang.String name)
Returns the servlet container attribute with the given name,
or null if there is no attribute by that name.
 void setAttribute(java.lang.String name, java.lang.Object object)
          Binds an object to a given attribute name in this servlet context.

它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;
这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行存取;
服务器的启动和关闭决定了application对象的生命.

6>page对象               代表jsp这个实体本身,只对当前页面有效.相当于java中的this,对应作用域page

7>.exception:代表运行时的异常.
在会发生异常的页面加入指令:<%@ page errorPage="处理错误的页面.jsp"%>
在处理异常的页面写入:<%@ page isErrorPage="true"%>
 
8>.pageContext对象 pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext ,
继承自 javax.servlet.jsp.JspContext

9>.config  对应的ServletConfig类的实例,用于读取一个工程中web.xml 的初使化参数

  • JSP的四大作用域

作用域范围从小到大 :   page  <  request  <  session  <  application
page是本页面 ,对应JSP的 page 内置对象 (很少用)
request是本请求,对应JSP的 request 内置对象
session是本次浏览器会话(浏览器关闭之前有效),对应JSP的session 内置对象
application是本服务器 ,对应JSP的  application 内置对象。
 
这个顺序也是EL表达式去查找变量的顺序。

  • jsp 七大行为动作  <jsp:      />

一:include 动态包含
动态包含是分别编译,访问到<jsp: include page    /> 动态包含的代码,就去执行这个目标页面,得到输出,之后把输出作为原jsp页面的内容,最终再次执行原jsp页面。

而静态包含是指令(@page),是把目标文件代码复制过来,再进行一次统一的编译):
用jsp:include动作实现<jsp: include page="included.jsp" flush="true" />
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
page属性: 是相对URL,即,认为在同一树形层次高度的目录下。
flush属性: 用true ,表示页面可刷新;默认为false;

动态包含举例:

date.jsp文件代码:

main.jsp文件代码:

现在将以上两个文件放在服务器的同一个目录下,访问main.jsp文件。
The include action Example
Today's date: 12-Sep-2013 14:54:22

二:<jsp:  useBean    /> 动作:

jsp:useBean动作用来装载一个将来在JSP页面中使用的JavaBean。默认的scope属性是作用域page(本页面有效).

jsp:useBean动作最简单的语法为:
<jsp:useBean id="name" class="package.class" />

在类载入后,我们既可以通过 jsp:setProperty 和 jsp:getProperty 动作来修改和检索bean的属性。

 在给出具体实例前,让我们先来看下 jsp:setProperty 和 jsp:getProperty 动作元素:
 

三:<jsp:setProperty>动作

 jsp:setProperty用来设置已经实例化的Bean对象的属性,有两种用法。首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,如下所示:

<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName" property="someProperty" .../>

 此时,不管jsp:useBean是找到了一个现有的Bean,还是新创建了一个Bean实例,jsp:setProperty都会执行。第二种用法是把jsp:setProperty放入jsp:useBean元素的内部,如下所示:

<jsp:useBean id="myName" ... >
...
       <jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>

此时,jsp:setProperty只有在新建Bean实例时才会执行,如果是直接使用现有实例则不执行jsp:setProperty,推荐使用这一种!

 useBean动作支持如下属性:

属性

描述

id

值是一个字符串,用于在今后的set和get中唯一指定

class

指定Bean的完整包名。

type

指定将引用该对象变量的类型。

beanName

通过 java.beans.Beans 的 instantiate() 方法指定Bean的名字。

scope

创建对象默认的有效区域,值是一个字符串

page、request、session、appication



setProperty动作,支持以下属性

属性

描述

name

name属性是必需的。它表示要设置属性的是哪个Bean。

property

property属性是必需的。它表示要设置哪个属性。有一个特殊用法:如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。

value

value 属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如"true")通过 Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。   
value和param不能同时使用,但可以使用其中任意一个。

param

param 是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。



四:<jsp:getProperty     />  动作
 jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出

属性描述

属性

描述

name

要检索的Bean属性名称。Bean必须已定义。

property

表示要提取Bean属性的值


JSP使用动作行为,读写Bean实例:

编译以上实例并生成 TestBean.class 文件,放入classes目录,或者封装进jar文件后放入lib目录,注意源码的包名是action
下面是一个很简单的例子main.jsp,它的功能是装载一个Bean,然后设置/读取它的message属性。

访问以上JSP文件,会看到下面的显示
Using JavaBeans in JSP
Got message....
Hello JSP...

注意该三个动作的执行过程:
首先,<jsp:useBean   />动作,使得服务器加载classes目录下的 action/TestBean,并进行实例化(如果已有就不会 new);
接着,<jsp:setProperty   />动作, 给内存中TestBean实例进行属性的赋值;
最后,<jsp:getProperty   />动作,读取内存中TestBean实例的某个属性的值。

五:forward动作:
跳转页面:<jsp:forward page="login.jsp" />
 该动作常用于MVC架构。

在服务器端使用forward形式跳转Servlet时,客户端地址栏会显示跳转前的Servlet访问地址。
也就是说forward跳转对客户端浏览器是透明的。

在Struts等MVC框架中,都是用Servlet来处理用户请求,通过request.setAttribute( ),把结果放到request中,然后forward到JSP中显示。

request.getRequestDispatcher("success.jsp").forward(request,response);

  • getRequestDispatcher时的相对路径和绝对路径问题

以“文件名开头”,相对路径,forward时都在当前目录下找。

以“../”开头的,相对路径,forward时都在当前目录的上一级目录找。

以“/”开头,forward时以当前web项目为根目录找(而不是当前服务器为根路径),

以“/”开头,浏览器发HTTP请求时,以http://IP:8080/为根路径,所以要访问资源需要加上Web项目的名字,

而以“/”开头,response的重定向redirect时以http://IP:8080/为根目录找。

通过RequestDispatcher对象的forward(HttpServletRequestrequest, HttpServletResponse response)方法来实现

RequestDispatcher可以通过HttpServletRequest对象request 的getRequestDispatcher()方法获得。

注意:在forward之前尽量不要用out.print()语句向客户端输出结果,否则会抛出IllegalStateException。

请求重定向forward与响应的重定向不同,被请求重定向的浏览器,其地址栏没有变化,用户是无感知的。
响应重定向,是使用相应对象response.setStatus(302);  并且 response.setHeader("location","/ServletTest/servlet2");
使得浏览器收到响应后重发一次HTTP请求。表现在客户端的URL会发生变化。

主要区别

请求转发: 利用request完成

​ (1)浏览器地址栏不发生改变,不会变为目标地址

​ (2)请求转发是服务器的行为,整个转发的过程在服务器中完成

​ (3)整个过程是一次请求,一次响应

​ (4)各个资源共享Request域中的数据

​ (5)可以转发到WEB-INF目录下

​ (6)不可以访问工程以外的资源(如:http://www.baidu.com

响应重定向: 利用response完成

​ (1)浏览器地址栏发生改变,变为目标地址

​ (2)重定向是浏览器的行为,通过响应对象HttpServletResponse来执行

​ (3)整个过程是两次请求,两次响应

​ (4)不共享Request域中数据

​ (5)不能访问WEB-INF目录下的资源

​ (6)可以访问工程外的资源(如:http://www.baidu.com
 

六:param动作 ,常用在<jsp:forward>动作内部,作为子动作。

<jsp:param name="参数名" value="参数值">

常常与<jsp:forward>一起使用,作为其子标签存在。 

可以在请求转发的forward的目标jsp页面,通过 request.getParameter(“参数名”)方式取出发来的参数值。
可作为不同的JSP页面的同一个request的数据共享。
 

七:plugin动作:<jsp:plugin>:用于指定在客户端运行的插件
 

  • JSP三大指令(@page  @include  @taglib )

指令(Directive)是一种JSP句法元素,指令是指示JSP转换器如何把某个JSP页面转换成具体的Servlet 的一种命令。
一:page指令
定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
1、例,指定页面编码.
<%@ page  language = "java"      contentType="text/html;charset=gbk" pageEncoding="gbk" %>
2、例,导入包
<%@ page  import =  "java.util.* , java.text.* " %>

常用的page指令的属性如下:

①  import 属性:用来导入程序中要用到的包或类,可以有多个值,无论是Java核心包中自带的类还是用户自行编写的类,都要在import中引入,才能使用,支持*号,导入某包下的全部类。

<%@page import="java.text.DateFormat"%>  

或者通过逗号间隔来导入多个类:

<%@page import="包名.类1,包名.类2"%>

②session 属性:取值默认true,表示当前页面是否支持session,如果为false,则在JSP页面中不能使用session对象以及scope=session的JavaBean或EJB。

<%@page session="flase" %>
 

③language 属性:用于设置JSP页面使用的语言,目前只支持Java语言

<%@page language="java"%>
 

④extends 属性:用于设置JSP页面转换为Servlet后继承的java类,一般不会设置。
 

⑤pageEccoding 属性:用于设置本JSP页面的字符编码格式,也就是该JSP文件的编码。
ISO-8859-1、gb2312和GBK等。默认值为ISO-8859-1
一般用于用户在JSP页面的表单上输入数据,传递给服务器,服务器从request请求中可以获得用户浏览器使用的编码。
Tomcat内部是使用UTF-8编码的,在用响应输出时,还会在response中设置charSet的编码。

<%@page pageEccoding="gb2312"%>

 

⑥contentType 属性:用于设置JSP页面的MEME类型和响应的字符编码

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

⑦buffer属性:

内置输出流JspWriter的对象out负责将服务器的某些信息或运行结果发送到客户端显示,buffer属性用来指定out缓冲区的大小。
其值可以有none、8KB或是给定的KB值,值为none表示没有缓存,直接输出至客户端的浏览器中;
如果将该属性指定为数值,则输出缓冲区的大小需要大于等于该值,默认为8KB(因不同的服务器而不同,但大多数情况下都为8KB)。

<%@page buffer="128KB"%>
 

⑧autoFlush属性:设置JSP页面缓冲区满时,自动刷新缓存(输出到客户端浏览器)。默认值为true.
如果为false,则JSP页面缓冲区满时,报出I/O异常

<%@page autoFlush="true"%>
 

⑨isErrorPage属性:指示一个页面是否为错误处理页面。设置为true时,在这个JSP页面中的九大对象之 exception将有效,属性值将被设定为呼叫此页面的JSP页面的错误对象,以处理本JSP页面所产生的错误。

<%@page isErrorPage="true"%>
 

⑩errorPage属性:指示一个JSP文件的相对路径,以便在页面出错时,转到这个JSP文件来进行处理。
与此相适应,需要将这个JSP文件的isErrorPage属性设为true。
 当errorPage属性被设置后,JSP网页中的异常仍然会产生,只不过此时捕捉到的异常将不由当前JSP进行处理,而是由errorPage属性所指定的网页去进行处理。如果该属性值设置的是以“/”开头的路径,则错误处理页面在当前应用程序的根目录下;否则,在当前页面所在的目录下。

<%@page errorPage="error/loginErrorPage.jsp"%>
 

11、info属性:设置JSP页面转为Servlet 后的相关信息,如当前页面的作者、编写时间等。
此值可设置为任意字符串,由   javax.servlet.GenericServlet 的 getServletInfo()方法来获取所设置的值。

区别于ServletConfig 对象的内容,对Tomcat 来说 一般都存储于Web应用的  web.xml中。

这里相当于是   <%out.println(getServletInfo());%>,相当于运行了在Servlet的doGet方法中使用 this.getServletInfo();

12、isThreadSafe属性:

设置JSP页面是否可以多线程访问。默认值为true,表示当前JSP页面被转换为Servlet后,会以多线程的方式来处理来自多个用户的请求;如果设为false,则转换后的Servlet会实现SingleThreadMode接口,并且将以单线程的方式来处理用户请求。


13、isELIgnored属性: 忽略EL表达式,默认不忽略。

其值可设置为true或false,表示是否在此JSP网页中执行或忽略表达式语言“${}”等。
设为true时,JSP容器将忽略表达式语言。其值可设置为true或false,表示是否在此JSP网页中执行或忽略表达式语言“${}”等。


二:include 指令
包含其他文件
静态包含(统一编译):<%@ include file="included.jsp"%>
 
Jsp中的静态包含与动态包含
动态include(<jsp: include page="included.jsp"/>) ,这是JSP的动作行为。
静态include(<%@ include file="included.jsp"%>),这是JSP的指令,其XML形式是<jsp: directive.include page="included.jsp"/>

容易混淆的有include指令和include动作行为,include指令是在JSP文件编译为Servlet阶段执行,而动作行为是在客户端请求时执行。


三:taglib
 引入标签库的定义,可以是自定义标签

猜你喜欢

转载自blog.csdn.net/qq_26882339/article/details/111770730