《Servlet技术基础.ppt》由会员分享,可在线阅读,更多相关《Servlet技术基础.ppt(95页珍藏版)》请在三一办公上搜索。
1、第1部分 Servlet技术基础,主讲人:柴大鹏 Email:,主要内容,Servlet简介,1,HTTP与HttpServlet,2,Servlet的配置,3,4,请求转发与重定向,5,Servlet上下文,Servlet简介,历史背景,当网络开始被用于提供服务时,服务供应商逐渐意识到需要提供动态的内容。Applet作为最早尝试实现这一目标的技术,侧重于使用客户端平台提供动态的用户体验。与此同时,开发商还对将服务器平台用于这一目的进行了调查。,Servlet简介,最初,CGI(Common Gateway Interface)脚本是用于生成动态内容的主要技术。尽管被广泛使用,但是CGI脚本技
2、术存在着一些缺点,包括平台依赖性和缺乏可扩展性。为了解决这些问题,Java Servlet技术提供了一种便捷的方式用来生成动态的、面向用户的内容。,Servlet简介,什么是Servlet?,Java Servlet是与平台无关的服务器端组件,它可以运行在Servlet容器中,由Servlet容器负责与客户端的通信(采用“请求/响应”模式)以及调用Servlet的方法。,Servlet简介,Servlet的功能,创建并返回基于客户请求的动态HTML页面。创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。与其他服务器资源(如数据库或基于Java的应用程序)进行通信。,Servle
3、t简介,接收多个客户端的输入,并将结果广播到多个客户端上。例如,Servlet可以实现支持多个参与者的游戏服务器。根据客户请求采用特定的MIME(Multipurpose Internet Mail Extensions)类型对数据过滤,例如进行图像格式转换。,Servlet简介,Servlet的缺点,尽管Servlet功能非常强大,但并没有被大规模地使用,主要原因在于Servlet的编写很繁琐,它将网页的显示部分和业务逻辑功能混合在一起,不易于维护和分工。,Servlet简介,【例2.1】编写一个Servlet,向客户端输出一个字符串“Hello,world”。,简单的Servlet实例,S
4、ervlet简介,编写Servlet源文件,package cn.sdcet.servlet;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HelloWorldServlet extends HttpServlet protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException PrintWriter out=respo
5、nse.getWriter();out.println(Hello,world);out.close();,Servlet简介,自动编译源程序,在MyEclipse集成开发环境下进行开发,IDE会自动对Servlet进行编译。在工作空间目录下的“ServletProjWebRootWEB-INFclassescnsdcetservlet”文件夹下可以看到生成的.class文件。,Servlet简介,手动编译源程序,打开命令窗口,转到HelloWorldServlet.java所在的目录,然后执行:javac HelloWorldServlet.java注意:编译过程中常见的错误是找不到java
6、x.servlet和javax.servlet.http这两个包及包中的类。要解决这个问题,就需要让Java编译器知道Servlet API库所在的位置。Tomcat中已经包含了这个库文件,它的完整路径为libservlet-api.jar,只需要在系统的CLASSPATH环境变量中添加这个JAR文件的路径就可以了。,Servlet简介,部署Servlet,在web.xml中为HelloWorldServlet.java添加如下配置信息:HelloWorldServlet HelloWorldServlet HelloWorldServlet/hello,Servlet简介,访问Servlet
7、,打开浏览器,在地址栏中输入http:/localhost:8080/ch02/hello后回车。,Servlet简介,Servlet的生命周期,Servlet的生命周期由Web容器控制,当Servlet被请求时Web容器的操作:如果Servlet实例不存在,Web容器会首先加载Servlet类,然后创建一个该Servlet的实例,接着调用它的init()方法进行初始化。调用service()方法,并向它传递请求和响应对象。当Web容器检测到一个Servlet实例应该被移除时,就会调用它的destroy()方法,以便让该实例可以释放它所使用的资源。,Servlet简介,Servlet生命周期,
8、Servlet简介,Servlet API,Servlet的框架是由两个Java包组成的:javax.servlet和javax.servlet.http。在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的通用接口和类。在javax.servlet.http包中定义了采用HTTP协议通信的HttpServlet类。,Servlet简介,Servlet框架类图,Servlet简介,实现Servlet的方法,扩展GenericServlet类,扩展HttpServlet类,当用户开发自己的Servlet时,可以有下面两种方法:,Servlet简介,如果Servlet类扩
9、展了GenericServlet类,则必须实现service()方法。Servlet容器将客户的请求信息封装在ServletRequest对象中,然后传递给service()方法;service()方法将响应客户端的结果通过ServletResponse对象传给客户。public abstract void service(ServletRequest request,ServletResponse response)throws ServletException,IOException;,扩展GenericServlet类,Servlet简介,HttpServlet已经实现了service(
10、)方法,它首先从HttpServletRequest对象中获取HTTP的请求方式,然后再根据请求方式调用相应的方法。HTTP的请求方式包括DELETE、GET、OPTIONS、POST、PUT和TRACE,在HttpServlet类中分别提供了与之相对应的方法,它们是doDelete()、doGet()、doOptions()、doPost()、doPut()和doTrace()。,扩展HttpServlet类,Servlet简介,Servlet接口,Servlet框架的核心是javax.servlet.Servlet接口,所有的Servlet都应当实现这一接口,它包括下面的5个方法:,ini
11、t()service()destroy(),getServletConfig()getServletInfo(),Servlet简介,ServletRequest接口,ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端使用的协议、以及发出客户请求的远程主机信息等。ServletRequest的子类可以为Servlet提供更多的与特定协议相关的方法,如HttpServletRequest提供了读取HTTP Head信息的方法。,Servlet简介,ServletRequest接口的部分方法,Servlet简介,ServletResponse接口,Serv
12、letResponse接口为Servlet提供了返回响应结果的方法,它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutputStream。ServletResponse子类可以提供更多和特定协议相关的方法,如HttpServletResponse可以提供设定HTTP HEAD信息的方法。,Servlet简介,ServletResponse接口的部分方法,Servlet简介,ServletConfig接口,Servlet容器使用ServletConfig对象在Servlet初始化时向其传递配置信息。,HTTP与HttpServlet,HTTP概述,HTTP(
13、HyperText Transfer Protocol,超文本传输协议),属于高层应用协议,工作在OSI七层体系中的应用层。HTTP协议主要用在浏览器和Web服务器之间进行通信,是一种最基本的客户机/服务器的访问协议。浏览器向服务器发送请求,而服务器回应相应的网页。,HTTP与HttpServlet,HTTP协议的主要特点,客户机/服务器模式。简单快速。灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。无连接:每次连接只处理一个请求。服务器处理完客户的请求,并收到客户端的应答后,就断开连接。可以节省传输时间。,HTTP与HttpServlet,无状态:
14、协议对于事务处理没有记忆能力。意味着如果后续处理需要前面的信息,它必须重新传输,这样可能导致每次连接传送的数据量增大。另一方面,如果服务器不需要先前信息时它的应答就较快。,HTTP与HttpServlet,图:连接过程,HTTP与HttpServlet,HTTP消息格式,HTTP消息报文分为三部分:请求行/状态行 头信息 实体,HTTP与HttpServlet,HTTP请求,GET/sample.jsp HTTP/1.1Accept:image/gif,image/jpeg,*/*Accept-Language:zh-cnConnection:Keep-AliveHost:localhostU
15、ser-Agent:Mozilla/4.0(compatible;MSIE5.01;Windows NT 5.0)Accept-Encodin:gzip,deflateusername=chaidapeng&password=123456,请求行,请求头,请求正文,HTTP与HttpServlet,请求的第一行是“请求方法 URI 协议/版本”,其中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1”代表协议和协议的版本。URI完整的指定了要访问的网络资源,通常只要给出相对于服务器根目录的相对目录即可,因此总是以“/”开头。,(1)请求行,HTTP与HttpSer
16、vlet,根据HTTP标准,HTTP请求可以使用多种请求方法,其中最常用的是GET和POST。,HTTP与HttpServlet,GET请求,GET请求最为常见,它后面跟随一个网页的位置,服务器接受请求并返回其请求的页面。在地址栏输入一个地址或在网页上点击链接时,浏览器就像服务器发送了HTTP GET请求。除了页面位置作为参数外,请求中还可以包含其它的内容作为参数,以发送给服务器更多的信息。,HTTP与HttpServlet,POST请求,POST请求要求服务器接收大量的信息,除了POST后面跟随的参数之外,浏览器还会在后面持续发送数据,让服务器进行处理。当填写好表单数据后提交时(method
17、=post),发送的一般是POST请求。通常,POST方法是和服务器应用程序分不开的,服务器应该启动一个服务器应用程序来处理POST发送来的表单数据。,HTTP与HttpServlet,请求头包含许多有关客户端环境和请求正文的有用信息,如请求头可以声明浏览器所用的语言、请求正文的长度等。,(2)请求头,(3)请求正文,请求头和请求正文之间是一个空行。这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户端提交的查询字符串信息。,HTTP与HttpServlet,HTTP响应,HTTP/1.1 200 OKServer:Apache Tomcat/6.0.20Date:
18、Mon,6 Oct 2003 13:13:33 GMTContext-Type:text/htmlLast-Modified:Mon,6 Oct 2003 13:23:42 GMTContent-Length:112HTTP响应示例 Hello HTTP!,状态行,响应头,响应正文,HTTP与HttpServlet,HTTP响应的第一行类似于HTTP请求的第一行,包括协议、状态代码和描述。这里表示通信所用的协议是HTTP 1.1,服务器已经成功处理了客户端发出的请求(200表示成功)。,(1)响应行,HTTP与HttpServlet,状态代码,HTTP与HttpServlet,响应头包含了许多
19、有用的信息,例如服务器类型、日期时间、内容类型和长度等。,(2)响应头,HTTP与HttpServlet,响应正文就是服务器返回的HTML页面,响应头和正文之间也必须用空行分隔。,(3)响应正文,HTTP与HttpServlet,HttpServlet简介,HttpServlet能够根据客户端发出的HTTP请求,生成相应的HTTP响应结果。当获取客户端发出的请求后,Servlet容器负责创建一个HttpServletRequest对象,并把HTTP请求信息封装到这个对象中。Servlet容器还向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通
20、过它来生成HTTP响应的内容。,HTTP与HttpServlet,HttpServletRequest的常用方法,HTTP与HttpServlet,HttpServletReponse的常用方法,HTTP与HttpServlet,HttpServlet的实现,扩展HttpServlet抽象类。覆盖HttpServlet中的部分方法,如doGet()或doPost()方法。获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或者URL中的查询字符串。无论是哪一种形式,在HttpServletRequest对象中都是以参数名/参数值的形式存放的。,H
21、TTP与HttpServlet,生成HTTP响应结果。通过HttpServletResponse对象可以生成响应结果。HttpServletResponse对象有一个getWriter()方法,该方法返回一个PrintWriter对象,使用这个对象的print()或者println()方法可以向客户端发送字符串数据。,HTTP与HttpServlet,【例2.2】编写一个带表单的HTML页面,表单中提供了一个文本域,让用户输入姓名后提交给Servlet进行处理。在Servlet中,从提交的表单信息中取出用户姓名,然后加上欢迎信息输出到客户端。,访问页面,HTTP与HttpServlet,欢迎页
22、面 请输入用户名:,编写index.html文件,HTTP与HttpServlet,编写和编译源文件,import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class WelcomeServlet extends HttpServlet protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException request.setCharacte
23、rEncoding(UTF-8);String user=request.getParameter(user);response.setContentType(text/html;charset=UTF-8);PrintWriter out=response.getWriter();out.println();out.println(欢迎页面);out.println();out.println(欢迎您,+user+!);out.println();out.close();,HTTP与HttpServlet,配置Servlet,在web.xml文件中添加下面的配置信息:WelcomeServl
24、et WelcomeServlet WelcomeServlet/welcome,HTTP与HttpServlet,访问Servlet,index.html页面,WelcomeServlet的响应,HTTP与HttpServlet,中文乱码问题,在开发Java Web应用程序时,经常会出现中文乱码问题,这是由于Web容器默认的编码方式是ISO-8859-1,因此通过请求对象的getParameter()方法得到的字符串是以这种编码方式转换而来的。,HTTP与HttpServlet,为了避免容器以ISO-8859-1的编码方式返回字符串,对于以POST方法提交的表单数据,可以在获取请求参数之前调
25、用request.setCharacterEncoding(UTF-8),明确指定请求正文使用的字符编码方式是UTF-8。在向浏览器发送中文数据之前,调用response.setContentType(text/html;charset=UTF-8),指定输出内容的编码方式是UTF-8。,POST方法提交时的解决方法,HTTP与HttpServlet,当提交表单采用GET方法时,提交的数据作为查询字符串被附加到URL的末端发送到服务器,因此在服务器端调用setCharacterEncoding()方法就没有作用了,在得到请求参数的值后需要进行相应的编码转换。String name=reques
26、t.getParameter(“name”);name=new String(name.getBytes(“ISO-8859-1”),”UTF-8”);,GET方法提交时的解决方法,HTTP与HttpServlet,【补充例题】简单图形验证码的生成。,图形验证码是为了有效防止有恶意的用户使用特别的程序(如自动注册机等工具)以暴力破解的方式进行不断登录尝试而设立的。所谓验证码就是将一串随机产生的数字或符号生成一张图片,图片里加上一些干扰像素(用于防止OCR,Optical Character Recognition,光学字符识别),由用户肉眼识别其中的验证码信息,输入表单提交网站验证。,HTTP
27、与HttpServlet,ImageServlet.java的实现,public class ImageServlet extends HttpServlet protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException/设置Content-Type响应头response.setContentType(image/png);/设置页面不缓存response.setHeader(Pragma,no-cache);response.se
28、tHeader(Cache-Control,no-cache);response.setDateHeader(Expires,0);OutputStream outputStream=response.getOutputStream();/创建验证码图片BufferedImage img=new BufferedImage(80,40,BufferedImage.TYPE_INT_RGB);Graphics g=img.getGraphics();,HTTP与HttpServlet,/使用蓝色填充背景g.setColor(Color.BLUE);g.fillRect(0,0,200,100);
29、/设置验证码的颜色和字体g.setColor(Color.WHITE);g.setFont(new Font(Times Newman,Font.BOLD,18);/生成验证码(这里为5位数字)Random rnd=new Random();String s=;for(int i=0;i 5;i+)s+=rnd.nextInt(10);g.drawString(s,20,20);g.dispose();ImageIO.write(img,PNG,outputStream);,HTTP与HttpServlet,配置Servlet,在web.xml文件中添加下面的配置信息:ImageServlet
30、 cn.sdcet.servlet.ImageServlet ImageServlet/image,HTTP与HttpServlet,使用验证码图片,Insert title here 验证码图片:,Servlet的配置,Servlet的配置包括Servlet的名字、Servlet类、初始化参数、启动装入的优先级和Servlet映射等内容,这些信息是在web.xml文件的和元素中进行配置的。,Servlet的配置,Servlet的名字和类,This is a HelloWorld Servlet My HelloWorldServlet HelloWorldServlet cn.sdcet.H
31、elloWorldServlet,描述信息,显示名称,Servlet名称,Servlet类,Servlet的配置,初始化参数,配置Servlet时,还可以为它增加一些初始化参数。这些参数可以更好地解耦,避免将这些信息以硬编码的方式写在程序中。,参数名 参数值,Servlet的配置,【例2.3】编写一个Servlet,读取并显示它的初始化参数。package cn.sdcet;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class InitParamServlet extends HttpS
32、ervlet protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException doPost(request,response);,Servlet的配置,protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException response.setContentType(text/
33、html;charset=UTF-8);PrintWriter out=response.getWriter();out.println();out.println(初始化参数);out.println();/读取并显示初始化参数ServletConfig sc=getServletConfig();String username=sc.getInitParameter(username);String password=sc.getInitParameter(password);out.println(用户名:+username+);out.println(密 码:+password+);o
34、ut.println();out.close();,Servlet的配置,下面是该Servlet的配置信息:InitParamServlet cn.sdcet.InitParamServlet username javaweb password 123456 InitParamServlet/param,Servlet的配置,启动装入优先级,Servlet的创建和销毁是由Web容器控制的,默认情况下Web容器会在客户端请求Servlet时才创建它的实例。如果需要Web应用程序启动时就加载Servlet,可以使用load-on-starup元素。,Servlet的配置,load-on-staru
35、p元素的内容必须是一个整形值:如果这个元素的值是一个负数,或者没有设置这个元素,Servlet容器就在客户端首次请求这个Servlet时加载它;如果这个值是正数或0,容器将在Web应用程序启动时加载和初始化Servlet。这个整数值越小,Servlet就越先初始化。,Servlet的配置,例如:InitParamServlet cn.sdcet.InitParamServlet 10,Servlet的配置,Servlet映射,为了能让Servlet响应用户的请求,必须在web.xml文件中通过元素进行配置,它包含了两个子元素和。其中,前者是已经声明过的Servlet的名字,后者是对应于该Ser
36、vlet的URL路径。,Servlet的配置,例如:InitParamServlet/param,Servlet的配置,在配置了Servlet映射后,当Web容器接收到一个请求,它首先确定该请求应该由哪一个Web应用程序来响应(通过比较请求URI的开始部分与Web应用的上下文路径),然后根据剩余的路径去寻找匹配的Web资源。,Servlet的配置,在web.xml文件中,可以为一个Servlet配置多个映射,因此可以通过不同的方法访问一个Servlet。例如,InitParamServlet/param/*,Servlet上下文,Servlet容器在启动时会加载Web应用,并为每个Web应用创
37、建唯一的ServletContext对象。在ServletContext接口中定义了一组方法,Servlet可以使用这些方法与Servlet容器进行通信,如存放共享数据、得到文件的MIME类型、转发请求、向日志文件中写入消息等。,ServletContext简介,Servlet上下文,ServletContext接口,一个ServletContext对象代表一个Web应用程序的上下文,获得ServletContext对象的方法有:Servlet容器在Servlet初始化期间向其传递一个ServletConfig对象,通过这个对象的getServletContext()方法来得到ServletC
38、ontext对象。通过GenericServlet类的getServletContext()方法得到。,Servlet上下文,Servlet上下文,【例2.4】编写一个Servlet,实现页面访问次数的统计。要完成上述功能,可以利用ServletContext来保存访问的次数。新增一次访问时,取出ServletContext保存的值加1,然后再保存会ServletContext中。,import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class CounterServlet extends Htt
39、pServlet protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException doPost(request,response);,Servlet上下文,protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException ServletContext context=getS
40、ervletContext();Integer count=(Integer)context.getAttribute(counter);if(count=null)count=new Integer(1);else count=new Integer(count.intValue()+1);context.setAttribute(counter,count);response.setContentType(text/html;charset=UTF-8);PrintWriter out=response.getWriter();out.println();out.println(页面访问统
41、计);out.println();out.println(该页面已经被访问了+count.intValue()+次!);out.println();out.close();,请求转发与重定向,使用动机,在Web应用中,MVC(模型-视图-控制器)模式得到了广泛的应用。在MVC模式中,控制器的角色通常由Servlet来充当,它可以将请求转发给另一个Servlet或者JSP页面,甚至是静态的HTML页面,然后由它们进行处理并产生对请求的响应。要完成请求转发,就要用到javax.servlet.RequestDispatcher接口。,请求转发与重定向,RequestDispatcher接口,Req
42、uestDispatcher对象由Servlet容器创建,用于封装一个由路径所标识的服务器资源。利用RequestDispatcher对象,可以把请求转发给其它的Servlet或JSP页面,这个接口中定义了两个方法:,forward(ServletRequest request,ServletResponse response)include(ServletRequest request,ServletResponse response),请求转发与重定向,forward()方法,该方法用于将请求从一个Servlet传递给服务器上的其它Servlet、JSP或者是HTML页面。在Servlet
43、中,可以对请求进行初步处理,然后调用这个方法,由其它的资源来生成响应。需要注意的是,这个方法必须在响应被提交给客户端之前调用,否则它将抛出IllegalStateException异常。在forward()方法调用后,原先在响应缓存中的没有提交的内容将被自动清除。,请求转发与重定向,include()方法,该方法用于在响应中包含其它资源的内容。与forward()不同的是,利用include()方法转发的资源将产生的响应并入到原来的响应对象中,原先的Servlet还可以继续输出响应信息。,请求转发与重定向,获取RequestDispatcher对象,获取RequestDispatcher对象的
44、三种方法:利用ServletRequest接口中的getRequestDispatcher()方法。利用ServletContext接口中的getNamedDispatcher()方法。利用ServletContext接口中的getRequestDispatcher()方法。,请求转发与重定向,【例2.5】编写一个Servlet,首先判断用户是否已经登录。如果没有登录,调用RequestDispatcher接口的include()方法,将请求转发给LoginServlet,LoginServlet在响应中发送登录表单;如果已经登录,则调用RequestDispatcher接口的forward(
45、)方法,将请求转发给WelcomeServlet,向用户显示欢迎信息。,客户端,MainServlet,LoginServlet,WelcomeServlet,发送请求,未登录include(),响应信息,返回响应,已登录forward(),返回响应,请求转发与重定向,MainServlet的实现,请求转发与重定向,String user=request.getParameter(user);String password=request.getParameter(password);if(user!=null,请求转发与重定向,LoginServlet的实现,请求转发与重定向,第一次访问,第
46、二次访问,请求转发与重定向,请求重定向,HttpServletResponse接口的sendRedirect()方法和RequestDispatcher接口的forward()方法都可以利用其它的资源(Servlet、JSP或HTML文件)来为客户端服务,但这两种方法有着本质的区别。,请求转发与重定向,请求转发,请求转发允许把请求转发给同一应用的其它Web组件,它检查HTTP请求数据,并将请求数据转发到合适的目标组件,由目标组件执行具体的请求处理操作并生成响应结果。需要注意的是,只能把请求转发给同一Web应用中的组件,而不能转发给其它Web应用的组件。,请求转发与重定向,请求转发工作原理,请求转发与重定向,请求重定向,与请求转发不同的是,Web组件可以将请求重定向到任一URL,而不仅仅是同一应用的URL。重定向的源组件和目标组件之间不共用同一个HttpServletRequest对象,因此不能共享request范围内的共享数据。,请求转发与重定向,请求重定向工作原理,结束,