




已阅读5页,还剩90页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1部分 Servlet技术基础,主讲人:柴大鹏 Email:,主要内容,Servlet简介,1,HTTP与HttpServlet,2,Servlet的配置,3,4,请求转发与重定向,5,Servlet上下文,Servlet简介,历史背景,当网络开始被用于提供服务时,服务供应商逐渐意识到需要提供动态的内容。 Applet作为最早尝试实现这一目标的技术,侧重于使用客户端平台提供动态的用户体验。与此同时,开发商还对将服务器平台用于这一目的进行了调查。,Servlet简介,最初,CGI (Common Gateway Interface)脚本是用于生成动态内容的主要技术。尽管被广泛使用,但是CGI脚本技术存在着一些缺点,包括平台依赖性和缺乏可扩展性。 为了解决这些问题,Java Servlet技术提供了一种便捷的方式用来生成动态的、面向用户的内容。,Servlet简介,什么是Servlet?,Java Servlet是与平台无关的服务器端组件,它可以运行在Servlet容器中,由Servlet容器负责与客户端的通信(采用“请求/响应”模式)以及调用Servlet的方法。,Servlet简介,Servlet的功能,创建并返回基于客户请求的动态HTML页面。 创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。 与其他服务器资源(如数据库或基于Java的应用程序)进行通信。,Servlet简介,接收多个客户端的输入,并将结果广播到多个客户端上。例如,Servlet可以实现支持多个参与者的游戏服务器。 根据客户请求采用特定的MIME(Multipurpose Internet Mail Extensions)类型对数据过滤,例如进行图像格式转换。,Servlet简介,Servlet的缺点,尽管Servlet功能非常强大,但并没有被大规模地使用,主要原因在于Servlet的编写很繁琐,它将网页的显示部分和业务逻辑功能混合在一起,不易于维护和分工。,Servlet简介,【例2.1】编写一个Servlet,向客户端输出一个字符串“Hello,world”。,简单的Servlet实例,Servlet简介,编写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=response.getWriter(); out.println(“Hello,world“); out.close(); ,Servlet简介,自动编译源程序,在MyEclipse集成开发环境下进行开发,IDE会自动对Servlet进行编译。在工作空间目录下的“ServletProjWebRootWEB -INFclassescnsdcetservlet”文件夹下可以看到生成的.class文件。,Servlet简介,手动编译源程序,打开命令窗口,转到HelloWorldServlet.java所在的目录,然后执行: javac HelloWorldServlet.java 注意:编译过程中常见的错误是找不到javax.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,打开浏览器,在地址栏中输入http:/localhost:8080/ch02/hello后回车。,Servlet简介,Servlet的生命周期,Servlet的生命周期由Web容器控制,当Servlet被请求时Web容器的操作: 如果Servlet实例不存在,Web容器会首先加载Servlet类,然后创建一个该Servlet的实例,接着调用它的init()方法进行初始化。 调用service()方法,并向它传递请求和响应对象。 当Web容器检测到一个Servlet实例应该被移除时,就会调用它的destroy()方法,以便让该实例可以释放它所使用的资源。,Servlet简介,Servlet生命周期,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类扩展了GenericServlet类,则必须实现service()方法。Servlet容器将客户的请求信息封装在ServletRequest对象中,然后传递给service()方法;service()方法将响应客户端的结果通过ServletResponse对象传给客户。 public abstract void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;,扩展GenericServlet类,Servlet简介,HttpServlet已经实现了service( )方法,它首先从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个方法:,init() service() destroy(),getServletConfig() getServletInfo(),Servlet简介,ServletRequest接口,ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端使用的协议、以及发出客户请求的远程主机信息等。 ServletRequest的子类可以为Servlet提供更多的与特定协议相关的方法,如HttpServletRequest提供了读取HTTP Head信息的方法。,Servlet简介,ServletRequest接口的部分方法,Servlet简介,ServletResponse接口,ServletResponse接口为Servlet提供了返回响应结果的方法,它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutputStream。 ServletResponse子类可以提供更多和特定协议相关的方法,如HttpServletResponse可以提供设定HTTP HEAD信息的方法。,Servlet简介,ServletResponse接口的部分方法,Servlet简介,ServletConfig接口,Servlet容器使用ServletConfig对象在Servlet初始化时向其传递配置信息。,HTTP与HttpServlet,HTTP概述,HTTP(HyperText Transfer Protocol,超文本传输协议),属于高层应用协议,工作在OSI七层体系中的应用层。 HTTP协议主要用在浏览器和Web服务器之间进行通信,是一种最基本的客户机/服务器的访问协议。 浏览器向服务器发送请求,而服务器回应相应的网页。,HTTP与HttpServlet,HTTP协议的主要特点,客户机/服务器模式。 简单快速。 灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。 无连接:每次连接只处理一个请求。服务器处理完客户的请求,并收到客户端的应答后,就断开连接。可以节省传输时间。,HTTP与HttpServlet,无状态: 协议对于事务处理没有记忆能力。 意味着如果后续处理需要前面的信息,它必须重新传输,这样可能导致每次连接传送的数据量增大。 另一方面,如果服务器不需要先前信息时它的应答就较快。,HTTP与HttpServlet,图:连接过程,HTTP与HttpServlet,HTTP消息格式,HTTP消息报文分为三部分: 请求行/状态行 头信息 实体,HTTP与HttpServlet,HTTP请求,GET /sample.jsp HTTP/1.1 Accept:image/gif,image/jpeg,*/* Accept-Language:zh-cn Connection:Keep-Alive Host:localhost User-Agent:Mozilla/4.0(compatible;MSIE5.01;Windows NT 5.0) Accept-Encodin:gzip,deflate username=chaidapeng&password=123456,请求行,请求头,请求正文,HTTP与HttpServlet,请求的第一行是“请求方法 URI 协议/版本”,其中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1”代表协议和协议的版本。 URI完整的指定了要访问的网络资源,通常只要给出相对于服务器根目录的相对目录即可,因此总是以“/”开头。,(1)请求行,HTTP与HttpServlet,根据HTTP标准,HTTP请求可以使用多种请求方法,其中最常用的是GET和POST。,HTTP与HttpServlet,GET请求,GET请求最为常见,它后面跟随一个网页的位置,服务器接受请求并返回其请求的页面。 在地址栏输入一个地址或在网页上点击链接时,浏览器就像服务器发送了HTTP GET请求。 除了页面位置作为参数外,请求中还可以包含其它的内容作为参数,以发送给服务器更多的信息。,HTTP与HttpServlet,POST请求,POST请求要求服务器接收大量的信息,除了POST后面跟随的参数之外,浏览器还会在后面持续发送数据,让服务器进行处理。 当填写好表单数据后提交时(method=“post“) ,发送的一般是POST请求。 通常,POST方法是和服务器应用程序分不开的,服务器应该启动一个服务器应用程序来处理POST发送来的表单数据。,HTTP与HttpServlet,请求头包含许多有关客户端环境和请求正文的有用信息,如请求头可以声明浏览器所用的语言、请求正文的长度等。,(2)请求头,(3)请求正文,请求头和请求正文之间是一个空行。这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户端提交的查询字符串信息。,HTTP与HttpServlet,HTTP响应,HTTP/1.1 200 OK Server:Apache Tomcat/6.0.20 Date:Mon,6 Oct 2003 13:13:33 GMT Context-Type:text/html Last-Modified:Mon,6 Oct 2003 13:23:42 GMT Content-Length:112 HTTP响应示例 Hello HTTP! ,状态行,响应头,响应正文,HTTP与HttpServlet,HTTP响应的第一行类似于HTTP请求的第一行,包括协议、状态代码和描述。 这里表示通信所用的协议是HTTP 1.1,服务器已经成功处理了客户端发出的请求(200表示成功)。,(1)响应行,HTTP与HttpServlet,状 态 代 码,HTTP与HttpServlet,响应头包含了许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。,(2)响应头,HTTP与HttpServlet,响应正文就是服务器返回的HTML页面,响应头和正文之间也必须用空行分隔。,(3)响应正文,HTTP与HttpServlet,HttpServlet简介,HttpServlet能够根据客户端发出的HTTP请求,生成相应的HTTP响应结果。 当获取客户端发出的请求后,Servlet容器负责创建一个HttpServletRequest对象,并把HTTP请求信息封装到这个对象中。 Servlet容器还向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通过它来生成HTTP响应的内容。,HTTP与HttpServlet,HttpServletRequest的常用方法,HTTP与HttpServlet,HttpServletReponse的常用方法,HTTP与HttpServlet,HttpServlet的实现,扩展HttpServlet抽象类。 覆盖HttpServlet中的部分方法,如doGet()或doPost()方法。 获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或者URL中的查询字符串。无论是哪一种形式,在HttpServletRequest对象中都是以参数名/参数值的形式存放的。,HTTP与HttpServlet,生成HTTP响应结果。通过HttpServletResponse对象可以生成响应结果。HttpServletResponse对象有一个getWriter()方法,该方法返回一个PrintWriter对象,使用这个对象的print()或者println()方法可以向客户端发送字符串数据。,HTTP与HttpServlet,【例2.2】编写一个带表单的HTML页面,表单中提供了一个文本域,让用户输入姓名后提交给Servlet进行处理。在Servlet中,从提交的表单信息中取出用户姓名,然后加上欢迎信息输出到客户端。,访问 页面,HTTP与HttpServlet, 欢迎页面 请输入用户名: ,编写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.setCharacterEncoding(“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文件中添加下面的配置信息: WelcomeServlet WelcomeServlet WelcomeServlet /welcome ,HTTP与HttpServlet,访问Servlet,index.html页面,WelcomeServlet的响应,HTTP与HttpServlet,中文乱码问题,在开发Java Web应用程序时,经常会出现中文乱码问题,这是由于Web容器默认的编码方式是ISO-8859-1,因此通过请求对象的getParameter()方法得到的字符串是以这种编码方式转换而来的。,HTTP与HttpServlet,为了避免容器以ISO-8859-1的编码方式返回字符串,对于以POST方法提交的表单数据,可以在获取请求参数之前调用request.setCharacterEncoding(“UTF-8“),明确指定请求正文使用的字符编码方式是UTF-8。在向浏览器发送中文数据之前,调用response.setContentType(“text/html;charset=UTF-8“),指定输出内容的编码方式是UTF-8。,POST方法提交时的解决方法,HTTP与HttpServlet,当提交表单采用GET方法时,提交的数据作为查询字符串被附加到URL的末端发送到服务器,因此在服务器端调用setCharacterEncoding()方法就没有作用了,在得到请求参数的值后需要进行相应的编码转换。 String name=request.getParameter(“name”); name=new String(name.getBytes(“ISO-8859-1”),”UTF-8”);,GET方法提交时的解决方法,HTTP与HttpServlet,【补充例题】简单图形验证码的生成。,图形验证码是为了有效防止有恶意的用户使用特别的程序(如自动注册机等工具)以暴力破解的方式进行不断登录尝试而设立的。 所谓验证码就是将一串随机产生的数字或符号生成一张图片,图片里加上一些干扰像素(用于防止OCR,Optical Character Recognition,光学字符识别),由用户肉眼识别其中的验证码信息,输入表单提交网站验证。,HTTP与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.setHeader(“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); /设置验证码的颜色和字体 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 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.HelloWorldServlet ,描述信息,显示名称,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 HttpServlet 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/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 + “); out.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-starup元素的内容必须是一个整形值: 如果这个元素的值是一个负数,或者没有设置这个元素,Servlet容器就在客户端首次请求这个Servlet时加载它; 如果这个值是正数或0,容器将在Web应用程序启动时加载和初始化Servlet。这个整数值越小,Servlet就越先初始化。,Servlet的配置,例如: InitParamServlet cn.sdcet.InitParamServlet 10 ,Servlet的配置,Servlet映射,为了能让Servlet响应用户的请求,必须在web.xml文件中通过元素进行配置,它包含了两个子元素和。其中,前者是已经声明过的Servlet的名字,后者是对应于该Servlet的URL路径。,Servlet的配置,例如: InitParamServlet /param ,Servlet的配置,在配置了Servlet映射后,当Web容器接收到一个请求,它首先确定该请求应该由哪一个Web应用程序来响应(通过比较请求URI的开始部分与Web应用的上下文路径),然后根据剩余的路径去寻找匹配的Web资源。,Servlet的配置,在web.xml文件中,可以为一个Servlet配置多个映射,因此可以通过不同的方法访问一个Servlet。例如, InitParamServlet /param/* ,Servlet上下文,Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。 在ServletContext接口中定义了一组方法,Servlet可以使用这些方法与Servlet容器进行通信,如存放共享数据、得到文件的MIME类型、转发请求、向日志文件中写入消息等。,ServletContext简介,Servlet上下文,ServletContext接口,一个ServletContext对象代表一个Web应用程序的上下文,获得ServletContext对象的方法有: Servlet容器在Servlet初始化期间向其传递一个ServletConfig对象,通过这个对象的getServletContext()方法来得到ServletContext对象。 通过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 HttpServlet 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=getServletContext(); Integer count=(Integer) context.getAttribute(“counter“); if(count=null) count=new Integer(1); else count=new Integer(Value()+1); context.setAttribute(“counter“, count); response.setContentType(“text/html;charset=UTF-8“); PrintWriter out=response.getWriter(); out.println(“); out.println(“页面访问统计“); out.println(“); out.println(“该页面已经被访问了“+Value()+“次!“); out.println(“); out.close(); ,请求转发与重定向,使用动机,在Web应用中,MVC(模型-视图-控制器)模式得到了广泛的应用。在MVC模式中,控制器的角色通常由Servlet来充当,它可以将请求转发给另一个Servlet或者JSP页面,甚至是静态的HTML页面,然后由它们进行处理并产生对请求的响应。 要完成请求转发,就要用到javax.servlet.RequestDispatcher接口。,请求转发与重定向,RequestDispatcher接口,RequestDispatcher对象由Servlet容器创建,用于封装一个由路径所标识的服务器资源。利用RequestDispatcher对象,可以把请求转发给其它的Servlet或JSP页面,这个接口中定义了两个方法:,forward(ServletRequest request, ServletResponse response) include(ServletRequest request, ServletResponse response),请求转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 森林防灭火知识培训课件
- 森林防火培训知识课件
- 病毒性肝炎试题附答案
- 2025年市场营销专业求职面试指南及模拟题解答手册
- 2025年云计算行业招聘面试常见问题集
- 2025年标准部招聘面试模拟题解析
- 2025年中级医学影像专业考试试题解析及答题技巧
- 云南省剑川县第一中学2026届化学高三上期中经典试题含解析
- 2026届山东省泰安第十九中学化学高一第一学期期中学业质量监测试题含解析
- 桥式起重机知识培训课件
- GB/T 19851.12-2025中小学体育器材和场地第12部分:学生体质健康测试器材
- 公安科技信息化课件
- 桥梁工程支架浇筑连续箱梁的施工监理实施细则
- 2025年国家药品监督管理局直属单位招聘126人笔试模拟试题及参考答案详解
- 2025年医疗器械经营企业法律法规培训考试(含答案)
- 2025年部编版新教材语文九年级上册教学计划(含进度表)
- 2025年云南省中考数学真题含答案
- 留疆战士考试题库及答案
- 中小学老师管理办法
- 绍兴市上虞区东关片区涝区治理-五甲渡闸站建设工程报告书
- 电气车间送电试车方案
评论
0/150
提交评论