1、 《JSP程序设计》 一、概述 1.3 JSP页面与Web服务目录 1. 访问JSP页面的四种方式: (1)根目录:.\webapps\Root,直接通过http://127.0.0.1/JSP文件名访问 (2)webapps下的Web服务目录:.\webapps\MyWeb, 可通过http://127.0.0.1/MyWeb/JSP文件名访问,新建后不必重启
2、Tomcat服务器;
(3)新建Web服务目录:需要事先配置conf文件夹下的server.xml,添加:
3、后执行字节码文件响应用户的请求。 (2)当该JSP页面再次被请求执行时,JSP将直接执行字节码文件来响应用户,从而提高JSP页面的访问速度。 2.JSP页面的执行过程: (1)JSP引擎将JSP页面中的HTML标记发送到用户浏览器,由浏览器中的HTML解释器负责解释执行HTML标记; (2)JSP引擎处理JSP标记,并将有关的处理结果发送到用户浏览器上; (3)执行“<%%>”之间的Java程序片,把执行结果以字符串的形式交由用户浏览器显示; (4)当多个用户请求一个JSP页面时,Tomcat服务器为每个用户启动一个线程,负责执行字节码文件响应请求。 二、JSP页面与
4、JSP标记 2.1 JSP页面的基本结构 (1)HTML标记(2)JSP标记(3)变量/方法的声明(4)Java程序片(5)Java表达式 <%@ page contentType="text/html;charset=GB2312" %> <%!int sum; // 数据声明 public int getFactorSum(int n) { // 方法声明 sum = n;
5、 return sum; } %>
<% out.println("6、句 %> (1)在整个JSP页面内有效,与<%!、%>位置无关,习惯写在前面; (2)在<%!和%>中声明的变量成为JSP页面(类)的成员变量; (3)多用户访问JSP页面时,页面的成员变量在多个线程之间共享。 (4)避免用户在操作成员变量时变量被其他用户修改,有以下两种方法: ① 合理配置变量作用域; ② 对操作成员变量的方法使用synchronize关键字修饰。 2.3 Java程序片 <% Java程序片 %> (1)一个JSP页面可以有许多可分割的Java程序片,JSP引擎会按顺序执行它们; (2)Java程序片中声明的变量称为JSP页面的局部变量; (3)
7、多用户访问JSP页面时,页面的Java程序片在多个线程中独立运行。 2.4 表达式 <%=表达式%> (1)不能在表达式中插入语句,如<%=x=100%>是错误的; (2)<%和=之间不能有空格; (3)表达式的值交由服务器计算,计算结果以字符串的形式发送至用户端显示。 2.5 JSP中的注释 (1)HTML注释:用户可通过浏览器查看HTML注释的内容; (2)JSP注释:编译JSP页面时将忽略JSP注释,用户无法查看JSP注释的内容。 <%-- JSP注释 --%> 2.6 JSP指令标记(静态) 2.6.1 page指
8、令标记 —— 定义JSP页面的属性及其取值 <%@ page 属性="取值1","取值2",… %> page属性的取值: (1)language:脚本语言,目前只能取java(默认取值); (2)import:为 JSP页面引入Java核心包中的类, 如:<%@ page import="java.io.*" %> 默认引入了java.lang.*, javax.servlet, javax.servlet.jsp.*和javax.servlet.http.*; (3)contentType:确定JSP页面响应的MIME类型(打开方式)及字符编码; 如:<%@ page
9、contentType="text/html;charset=GB2312" %> <%@ page contentType="application/msword" %> contentType属性只能指定一个值,不允许指定多值; (4)session:是否需要使用内置的session对象(见4.3节),默认为true; (5)buffer:设置内置输出流out对象(见4.4节)的缓冲区大小,默认8KB,取值none表示不使用缓冲区; (6)autoFlush:当out对象的缓冲区被填满时,缓冲区是否自动刷新,默认true; 当取值false时,缓冲区满会出现缓存溢出异常; b
10、uffer取值none时该属性无法设置。
(7)isThreadSafe:设置JSP页面是否可多线程访问,默认true;
(8)info:JSP页面设置一个常用且经常修改的字符串值,可通过getServletInfo()方法调用。
2.6.2 include指令标记 —— 在该指令处静态插入一个文件
<%@ include file="文件URL" %>
插入的jsp文件中,page指令的contentType属性的值要与原文件保持一致。
2.7 JSP动作标记(动态)
2.7.1 param动作标记 —— 为其他标记以名值对的形式传递参数
11、me="属性名" value="属性值" />
不能单独使用,只能作为include、forward和plugin动作的子标记使用。
2.7.2 include动作标记 —— 动态加载文件
12、7.3 forward动作标记 —— 页面重定向
13、 width="小程序宽度" height="小程序高度">
14、点:(1)代码复用(2)数据处理与数据显示分离,有利于页面维护;
用户不能通过Web服务目录直接访问Tag文件。
3.1 Tag文件的结构(tag指令见3.4.1节)
<%@ tag pageEncoding="Tag文件编码" %>
[tag文件内容,要求同jsp文件]
3.2 Tag文件的存储目录 —— Webapps目录\WEB-INF\tags
3.3 Tag标记
3.3.1 Tag标记与Tag文件 —— JSP页面必须通过调用Tag标记调用Tag文件
<前缀:Tag文件名 [对象1="值1" 对象2="值2"...] /> 或
<前缀:Tag文件名 15、 [对象1="值1" 对象2="值2"...]>标记体前缀:Tag文件名>
[注]此处“对象”指的是JSP文件向Tag文件传递的参数名
3.3.2 Tag标记的使用
使用Tag标记调用Tag文件前,需要使用taglib指令引入Web服务目录下的标记库:
<%@ taglib tagdir="标记库目录" prefix="前缀" %>
若干个Tag文件所对应的Tag标记组成一个标记库,标记库可以有若干个,引入标记库后,可以使用带前缀的Tag标记调用Tag文件。
[注](1)标记库必须以"/WEB-INF/tags"开头;
(2)Tag文件<%!%>中声明的变量,会在 16、Tag文件执行完毕后立即释放内存空间。
JSP处理Tag标记的原理:
(1)Tag文件被首次调用或被修改时,JSP依次将该文件
转译(java文件)、编译(.class字节码文件)并执行;
(2)Tag文件已经编译成字节码文件时,JSP直接执行该文件。
3.3.3 Tag标记的标记体 —— 动态向Tag文件传递信息
<前缀:Tag文件名>标记体前缀:Tag文件名>
Tag文件通过使用
17、tag指令 —— 指定tag文件某些属性的值
<%@ tag 属性1="值 1" 属性2="值2"... %>
也可以使用多个tag指令分别指定tag文件各个属性的值
tag指令的属性:
(1)body-content:JSP中的Tag标记是否有标记体,以及标记体内容的类型:
① empty:Tag标记无标记体;
② tagdependent:Tag标记可以有标记体,且标记体按纯文本处理;
③ scriptless(默认):Tag标记可以有标记体,但标记体中不能有Java程序片;
(2)language:Tag文件使用的脚本语言,与JSP页面中的language属性类似;
( 18、3)import:向Tag文件引入Java核心包中的类,与同JSP页面import属性类似;
(4)pageEncoding:指定Tag文件字符编码,默认值为ISO-8859-1;
3.4.2 include指令:与JSP页面中的include指令类似。
3.4.3 attribute指令 —— 接收从JSP页面Tag标记中传来的对象(参数)
<%@ attribute name="对象名" require="true或false" type="对象类型" %>
name:从JSP页面的Tag标记传递过来的对象名(必须有);
require:① true:JSP页面必须传递 19、该对象,若没有传递则产生错误;
② false(默认):JSP页面可以不传递该对象;
type:传递对象的类型,必须带上包名,如java.lang.String(默认);
[注]
(1)Tag文件中定义的变量名与attribute指令接收的对象名相同时,变量将覆盖对象名,使其失效。
(2) 20、ibute指令可以接收除字符串外其他类型的对象;
③ 21、 ② NESTED:只能在Tag标记体内使用;
AT_BEGIN
NESTED
AT_END
22、
jspContext.setAttribute("对象名",对象引用);
[注]
(1)若JSP定义的变量名与variable指令返回的对象名相同,Tag文件将出现编译错误。
(2)若attribute指令接收的对象名与variable指令返回的对象名相同,Tag文件也会出现编译错误。
3.4.5 taglib指令 —— 与JSP页面的taglib指令类似
Tag文件也可以引入标记库,通过tag标记引用其他Tag文件(Tag文件的嵌套调用);
习题三:
T1:不可以(用户不能通过Web服务目录直接访问Tag文件)
T2:Webapps目录\WEB-INF\tags或 23、该路径下的自定义子目录
四、JSP内置对象
HTTP—WWW底层协议介绍:
用户端
浏览器
服务端
服务器
请求(Request)
响应(Response)
浏览器按照HTTP协议发出的请求包括请求行、HTTP头和信息体:
(1)请求行:规定了请求方法(如GET、POST等)、请求资源及HTTP版本;
(2)HTTP头:提供信息体的附加信息及请求来源;
(3)信息体:可包含HTML表单的内容。
服务器收到请求时,返回HTTP响应,包括状态行,响应HTTP头和响应信息体:
(1)状态行:说明所使用的协议、状态代码(如404)及文本信息;
24、2)响应HTTP头:提供信息体的附加信息及响应来源;
(3)响应信息体:用户请求的网页运行结果。
4.1 request对象 —— 获取用户提交的信息
request.getParameter("表单中的对象名");
[注]通过表单标签
25、量对象值为空,从而提示空指针异常。可通过判断和初始化变量来消除异常: if (var == null) var = “”; 4.1.2 处理汉字信息 用户提交的汉字字符会出现乱码,应利用字节数组来对汉字进行编码转换。 byte[] b = str.getBytes(“iso-8859-1”); str = new String(b); 4.1.5 处理HTML标记 String items[] = request.getParameter(“item”); // 复选框返回字符串数组 4.2 response对象 —— 动态响应用户请求 4.2.1 动态响应co
26、ntentType属性 response.setContentType("jsp文件page指令contentType属性的值"); 4.2.2 response的HTTP文件头 response.addHeader ("响应HTTP头名",响应值); response.setHeader ("响应HTTP头名",响应值); response.getHeader ("响应HTTP头名",响应值); 如:response.setHeader ("Refresh","5;url=跳转地址");可以实现5秒后跳转指定页面;response.getHeader("referer");将
27、返回引用该页面的页面地址。 4.2.3 response重定向 response.sendRedirect (URL); [注]与forward指令不同的是,使用response对象重定向的地址会改变,是客户端的跳转,不传参。 4.2.4 response的状态行 response.setStatus (int n); n的取值:1xx:实验用;2xx:请求成功;3xx:需进一步动作; 4xx:浏览器请求失败;5xx:服务器错误; 4.3 session对象 —— 在一次会话中保存用户提交的信息 会话:从用户访问服务器的Web服务目录,到用户离开该目录的过程。
28、 4.3.1 session对象的Id JSP引擎为每个线程的用户分配一个Session对象的Id字符串,存放在用户的Cookies中,可通过session.getId();获取。同一用户在不同服务目录(网站)的session不同。需要tomcat的session对象和客户端的cookies支持。 4.3.2 session对象与URL重写 URL重写:用户从一个页面链接到另一页面时,通过向URL添加参数,将用户session对象的ID传递给新页面。 String str = response.encodeRedirectURL(URL);
4.3.3 session对象存储数据 session.setAttribute("key",Obj value); // 新设置的同关键字值会覆盖旧值 session.getAttribute("key"); session.getAttributeName(); // 返回枚举对象,使用nextElements()遍历对象关键字 session.getCreationTime(); session.removeAttribute("key"); 4.3.4 在Tag文件中使用session30、对象 4.3.5 session对象的生存期限 session对象的生存期限取决于: (1)是否调用了invalidate()方法使其无效; (2)是否达到了最长“发呆”时间 (两次请求发送之间的间隔,可通过web.xml或setMaxInactiveInterval()方法设置,当设置为负数时,表示发呆时间不受限制); (3)服务器是否被关闭; 4.4 out对象 —— 输出数据 out.println(数据类型); 4.5 application对象 —— 在同一Web服务目录下为所有用户所共享; 4.5.1 application对象的常用方法:同Sessio
31、n对象; 习题四: T1:C(复选框返回字符串数组) T4:实现用户的重定向。(见4.2.3节) T5:(1)不同。(2)相同。(3)可能消失。(4)可能消失(见4.3.1和4.3.5节) 六、在JSP中使用数据库 1.JDBC是什么?有什么作用?(P146) 答:JDBC是用Java语言编写的数据库驱动程序,它可以调用本地的JDBC-数据库驱动程序和响应的数据库建立连接。 七、JSP与JavaBean JavaBean是一种Java类,通过封装属性和方法称为具有某种功能或者处理某个业务的对象,简称Bean。 7.1 编写使用JavaBean 1.
32、编写bean: 为使JSP引擎识别bean对象的属性和方法,在类的方法命名上需要遵守以下规则: (1)为类的成员变量提供两个操作方法: ① public Type getXxx(); // 获取成员变量 ② public void setXxx(Type T); // 设置成员变量 [注]关联属性,即可由其他成员变量计算得出的属性值无需提供set方法。 (2)类中方法的访问权限必须为public,其中构造方法必须为无参构造方法; (3)Tomcat 5.0以上版本:bean必须带有包名。 2. 保存bean: 将编写好bean的java源文件编译成字节码文件后,保存在:
33、
Webapps目录\WEB\classes\[根据bean中包名建立相应路径]
7.1.2 使用bean
(1)JSP页面需要导入bean中对应的包名,如:<%@ page import="包.*" %>;
(2)使用useBean动作标记加载使用bean:
1. useBean标记的格式:
34、
scope取值:
① page:当前页面;
② request:一次请求响应期间;
③ session:用户会话期间;
④ application:在JSP页面下分配多用户共享的bean
7.2 获取和修改bean的属性
7.2.1 getProperty动作标记 —— 要求保证bean对象中有相应属性的get方法
35、>
7.2.2 setProperty动作标记 —— 要求保证bean对象中有相应属性的set方法
1. 将bean属性的值设置为表达式或字符串:
36、应属性的类型。
2. 通过HTTP表单的参数值设置bean中相应属性的值:






