430 likes | 611 Views
互联网软件开发与应用. 任课教师:陆 铭 联系电话: 66134267 QQ: 22839978 PoPo:richard.du@163.com 教学网站: mingler.ccshu.org. 第九章 JSP 技术介绍. 9.1 JSP 简介 9.2 JSP 的组成. 9.1 JSP 简介. JSP 是 Java Server Page 的缩写,是 Servlet 的扩展,目的是简化建立和管理动态网站的工作 JSP 技术是 J2EE 的一个关键技术,在更高的层次上抽象 Servlet
E N D
互联网软件开发与应用 任课教师:陆 铭 联系电话:66134267 QQ: 22839978 PoPo:richard.du@163.com 教学网站:mingler.ccshu.org
第九章 JSP技术介绍 9.1 JSP简介 9.2 JSP的组成
9.1 JSP简介 • JSP是Java Server Page的缩写,是Servlet的扩展,目的是简化建立和管理动态网站的工作 • JSP技术是J2EE的一个关键技术,在更高的层次上抽象Servlet • 可以让常规静态HTML与动态产生的内容相结合,看起来像一个网页,却作为Servlet来运行 • 现在许多商业应用服务器支持JSP技术,如JRun、IBM WebSphere、BEA Weblogic等 • 使用JSP比用Servlet更简单 • 如果有一个支持JSP的web服务器,并有一个JSP文件,可以把它放到任何静态HTML文件可以放置的位置,不用编译、不用打包、也不用进行ClassPath的设置,就可以像访问普通网页那样访问它,服务器会自动帮你做好其他工作
JSP简介 • JSP文件看起来像一个普通的静态HTML文件,只不过里面包含了一些Java代码 • 使用 .jsp 作为文件扩展名,告诉服务器其文件特征 • 当访问JSP网页时,该文件首先会被JSP引擎翻译为一个Java源文件,即Servlet并进行编译,然后像其他Servlet一样,由Servlet引擎来处理 • Servlet引擎装载这个类、处理来自客户的请求、把结果返回客户等 • 以后再有客户访问这个网页时,只要文件没有发生过更改, JSP引擎就直接调用已经装载的Servlet;如果已经做过修改,就会再次执行前述过程:翻译、编译、装载、执行等 • 这一方法称为“第一人惩罚” • 只有首次访问的时候要执行一系列的上述过程,所以会花费一些时间,以后的访问就可以加快速度
Servlet所带来的便利 • JSP是建立在Servlet技术基础之上的,尽管Servlet功能在很多方面都很强大,但它通常属于程序员专有领域 • 在许多基于Java Servlet的应用程序中,处理请求和产生应答是由同一个Servlet类来执行的 • Servlet包含了请求的处理以及商务逻辑(通过isOrderInfoValid()和saveOrderInfo()这样方法来实现的),并且产生应答的HTML代码 • 一个更加结构化的Servlet应用程序可以将处理过程分成各个不同的部分,封装在各种可重用的工具类中,也可以使用一个单独的类库来产生应答中的实际的HTML元素
Servlet所带来的问题 • 开发和维护应用程序的所有部分需要有深厚的Java编程知识,因为处理代码和HTML元素是交织在一起的 • 改变应用程序的外观和风格,或者加入对某种新类型客户机的支持时,都需要更新并重新编译Servlet代码 • 很难利用网页开发工具的优势来设计应用程序界面。如果用这些工具来开发网页布局的话,生成的HTML代码必须被手工嵌入到Servlet代码中,费时易错枯燥 • 解决方案 • 引入JSP可以将请求处理和商务逻辑与外观呈现分离开来 • 不是将HTML嵌入到代码中,而是将所有静态HTMLV放到页面中,就像一个普通的网页一样,然后加入一些JSP元素来产生页面的动态部分 • 对请求的处理工作可以留给Servlet程序员来做,商务逻辑则可以由JavaBeans和EJB组件来处理
引入JSP的优势 • 将请求处理和商务逻辑与外观呈现分开后,允许我们将开发任务分派给拥有不同技术的人来完成 • Java程序员负责实现请求处理和商务逻辑部分,网页设计师实现用户界面 • 这两组人员都可以使用手边最好用的工具软件来完成任务 • 其结果是 • 我们得到了更为多产的开发过程 • 也使我们能够单独改变应用程序的某个部分 • 如修改商务规则,不必触动用户界面 • 网页设计师即使没有任何编程技术,也可以使用JSP标准行为和JSTL库以及开源组织或商业公司提供的Java组件,来开发拥有许多动态特性的web应用程序
Application Server Enterprise Server Request Response JSP Web Browser DB JavaBean JSP应用模式一 • JSP技术规范给出了两种使用JSP开发web应用的方式,称之为模型一和模型二,两种模型的主要差别在于它们处理业务的流程不同 • 模型一:JSP+JavaBean模型 • JSP页面独自响应请求并将处理结果返回给客户,所有的数据通过JavaBean来处理,JSP实现页面的表现 • 模型一实现了页面表现和业务逻辑的分离 • 模型一的缺陷 • 使用这种方式需要在JSP页面使用大量的Java代码,当需要处理的业务逻辑很复杂时,这种情况会变得很糟糕,大量嵌入的代码使整个页面程序变得十分复杂 • 模型一不能满足大型应用的需要,但因为模型简单,不用涉及诸多要素,可以很好地满足小型应用的需要
Application Server Enterprise Server JSP Request Response DB Web Browser (view) JSP JSP应用模式二 • 模型二:JSP+Servlet+JavaBean模型 • 该模型结合了JSP和Servlet技术,充分利用了JSP和Servlet两种技术原有的优势 • 模型使用JSP技术来表现页面,使用Servlet技术完成大量的事务处理,使用Bean来存储数据 • Servlet用来处理请求的事务,充当一个控制者的角色,并负责向客户发送请求,创建JSP需要的Bean和对象,然后根据用户请求的行为,决定将哪个JSP页面发送给客户 • 模型二具有更清晰的页面表现,清楚的开发角色划分,可以充分利用开发团队中的网页设计人员和Java开发人员 • 网页设计人员可以充分发挥自己的美术和设计才能来充分表现页面,程序编写人员可以充分发挥自己的业务逻辑处理思维,实现项目中的业务处理 Instantiate Servlets View (Model) JavaBean
JSP页面构成 • JSP是基于文本的文件,包含两种类型的文本 • 静态模板数据:任何基于文本格式的都可以被表示,HTML、XML、SVG、WML • 动态数据:JSP元素构成 • JSP页面的构成 • 指令(<% @ …… %>) 引用包含的类 • JSP元素 • jsp:useBean元素创建一个包含对象集的场所,并初始化一个变量指向该对象 • jsp:include元素发送一个请求到另外一个页面,也包含调用页面中相应的响应 • Scriptlets(<% …… %>) 获得本地的请求参数值,重申本地名称集,有条件地插入HTML文本到输出 • 表达式(<% =….. %>) 插入本地值到输出中
JSP页面执行过程 • 当web服务器接受到web客户的一个JSP文件请求时,对JSP文件进行语法分析并生产Java Servlet源文件,然后进行编译 • 一般情况下,Servlet源文件的生成和编译仅在初次调用JSP时发生,如果原始的JSP文件被更新,web服务器将检测所做的更新,执行之前重新生成Servlet并进行编译 • 参考 P.222,阅读教材内容 JSP 文件: <%@ page import="java.util.*" %> <%@ page contentType="text/html; charset=gb2312" %> <html> <body> 你好!今天是 <% Date today= new Date( ); = today.getDate( ) %>号, 星期<% =toDay.getDay %> </body> </html> Servlet 文件: import java.util.* ; response.setContentType("text/html; charset=gb2312"); out = pageContext.getOut( ); out.write("\r\n\r\n<html>\r\n<body>\r\n你好!今天是\r\n"); Date teday = new Date( ); out.print(today.getDate( )); out.write("号,星期"); out.print(today.getDay( )); out.write(" \r\n <\body> \r\n </html> \r\n");
JSP与ASP的简单比较 • JSP与ASP非常相似,两者都提供在HTML代码中混合某种程序代码、并由语言引擎解释执行程序代码的能力 • 在ASP和JSP环境下,HTML代码主要负责描述信息的显示样式,程序代码用来描述处理逻辑 • 普通的HTML页面只依赖于web服务器,而ASP和JSP页面需要附加的语言引擎分析和执行程序代码 • 程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送到浏览器 • ASP和JSP都是面向web服务器的技术,客户端浏览器不需要任何添加的软件支持
9.2 JSP的组成 JSP主要由模板元素、指令元素、动作元素、脚本元素、声明、表达式、Scriptlets和JSP内建对象组成
9.2.1 模板元素 • 模板元素是指JSP的静态HTML或XML内容,是JSP显示的重要成分,这部分的任务主要由制作网页的美工来完成 • 在JSP编译时,将把这些模板元素编译到Servlet中,当客户请求JSP时,就会将这些模板元素一字不变地发送到客户端
9.2.2 指令元素 • 指令是用于从JSP发送到容器上的一个信息 • 指令用来设置全局变量,声明类要实现的方法和输入内容的类型等 • 指令的作用并不是向客户产生任何输出,指令元素只是为编译提供全局信息 • 所有指令都在JSP整个文件范围内有效 • 指令元素的格式 <% @ 指令类名称 属性名1="参数值", 属性名2="参数值" %> • JSP指令的类型 • 页面指令、include指令、taglib指令
页面指令 • 页面指令定义了各种影响到整个页面的重要属性 • 一个JSP页面可以包含多个页面指令,在编译时,所有的页面指令都被抽出来同时应用到一个页面中。除了Import外,其他页面指令定义的属性值只能出现一次 • 页面指令的格式 <% @ page 属性%> • 常用的页面指令属性表(参见P.224 表9.1) Directive.jsp (页面指令举例) <% @ page language="java" import="java.util.data" session="ture" Buffer="12k" autoFlash="true" info="a test directive jsp page" errorPage="error.jsp" isErrorPage="false" contentType="text/html; charset=gb3212" %> <html> <body> <h1>a test directive page</h1> <% =new java.util.Data() %> </body> </html>
Include指令 • Include指令通知容器将当前JSP页面中内嵌的、在指定位置上的资源内容包含进来。被包含的文件内容可以被JSP解析,这种解析发生在编译期间 • Include指令的格式 <% @ include file="filename" %> • 需要注意,一经编译,内容不可变,如果要改变file的内容,必须重新编译JSP文件 • 简单的include指令的例子 <% @ page contentType="text/html; charset=gb2312" %> <% @ include file="head.jsp" %> <% @ include file="body.jsp" %> <% @ include file="footer.jsp" %>
Taglib指令 • 该指令允许用户自定义标签 • 自定义标签的步骤 • 首先开发用户的开发标签库,为标签库编写 .tld配置文件 • 然后在JSP页面里使用自定义标签 • 如此,JSP标签库得到不断加强,最新的规范增加了JSTL标签库 • JSP的标签库在页面里的定义格式 <% @ taglib uri="taglibURI" prefix="tagPrefix" %> • uri用来表示标签描述符,tagPrefix定义了在JSP页面里引用标签时的前缀,这些前缀不可以是jsp、jspx、java、javax、sun、servlet、sunw等
9.2.3 脚本元素 • 脚本元素把JSP的所有内容都集中在一起,它通常是用Java编写的脚本代码 • 脚本元素允许变量声明和函数声明,可以包含任意的Java脚本代码和对表达式的求值 • 这些声明编译成Servlet时,是Servlet的属性和操作 • 脚本元素有三种类型 • 声明(Declaration) • 表达式(Expression) • Scriptlets
声明(Declaration) Declaration.jsp (在JSP页面中使用声明) <% @ page contentType="text/html; charset=gb2312"%> <% ! Private int value=10; //定义变量 public int getValue( ) { //定义方法 return value; } %> <html> <body> <% //使用定义的变量 for (int i=0; i<value; i++) out.printlen("<br>Test"); <% //使用定义的方法 for (int i=0; i<getValue( ); i++) out.printlen("<br>Test"); %> </body> </html> • JSP中的声明是一段Java代码,用来定义在产生的类文件中类的属性和方法。声明后的变量和方法可以在JSP的任意地方使用 • 声明的格式 <% ! Variable declaration 变量声明 Method declaration (s) 方法声明 %> • 声明后的变量和方法,在JSP页面的其他地方可以直接引用。如果在JSP中要大量使用某个函数,就要先声明这个函数,然后在后面进行应用,可以节省代码
表达式(Expression) expression.jsp (表达式的例子) <% @page contentType="text/html; charset=gb2312"%> <% ! Private int value=10; public int getValue() { return Value; } %> <html> <body> 第一个表达式,value的值是<% =value %> <br> <!– 注意表达式的使用 --> 第二个表达式,value的值是<% =getValue() %> <br> 第三个表达式,value的值是<% ="现在的时间是:"+new java.util.data().toString() %> </body> </html> • 表达式是在JSP请求处理阶段计算它的值,所得到的结果转换成字符串并与模板数据组合在一起 • 表达式在页面的位置,就是该表达式计算结果所处的位置 • 表达式的语法 <% =some java exprssion %> • 如果表达式的任何部分是一个对象,可以使用toString( )进行转换
Scriptlets Scriptlets.jsp (scriptlets使用实例) <%@page contentType="text/html; charset=gb2312" import="java.util.Data" %> <html> <body> 在这段代码中声明了两个变量str和date<br> <% String str; Data date = new Date( ); Str="现在时间发:"+date.toString( ); %> <hr> 我们在另一段scriptlets里使用前面的scriptlets <% out.println(str); %> <%-- 注意,这里是JSP的注释 --%> </body> </html> • Scriptlets是一段可以在处理请求时执行的Java代码 • Scriptlets包含在<%和%>之间,它可以产生输出,并将输出发送到客户的输出流中,也可以是一些流程控制语句,其中还可以包含一些合法的Java注释 • 在被编译的类中,多个Scriptlets可以按照在JSP中出现的顺序合并成一个Scriptlets • Scriptlets像其他的Java代码或者方法一样,可以修改在它内部的对象,作为方法引用的结果 • Scriptlets的使用方法 <% java code statement %> • Scriptlets的语法就是Java的语法,只是将Java代码包括在<%和%>之间。在Scriptlets中可以使用对象、变量和函数 • 说明:JSP中注释的使用 • Java标准注释(// —单行注释,/* */—多行注释) • XML标准注释<!-- --> • <% -- -- %>
9.2.4 动作元素 • 动作元素在请求处理阶段期作用 • JSP规范定义了一系列的标准动作,用JSP作为前缀 • 这些标准动作不管容器是如何实现的,每个web容器都必须提供这些操作类型 • 标准动作为网页设计者提供基本的功能,其他厂商可以自由提供其他的非标准的动作以增强功能 • 标准动作 • <jsp:useBean> • <jsp:setProperty> • <jsp:getProperty> • <jsp:param> • <jsp:include> • <jsp:forward> • <jsp:plugin>
<jsp:useBean> demobean.jsp (useBean的引用) <% @page contentType="text/html; charset=gb2312" %> <jasp:useBean id="times" scope="page" class="DemoBean"> <% times.setTimes(5); %> </jsp:useBean> <html> <body> <% for (int i=0; i<times.getTimes(); i++) out.println(times.service()); %> </body> </html> demobean.java (useBean的定义) //DemoBean.java Public class DemoBean { int times; public void setTimes(int times) { this.times = times; } public int getTimes() { return this.times; } public int service() { return times * times ; } } 这个Bean提供的服务就是通过service方法计算Times的平方 • <jsp:useBean>标签用来将JavaBean与JSP连接在一起,保证对象在标签指定的范围内可以使用 • 在定义JavaBean时要指定其id,以后通过id对该JavaBean的对象实例进行引用 • 语法结构 <jsp:useBean id="id" scope="page | session | application" otherDetails / > • Id是一个大小写相关的名字,用来表示这个实例 • Scope表示该对象可以使用的范围 • 页面、一次会话、整个应用程序 • otherDetails可以是以下四者之一 • class="className" • class="className" type="typeName" • beanName="beanName" type="typeName" • type="typeName" class为完全限定的类名 type属性指定类的类型,类型必须是超类、实现的接口和类本身
"testbean2.jsp"> "mynm" testbean2.jsp Property="name" param="mynm" /> testBean.java (setProperty的定义:一个测试的Bean) //testBean.java Public class TestBean { privte String name; //属性 private String password; //以下是Bean标准的getter 和setter方法 public void setName(string name) { this.name = name ; } public void setPassword(String password) { this.password = password ; } public String getName() { return this.name ; } public String getPassword() { return this.password ; } } <jsp:setProperty> setProperty的引用 testform1.html:提交请求网页 <html> <form method="get" action="testbean1.jsp"> <table> <tr>< td> <input name="name" type="text"> </td> <td> <input name="password" type="password"> </td> </tr><tr><td> <input type="submit" value="submit"> </td></tr></table> </html> testbean1.jsp:setProperty的引用 <% @page contextType="text/html; charset=gb2312" %> <jsp:useBean id="user" scope="page" class="TestBean"> <jsp:setProperty name="user" property="*" / > <html> <body> <% =user.getName( )%> <% =user.getPassword( ) %> </body> </html> • 此操作和useBean一起协作,用来设置Bean的简单属性和索引属性 • Bean的自省(interospection)用来发现出现的是哪些属性和他们的名字是什么,这些属性是简单的还是索引的,它们是什么类型的等 • setProperty的使用方法 <jsp:setProperty name="beanName" propertyDetails /> • 其中propertyDetails可以是以下几个中的一个 • property = "*" • property="propertyName" param="parameterName" • property="propertyName" • property="propertyName" value="propertyValue" • 其中parameterName是JSP里得到请求的参数,propertyValue是一个字符串或一个脚本。parameterName和propertyValue不能同时在一个标签里使用
<jsp:getProperty> • jsp:getProperty操作是对jsp:setProperty的补充,用来访问一个Bean的属性,它访问的属性值将被转换为一个string,然后发送到输出流中。如果是个对象,将调用toString( )方法 • jsp:getProperty的使用方法 <jsp:getProperty name="beanName" property="propertyName" /> • Property是要索引的属性名,name为Bean实例的名字,这个Bean必须通过<jsp:useBean>创建 getProperty.jsp (getProperty的使用) <%@page contentType="text/html; charset=gb2312" %> <jsp:useBean id="user" scope="page" class="TestBean"> <jsp:setProperty name="user" property="name" value="he"/ > <jsp:setProperty name="user" property="password" value="he_pwd"> <html> <body> <h1><br> getPropert 演示 name:<jsp:getProperty name="user" property="name" /> password:<jsp:getProperty name="user" property="password" /> </body> </html>
<jsp:param> • jsp:param操作被用来以“名-值”对的形式为其他标签提供附加信息,它和jsp:include、 jsp:forward以及jsp:plugin一起使用 • jsp:param使用格式 <jsp:param name="paraName" value="paramValue" /> • 其中name为属性相关联的关键字,value为属性的值 • 使用示例结合下面的jsp:include、jsp:forward以及jsp:plugin一起使用
<jsp:include> • jsp:include操作允许在请求时间内在现成的JSP页面里包含静态的或动态的资源 • 被包含的对象只有对JspWrite对象访问权,且不能设置头或cookie • 如果页面输出是缓冲的,那么缓冲区的刷新要优先于包含的刷新 • 此命令在效率上比<%@page include %>指令的效率低,单可以动态增加内容 • 指令格式 • <jsp:include page="fileName" flush="true" /> 或者 • <jsp:include page="fileName" flush="true"> <jsp:param name="paraName" value="paramValue" /> ..... • </jsp:include>
<jsp:forward> • jsp:forward操作允许将请求转发到另外一个JSP、Servlet或者静态资源文件,请求被转向到的资源必须位于同JSP发送请求相同的上下文环境 • 当遇到此操作时,就停止执行当前的JSP,转而执行被转发的资源 • jsp:forward使用方式 • <jsp:forward page="uri" /> 或者 • <jsp:forward page="uri"> <jsp:param name="paramName" value="paramValue" /> ...... • </jsp:forward>
<jsp:plugin> • jsp:plugin用来产生客户端浏览器的特别标签,可以用来插入Applet或者JavaBean • 使用方法 • <jsp:plugin type="beanapplet" code="className" codebase="uri" align="alignment" archive="archiveList" height="height" width="width"> <jsp:param name="paramName" value="paramValue" /> ... </jsp:param> <jsp:fallback> some fallback</jsp:fallback> • </jsp:plugin>
9.2.5 JSP内建对象 • JSP为简化页面的制作提供了一些内部对象,这些对象不需要由JSP的使用者实例化或者声明就可以使用了 • 所有的隐含对象只有对Scriptlets或者表达式有用,在JSP声明中不可用 • JSP的内部对象 • Request对象 • Response对象 • PageContext对象 • Session对象 • Application对象 • Out对象 • Config对象 • Page对象 • Exception对象
Request对象 • Request对象有它的请求访问,它被封装成HtpServletRequest接口,来自客户端的请求竟JSP处理后,由Request对象进行封装 • 它被作为jspService()方法的一个参数而由容器传递给JSP页面 • 通过getParameter(String parameterName)方法可以得到Request参数 • 通过GET、POST、HEAD等可以得到Request的类型 • 通过Cookie、Referer等可以得到引入的Http头 • 常用方法 • request.getParameter(string name) • request.getParameterName() • request.setCharacterEncoding(string encoding)
Response对象 • Response对象具有页面的范围,被包装成HttpServletResponse接口 • 它封装了JSP产生的响应,然后发送到客户端以响应客户的请求 • 它由容器产生,作为jspService() 方法的参数被传入JSP • 因为输出流是缓冲的,所以可以设置HTTP状态码和Response头 • 常用操作 • response.sendRedirect("newURL") • response.setHeader("HeadInfo")
Session对象 • Session对象用来保存每个用户的信息,以便跟踪每个用户的操作状态 • Session信息保存在容器中,Session的id保存在客户机的cookie中 • 一般情况下,用户首次登陆系统时容器会给此用户分配一个唯一标识的session id,这个id用于区分其他用户,当用户退出系统时,这个session就会消失 • 和session对应的是HttpSession借口 • 常用方法 • getAttribute(String sttrName) • setAttribute(String attrName) • getId ()
Application对象 • Application对象为多个应用程序保存信息 • 对于一个容器,每个用户共同使用一个Application对象 • 服务器启动后,就会自动产生Application对象,这个对象一直保持,直到服务器关闭为止 • Application对象为不同的用户共享某些信息提供了方便 • 常用方法 • getAttribute(string sttrName) • getAttributeName() • getInitParameter(string name) • getServletInfo() • setAttribute(string attrName)
PageContext对象 • PageContext对象被封装成javax.servlet.pageContext接口,它为JSP页面包装上下文,管理对属于JSP中特殊可见部分中已命名对象的访问 • 它的创建和初始化都是由容器完成的,JSP网页里可以直接使用PageContext对象 • Pagecontext对象的getXXX()、setXXX()和findXXX()方法可以用来根据不同的对象范围实现对这些对象的管理 • 常用方法 • getServletContext( ) • getAttribute( ) • setAttribute( ) • getSession( )
Out对象 • Out对象被封装成javax.servlet.jsp.JspWriter接口 • 它表示为客户打开的输出流,PrintWriter使用它向客户端发送输出流,即它主要用来向客户端输出数据 • 常用方法 • Out.println(Boolean/char/char[]/double/float/long/object/String) • Out.print(Boolean/char/char[]/double/float/long/object/String) • Out.newLine( ) • Out.flush( ) • Out.close( )
Config与Page对象 • Config对象被封装成javax.servlet.ServletConfig接口 • 它表示Servlet的一个配置 • 当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet • 常用方法 • getServletContext( ) • getServletName( ) • getInitParament( ) • Page对象 • Page对象是java.lang.object类的一个实例,它指的是JSP实现类的实例,即它是JSP本身,通过this可以对它进行访问
Exception对象 • Exception对象是java.lang.Throwable类的一个实例 • 它指的是运行时的异常,即被调用的错误页面的结果,只有它的错误页面(在页面指令里有isErrorPage=true)才可以使用 • 在JSP里捕获异常大多数是使用JSP标准机制,然后通过方法request.setAttribute(String errorName)把它作为一个属性放在request对象中,最终把这个请求转发给错误处理的JSP页面,处理错误的页面利用request.getattribute(String errorName)得到错误信息的具体内容
内建对象的综合应用 (1) • 首先进入一个表单网页,对application和session对象进行属性设置,文件名为innerobject.jsp <% @page contentType="text/html; charset=gb2312" %> <html><body> <form method="get" action="innerobject2.jsp"> <table> <tr> <br> <input type="text" name="username"> </td> <tr> <td> <input type="submit" value="提交"> </td> </tr> </table> </form> <% session.setAttribute("sessionAttr", "sessionAttribute: 输入中文" ) ; application.setAttribute("pageContextAttr", "pageContextAttribute") ; %> </body></html>
说明: • 不同的对象采用不同的方法获得请求的参数和系统的参数 • 只有在同一个页面中设置的page Context属性才可以使用 • PageContext可以通过getSession()方法获得session对象 • 利用request.setCharacterEncoding()语句可以把请求的数据用指定的编码显示 内建对象的综合应用 (2) • 表单处理程序innerObject2.jsp <%@ page content Type="text/html; charset=gb2312" errorPage="error.jsp" %> <%pageContrxt.setAttribute("pageContextAttr","pageContextAttribute2"); %> <html><body><center> <br><hr> request <br> <% request.setCharacterEncoding("gb2312"); 设置请求的编码 out.println("ServerName="+(String)request.getServerName()+"<br>"); out.println("ServletPath="+(string)request.getServletPath( )+"<br>"); out.println("得到请求的数据, username="+(String)request.getParameter("username")+"<br>"); %> <br><hr> session <br> <% out.println("得到session的属性, sessionAttr="+(String)session.getAttribute("sessionAttr")+"<br>"); %> <br><hr> application <br> <% out.println("得到application的属性, sessionAttr="+(String)session.getAttribute("sessionAttr")+"<br>"); out.println("得到application初始参数,initlogincount="+(String)application.getInitParameter("initlogincount")+"<br>"); %> <br><hr> pageContext <br> <% out.println("pageContext可以得到session的属性, sessionAttr="+ (String)pageContext.getSession().getAttribute ("sessionAttr") + "<br>"); out.println("得到pageContext的属性" + (String)pageContext.getAttribute("pageContextAttr")+"<br>"); %> <br>测试一下出错,看看错误在哪里处理。<a href="innerobject3.jsp">出错</a> </center> </body></html>
Error.jsp的设计方案 <% @ page contentType = "text/html; charset=gb2312" %> <% @ page isErrorPage = "true" %> 出错了!<br>错误信息:<br> <% = "Rxception" + exception %> <br><br> <% = "Message"+exception.getMessage() %> <% exception.printStackTrace(); %>
关于复习练习 • 在全面通读教材的基础上练习各项练习题 • 练习时先按实战要求自己完成,做完后再看答案 • 看答案时不要只是背答案,而要认真分析答案给出的解题思路,并能举一反三,真正弄懂弄通,达到融会贯通的效果 • 在反复练习的基础上,逐步练习完整的试卷 • 试卷练习同样要以实战为基点,按时按量进行联系,时间到了立即停止,然后按照答案进行评分 • 对做错的题进行认真分析,找到错误的原因。同样不是背答案,掌握解题思路,及时总结每套试卷练习中的得失。 • 模拟试卷是综合练习,也是按照考试的要求命题的,因此练习时也要按照考试的要求进行,以便调整做题心态,养成良好的临场状态