对象 | 描述 | ||||||||||||||
request | HttpServletRequest类的实例 | ||||||||||||||
response | HttpServletResponse类的实例 | ||||||||||||||
out | JspWriter类的实例,用于把结果输出至网页上 | ||||||||||||||
session | HttpSession类的实例 | ||||||||||||||
application | ServletContext类的实例,与应用上下文有关 | ||||||||||||||
config | ServletConfig类的实例 | ||||||||||||||
pageContext | PageContext类的实例,JSP独有,Servlet没有,javax.servlet.jsp.JspContext 的子类 双参数使用时,1个顶9个,可以使用pageContext, 向request、session、application对象中存取数据
| ||||||||||||||
page
| 在JSP中,类似于Java类中的this关键字 | ||||||||||||||
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("/资源URI").forward(request,response); 把请求转发到当前web项目的Web-Content/WEB-INF/资源URI
如果不使用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) |
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转换。 |
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会发生变化。
主要区别
(1)浏览器地址栏不发生改变,不会变为目标地址
(2)请求转发是服务器的行为,整个转发的过程在服务器中完成
(3)整个过程是一次请求,一次响应
(4)各个资源共享Request域中的数据
(5)可以转发到WEB-INF目录下
(6)不可以访问工程以外的资源(如:http://www.baidu.com)
(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
引入标签库的定义,可以是自定义标签
JSP的EL表达式
jsp标签中的 ${表达式}用来输出或者计算一个表达式的内容,比如${3+5},那么便会在页面上bai输出8,在比如${sessionScope.username},那么便会获取Session里面的username的值,它不能在代码块也就是<% %>里使用。
作用:EL(Expression Language)是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
jsp中${ }是EL表达式的常规表示方式
目的是为了获取{}中指定的对象(参数、对象等)的值,并进行输出到页面。
就像使用了内置对象out,或<%= >语法。
out | JspWriter类的实例,用于把结果输出至网页上 |
如:
${user.name}<====>等价于下面三行:
User user = (User)request(搜寻范围).getAttribute(user);
String name = user.getName();
out.println(name);
从当前页面起开始搜寻 user对象,然后获取改对象的name属性值
其搜寻的范围依次是:page、request、session、application
如果未搜索到,即会返回null值