第二章 JSP讲义
一、一个JSP页面的五大组成部分
1、HTML语言的标签
2、JAVA的程序片段
3、JSP的指令
4、JSP的动作
5、注解代码
二、指令标签
2.1 页面指令: page 指令
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
Page 指令是JSP页面最常用的指令,用于定义整个JSP页面的相关属性,这些属性在JSP被服务器解析成Serverlt时会转换为相应
的Java程序代码。Page指令的语法格式如下:
<%@ page attr1="value1" attr2="value2" ......%>
page 指令包含的属性有 15 个,下面对一些常用的属性进行介绍。
1、language 属性
该属性用于设置 JSP 页面使用的语言,目前只支持 Java 语言,以后可能会支持其他语言,如C++、C#等。该属性的默认值是 Java。
例如:
<%@ page language="java" %>
2、extends 属性(不常用,影响服务器优化)
该属性用于设置 JSP 页面继承的 Java 类,所有 JSP 页面在执行之前都会被服务器解析成 Serverlt,而 Serverlt 是由 Java 类定义
的,所以 JSP 和 Serverlt 都可以继承指定的父类。该属性并不常用,而且有可能影响服务器的性能优化。
3、import 属性
该属性用于设置 JSP 导入的类包。JSP 页面可以嵌入Java代码片段,这些Java代码在调用 API 时需要导入相应的类包。
该属性默认加载类有 https://www.wendangku.net/doc/f1773568.html,ng、javax.servlet、javax.servlet以及javax.servlet.http。
例如:
<%@ page import="java.util.*" %>
多个属性值之间用 “,” 隔开
4、pageEncoding 属性
该属性用于定义 JSP 页面的编码格式,也就是指定文件编码。
例如:
<%@ page page pageEncoding="utf-8"%>
5、contentType 属性
该属性用于设置 JSP 页面的 MIME 类型和字符编码,浏览器会据此显示网页内容。
例如:
<%@ page page contentType="text/html" charse="UTF-8"%>
6、session属性
该属性指定 JSP 页面是否使用 HTTP 的 session 回话对象。其属性值是 boolean 类型,可选值为 true 和 false。默认值是 true
可以使用 session 会话对象;如果设置为 false,则当前 JSP 页面将无法使用 session 会话对象。
例如:
<%@ page page session="false"%>
上述代码设置 JSP 页面不使用 session 对象,任何对 session 对象的引用都会发生错误。
7、buffer 属性
该属性用于设置 JSP 的 out 输出对象使用的缓冲区大小,默认大小是 8KB,且单位只能使用 KB。建议程序开发人员使用 8 的倍数
16、32、64、128等作为该属性的属性值。
例如:
<%@ page page buffer="128kb"%>
上述代码设置 JSP 页面不使用 session 对象,任何对 session 对象的引用都会发生错误。
8、autoFlush 属性
该属性用于设置 JSP 页面缓存满时,是否自动刷新缓存。默认值为 true;如果设置
为 false,则缓存被填满时将抛出异常。
例如:
<%@ page autoFlush="false"%>
上述代码取消了页面缓存的自动刷新。
9、info 属性
该属性用于设置 JSP 页面的相关信息,该信息可以在 Serverlt 接口的getServerltInfo()方法中获取。
例如:
<%@ page info="这是一个登陆页面,是系统的入口"%>
上述代码取消了页面缓存的自动刷新。
10、isErrorPage 属性
通过该属性可以将当前 JSP 页面设置成错误处理页面来处理另一个JSP页面的错误,也就是异常处理。这意味着当前JSP页面业务的改变。
默认值为 false。 是否处理 其他页面产生的错误信息。
例如:
<%@ page isErrorPage="true"%>
11、errorPage 属性
该属性用于指定处理当前 JSP 页面异常错误的另一个JSP页面,指定的 JSP 错误处理页面必须设置 isErrorPage 属性为 true。
errorPage 属性的属性值是一个 url字符串。
将错误信息传向哪个页面。 页面的地址。
例如:
<%@ page errorPage="error/loginErrorPage.jsp"%>
注意:如果设置该属性,那么在 web.xml 文件中定义的任何错误页面都将被忽略,而优先使用该属性定义的错误处理页面。
12、isELlgnored 属性
该属性用于定义JSP页面是否忽略 EL 表达式的使用。 在 Servert2.4版本中其默认值为 false,即 JSP 支持 EL 表达式;而在 Serverlt
2.3 以前的版本中该属性的默认值为 true,本书使用 Tomcat6.0服务器支持的Serverlt2.4,所以默认值是 false,可以直接使用EL表达式。
例如:
<%@ page isELlgnored="false"%>
13、isThreadSafe 属性
该属性用于设置服务器端处理上网用户请求的方式。设置值为 true 表示以多线程的方式来处理用户的需求,
若为 false,则表示以单一线程的方式来处理用户的请求,默认值为true。
2.2 include 包含指令
include 指令用于文件包含。该指令可以在 JSP 页面中包含另一个文件的内容,但是它仅支持静态包含,也就是说被包含文件中的
所有内容都被原样包含到该 JSP 页面中;如果被包含文件中有代码,将不被执行。
被包含的文件可以是一段Java代码、HTML代码或者是另一个JSP页面。例如:
<%@include file="validate.jsp"%>
上述代码将当前 JSP 文件中相同位置的 validate.jsp 文件包含进来。其中,file属性用于指定被包含的文件,其值是当前 JSP
页面文件的相对 URL 路径。
2.3 taglib 指令
该指令用于加载用户自定义标签,自定义标签将在后面章节中进行讲解。使用该指令加载后的标签可以直接在 JSP 页面中
使用。其语法格式如下:
<%@taglib prefix="fix" uri="tagUiorDir"%>
prefix:该属性用于设置加载自定义标签的前缀。
uri:该属性用于指定自定义标签
的描述符文件位置。
例如:
<%@taglib prefix="view" uri="/WEB-INF/tags/view.tld"%>
二、嵌入java代码
1、嵌入格式
<% 编写 Java 代码 %>
2、声明
声明脚本用于在 JSP 页面中定义全局的(即整个 JSP 页面都需要引用的)成员变量或方法,他们可以被整个 JSP 页面访问
服务器执行时会将 JSP 页面转换成 Serverlt 类,在该类中会把使用 JSP 声明脚本定义的变量和方法定义为类的成员。
(1)定义全局变量
例如:
<%! long startTime = System.nanoTime();%>
上述代码在 JSP 页面定义了全局变量 startTime,该全局变量可以在整个 JSP 页面使用。
(2)定义全局方法
例如:
<%!
int getMax(int a,int b){
int max = a>b?a:b;
return max;
}
%>
3、JSP表达式
JSP表达式可以直接把 java 的表达式结果输出到 JSP 页面中。表达式的最终运算结果将被转换为字符串类型,因为在网页中
显示的文字都是字符串。JSP表达式的语法格式如下:
<%= 表达式%>
其中,表达式可以是任何Java语言的完整表达式。
例如:圆周率是:<%=Math.Pi%>
三、注释
1、HTML注释
不会显示在网页中,但是在浏览器查看源代码时,还是能够看到。
语法格式如下:
2、JSP注释
只在服务器端显示,用户看不到。
语法格式如下:
<%-- 注释文本 --%>
3、动态注释
由于HTML注释对JSP嵌入的代码不起作用,因此可以用它们的组合构成HTML注释文本。
例如:
上述代码将当前日期和时间作为 HTML 注释文本。
4、代码注释
JSP页面支持嵌入的Java代码,这些Java代码的语法和注释方法都和Java类的代码相同,因此也可以使用Java的代码注释格式
例如:
<%//当行注释%>
<%
/*
多行注释
*/
%>
<%
/**
JavaDoc 注释,用于成员注释
*/
%>
四、JSP动作标签
JSP2.0中提供了 20 个标准的使用 XML 语法写成的动作标签,可以实现特殊功能。
JSP动作标签优先级低于指令标签。
动作标签遵循 XML 语法,包括开始标签和结束标签。其通用的语法格式如下:
<标签名 属性1="值1" 属性2="值2" .../>
或者:
<标签名 属性1="值1" 属性2="值2" ...>
标签内容
标签名>
下面将介绍 JSP 项目开发中常用的标签。
(1)
其语法格式如下:
或者:
子标签
page="
相对于当前文件的相对路径"
flush:可选参数,用于设置是否刷新缓存区。默认值是 false;如果设置为 true ,则在当前页面输出
使用了缓冲区的情况下,将先刷新缓存区,然后在执行包含工作。
例如:
(2)
语法格式:
(3)
该标签可以作为其他标签的子标签,为其他标签传递参数。其语法格式如下:
name:name属性用于指定参数名称
value:value用于设置对象的参数值
例如:
上述代码再转发请求到 adduser.jsp 页面的同时,传递了 userName 参数,其参数值为 mingri。
五、JSP解决中文乱码的方法
方法一:地址栏发送中文数据出现乱码
发送方:我要跳转到其他网页">跳转
接收方:
<%
String name = request.getParameter("name");
byte[] names = https://www.wendangku.net/doc/f1773568.html,.URLEncoder.encode(name,"ISO-8859-1").getBytes();
name = new String(names,"utf-8");
name = https://www.wendangku.net/doc/f1773568.html,.URLDecoder.decode(name,"utf-8");
%>
我是跳转页面,我接受到的内容是:姓名=<%=name %>
方法二:request请求对象解决中文乱码问题
在发送数据方要讲数据发送的编码设置为:request.setCharacterEncoding("utf-8");
方法三:在服务器内解决
在Tomcat服务器的conf文件夹中,打开webserver.xml文件修改请求的编码
redirectPort="8443" URIEncoding="utf-8" />
方法四:
六、JSP网页中变量的四个范围
1、page:在当前范围内有效。
2、request:在客户端请求范围内有效。
3、session:在一次会话范围内有效。
4、application:在全局范围内有效。 特点:只有服务器关闭时,这个对象才结束。
第三章 Servlet 技术
一、Servlet的基本介绍
1、什么是Servlet
Servlet是java编写的服务器端的应用程序,运行在服务器端,打开一个浏览器就调用一个Servlet,它可以被看做是,客户端与服务器端的
中间层,负责接收和请求客户端用户的响应。
2、Servlet的功能
a:对客户端发送的数据进行读取和拦截
客户端发送一个请求时,一般都会携带一些数据,当一个Servlet接收到这些请求时,Servlet通过自己的方法会得到这些参数
(request.getParameterName(name)),Servlet可以读发送的数据起到拦截作用,通过分析、处理判断客户端是否可以做某些操作,
如:检查访问
权限,设定程序的字符集,检查用户的角色,因此,Servlet如果这样的功能,一般称为拦截器。
b:读取客户端请求的隐含数据
客户端发送数据的两种方式,一:隐含数据 二:显示数据,隐含数据一般不直接跟随在URL中,他存储于请求的来源中,缓冲数据
Cooking中,客户端的类型中。显示数据是用户可以看到的,如表单中的数据,URL中的参数。
c:运行结果或者是生成结果
当一个WEB应用程序,对客户端发出请求,做出相应时,一般需要很多的中间过程才能得到结果,Servlet就起到了这个中间角色的功能 它协调各组件、各部分完成相应的功能。根据不同的请求,做出相应的响应,并显示结果。
d:发送相应的数据
Servlet在对客户端做出相应并处理得到结果后,会向客户端发相应后的数据,在WEB应用程序中,Servlet主要功能就是它。
无论技术多么突出,多么先进都必须经过这点。
3、Servlet的生命周期
3.1 Servletd 的生命周期有三个阶段:初始化阶段、运行阶段、消亡阶段。
3.2 Servlet 的初始化阶段:
分为装载和初始化两个阶段,装载就是 Servlet 容器装载一个Servlet类,把它装载到java虚拟机的内存中。Servlet容器创建
一个Servlet对象,并且与WEB.xml 中的配置信息对应起来,初始化阶段,调用Servlet中的 init()方法,在整个生命周期中 init()方法
只执行一次。
3.3 Servlet的运行阶段
这个阶段就是相应客户请求的阶段,当有客户端请求时,Servlet会创建两个对象,HttpServletRequest 和 HttpServletResponse
然后调用 serivce(HttpServletRequest request, HttpServletResponse request)方法。service方法通过request对象获得请求对象的信息
并加以处理,在由Response对象对客户端做出响应。
3.4 Servlet消亡阶段
当Servlet应用程序被终止后,Servlet容器会调用 destroy()方法,对Servlet对象进行销毁操作,释放它占用的所有资源,
destroy方法也被执行一次。
4、Servlet案例
package https://www.wendangku.net/doc/f1773568.html,;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
//每一个Servlet类都要继承httpServlet,并且重写它的一些方法。
/**
* 解决序列化问题
*/
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
System.out.println("初始化 init()");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("调用 doGet()方法");
response
.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("");
out.println("
转发给
对应的Servlet来处理请求。
web.xml文件是什么:web.xml文件是WEB项目的配置文件,主要用于配置WEB容器,默认情况下,WEB容器只有一个你默认请求页面
我们还可以在 web.xml 中配置: 监听器、过滤器等内容,这些配置的组件共同组成了web容器的功能。
②当客户端请求HTTP服务器时,会使用HTTP来传递请求、标头、参数等信息。HTTP协议是无意识的的协议,通过文本信息传递消息
而Servlet是Java对象,运行在WEB容器中,当HTTP服务器将请求转给web容器时,WEB容器会创建HttpServletRequest和HttpServletResponse
对象,将请求中的信息传递给 HttpServletRequest对象,而HttpServletResponse对象则作为对客户端响应的Java对象。
③WEB容器会根据配置信息(例如:web.xml或者@WebServlet),查找响应的Servlet并调用它的service()方法。service方法会根据
HTTP请求的方式,决定是调用doPost()方法或者是doGet()方法。例如:HTTP请求的方式为Post,则调用doPost()方法。
④在doPost()方法中,可以使用HttpServletRequest对象、HttpServletResponse对象。例如:使用getParameter()取得请求参数
值,使用getWriter()取得输出流对象PrintWriter,并进行响应处理。最后由 WEB 容器转换为 HTTP 响应,由 HTTP 服务器对浏览器做出
响应。随后,WEB容器将 HttpServletRequest对象、HttpServletResponse对象销毁回收,请求响应结束。
类似于这种request、response对象的创建、服务、销毁,就是WEB容器提供的请求、响应的生命周期管理。
注意点:我们可以解决客户端对象发送数据的编码错误和服务器端发向客户端的编码错误。
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
(2)令人茫然的doXXX()方法
Servlet中的service()方法包括多种:doGet()、doPost()、doHead()等。当Method是POST时,请求会调用doPost()方法,当Method
是GET时,请求会调用doGet()方法。在定义Servlet时,一般是继承HttpServlet类,然后定义doPost()或者doGet()方法。
(3)使用getReader()、getInputStream()读取Body内容
在 HttpServletRequest 对象中,可以运用getReader()方法获取Body内容,而使用getInputStream()方法获得上传文件的内容。
9、关于Servlet的总结
(1)Servlet称为业务处理器,处理客户端的所有业务与客户端进行交互,提供了N种方法和N个对象供我们使用。
(2)一个类如果是Servlet类,就必须要继承HttpServlet类,并且要重写它的doGet()和doPost()方法,来完成业务处理操作。
(3)doGet()和doPost()方法的关系是doGet()调用了doPost(),他们都可以完成业务处理操作,对应的是客户端get/post的数据传递方法。
(4)Servlet中几个
重要方法:
①PrintWriter out = response.getWriter(); 客户端的输出对象。
②request.getRequestDispatcher("/hello.html").forward(request, response); 跳转到指定的Servlet,方法是forward
③request.getParameter("username"); 获取客户端传递的形参
a、http://localhost:8080/forward2/hello.do?username=xm 客户端传递参数
b、request.setAttribute("message",message ); 在服务器端设置临时变量
④response.setContentType("text/html; charset=utf-8"); 设置客户端的数据编码格式
request.setCharacterEncoding("utf-8"); 设置客户端的编码格式
response.setCharacterEncoding("utf-8"); 设置客户端的编码格式
⑤request.getRequestDispatcher("/hello.html").forward(request, response); 第一种跳转方法
第二种跳转方式:
RequestDispatcher RD = request.getRequestDispatcher("/hello.html");
RD.include(request, response);
⑥response.sendRedirect(request.getContextPath()+"/two"); 跳转到要执行的指定程序
sendRedirect 跳转到指定位置
⑦request.getContextPath()+"/two" 获取当前上下文的路径,就是当前网站的路径
10、ServletContext
(1)ServletContext:称为(服务器端)共享信息对象
①ServletContext对象是Servlet中的全局存储信息对象,当服务器启动时,WEB容器为WEB应用创建一个唯一的ServletContext对象,
在应用内的Servlet共享一个ServletContext对象,存放着共享数据,应用的Servlet可以通过ServletContext对象提供的各种方法获得共享
数据,ServletContext只有在WEB应用程序关闭时才被销毁。
②ServletContext常用的方法
方法 功能
getRealPath 获取给定的虚拟路径所对应的真实路径名
getResource(String uripath) 返回由 path 指定的资源路径对应的一个URL对象
getResourceAsStream(String uripath) 返回一个指定位置资源的InputStream。返回的InputStream可以是任意类型和长度的。
使用时指定路径必须以"/"开头,表示相对于应用程序环境根目录。
getResourceDispatcher(String uripath) 返回一个特定的URL的RequestDispatcher对象,否则就返回一个空值。
getResourcePaths(String path) 返回一个存储web-app中所指资源路径的Set(集合),如果是一个目录信息,会以"/"作为结尾。
getServerInfo 获取服务器的名字和版本号。
getInitParameter() 用来调用初始化在web.xml中存放的参量。
11、监听器
(1)什么是监听器
监听器就是监听应用程序的请求,而进行应用程序请求的处理的一种特殊方法,它是由一组类组成。
例如:
HttpServletRequest、HttpSession、ServletContext 对象在WEB容器中遵循生成、进行、销毁这样的生命周期。进行相应
事件的处理。
(2)监听器是如何编写的
要创建一个监听器就必须要实现
一个监听器的接口,然后重写这个接口中的抽象方法,来完成事件的处理。
(3)Servlet提供的监听器借口和事件类
类别 监听借口 监听事件
与ServletContext相关 ServletContextListener ServletContextEvent
ServletContextAttributeListener ServletContextAttributeEvent
与HttpSession相关 HttpSessionListener HttpSessionEvent
HttpSessionActivationListener
HttpSessionAttribteListener HttpSessionAttributeEvent
HttpSessionBindingListener
与ServletRequest相关 ServletRequestListener ServletRequestEvent
ServletRequestAttributeListener ServletRequestAttributeEvent
(4)编写一个监听器的三部曲
package https://www.wendangku.net/doc/f1773568.html,.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
//事件监听器的实现方法
//第一步:实现SercletContextListener接口
//第二步:重写SercletContextListener的两个抽象方法,完成事件处理操作
public class abcListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
System.out.println("监听器容器初始化时完成的工作----->"+event.getServletContext().getContextPath());
System.out.println("下雪了,天晴了,人就好了");
}
public void contextDestroyed(ServletContextEvent event) {
System.out.println("监听器容器销毁时完成的工作----->"+event.getServletContext().getContextPath());
System.out.println("我把大雪赶跑了");
}
// 在web容器中配置这个监听器,让它监听请求web容器的事件,并且进行处理
// 配置代码如下:
//
//
// https://www.wendangku.net/doc/f1773568.html,.listener.abcListener
//
//
}
(5)application对象的监听器
①对application的监听,实际上就是对ServletContext(Servlet上下文)监听,主要有ServletContextListener和
ServletContextAttributeListener两个接口。
②ServletContextListener称为上下文状态监听器。
它有两个方法: contextInitialized(ServletContextEvent event)
contextDestroyed(ServletContextEvent event)
来处理服务器的初始化监听工作和服务器的销毁监听工作。
③ServletContextAttributeListener称为上下文属性监听器
(6)对session的监听
①当客户端向服务器发出请求时,当服务器接收这个请求并响应时,称为一次会话,叫做session,当浏览器关闭时session销毁会话结束。 这也是session的生命周期,也是session的范围。
②对session的监听,针对于session的监听器操作主要有:
HttpSessionListener接口
HttpSessionAttribteListener接口
HttpSessionBindingListener接口
③session状态监听器:HttpSessionListener接口
当创建或销毁session时
,需要实现这个接口。
(7)Session监听器的实现和配置步骤
①创建一个类,要求它实现HttpSessionListener这个接口,实际上创建的类,就是一个监听器的子类。
例如:
②重写这个监听器接口中的所有方法,来监听事件的发生,并处理这个
例如:
③在web容器中配置这个监听器(即在web.xml中配置)
例如:
(8)请求状态监听器:ServletRequestListener接口
①当要求