JavaWeb及其框架技术 课件 第4章 Servlet基础_第1页
JavaWeb及其框架技术 课件 第4章 Servlet基础_第2页
JavaWeb及其框架技术 课件 第4章 Servlet基础_第3页
JavaWeb及其框架技术 课件 第4章 Servlet基础_第4页
JavaWeb及其框架技术 课件 第4章 Servlet基础_第5页
已阅读5页,还剩40页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章Servlet编程基础学习目标掌握Servlet接口及其实现类理解Servlet的执行流程和生命周期掌握Servlet的使用和虚拟路径映射的配置掌握Request对象的概念与使用掌握Response对象的概念与使用掌握如何解决请求与响应过程中的中文乱码问题掌握如何实现请求转发与请求重定向能够实现用户管理系统后端增加、修改和删除的功能思考

什么是Servlet?Servlet是使用Java语言编写的运行在服务器端的程序。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。作用:Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等方法。4.1Servlet的定义及作用Servlet由Servlet容器提供,所谓的Servlet容器是指提供了Servlet功能的服务器(本书中指Tomcat),Servlet容器将Servlet动态的加载到服务器上。Servlet的请求首先会被HTTP服务器接收,HTTP服务器只负责静态HTML页面的解析。Servlet的请求转交给Servlet容器,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet。Servlet将处理的结果返回给Servlet容器,并通过HTTP服务器将响应传输给客户端。

Servlet应用程序的体系结构4.1Servlet的定义及作用性能好:因为Servlet在Web服务器的地址空间内执行,这样它就没有必要再创建一个单独的进程来处理每个客户端请求。而且它为每个请求创建一个线程,而不是进程。可移植:因为它使用java语言,独立于平台。安全:Servlet由JVM管理,所以不需要担心内存泄漏、垃圾收集等。可用:Java类库的全部功能对Servlet来说都是可用的。

Servlet的特点Servlet的特点除了上述几点外,Servlet还具有功能强大、能够在各个程序之间共享数据、安全性强等特点。4.1Servlet的定义及作用4.2.1 Servlet接口及其实现类voidinit(ServletConfigconfig)ServletConfiggetServletConfig()StringgetServletInfo()void

service(ServletRequestreq,ServletResponseres)void

destroy()4.2Servlet开发入门4.2.2 体系结构图4-2Servlet的继承结构创建Servlet文件1编译Servlet文件2查找Servlet的JAR包3引入Servlet的JAR包4重新编译Servlet5将编译后的.class文件添加到服务器6创建web.xml文件7运行服务器,查看结果8带领大家编写一个程序4.2.3Servlet继承GenericServlet类的实现HttpServlet类的常用方法protected

voiddoGet(HttpServletRequestreq,HttpServletResponseresp)protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)protectedvoiddoPut(HttpServletRequestreq,HttpServletResponseresp)4.2.4 Servlet继承HttpServlet类的实现重写的doGet()方法重写的doGet()方法配置RequestMethodServlet的映射路径重新编译Servlet将编译后的.class文件添加到服务器运行服务器,查看结果重写doPost()方法重写的doPost()方法配置RequestMethodServlet的映射路径重新编译Servlet将编译后的.class文件添加到服务器运行服务器,查看结果两种实现方法4.2.4 Servlet继承HttpServlet类的实现客户端Servlet容器Servlet1、发送请求2、解析请求3、创建Servlet实例对象4、调用init()方法5、调用service()方法6、输出响应消息7、返回响应8、调用destory()方法初始阶段运行阶段销毁阶段4.2.5Servlet的生命周期和工作流程Servlet的生命周期Servlet的工作流程容器中Servlet的工作流程如下。将请求与web.xml文件中的servlet进行映射。为请求创建请求和响应对象。调用线程上的service方法。公共service方法内部调用受保护的service方法。受保护的service方法根据请求的类型调用doXxx方法。doXxx方法生成响应,并将其传递给客户端。发送响应后,Web容器将删除请求和响应对象。4.2.5Servlet的生命周期和工作流程4.3Servlet部署4.3.1web.xml文件配置部署方式<servlet></servlet>标记示例如下。<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>info.firstapp.servlet.HelloWorldServlet</servlet-class></servlet><servlet-mapping></servlet-mapping>标记示例如下。<servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern></servlet-mapping><servlet>

<servlet-name>TestServlet01</servlet-name>

<servlet-class>info.servlet.TestServlet01</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>TestServlet01</servlet-name>

<url-pattern>/TestServlet01</url-pattern>

</servlet-mapping>例4-3Web.xml文件配置方式演示1.TestServlet01.java文件,用于测试。2.然后在项目的web.xml文件中填入配置内容,如下所示。4.3.2 Annotation配置部署方式对于同一个TestServlet01,若采用注解方式,则只需要在TestServlet01定义的语句前加一句注解即可,将例4.3中的代码修改如下。@WebServlet(name=”TestServlet01”,urlPatterns={“/TestServlet01”})

publicclassTestServlet01extendsHttpServlet{

protectedvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,IOException{

PrintWriterout=response.getWriter();

out.println("HelloServlet!");

}

protectedvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,IOException{

this.doGet(request,response);

}}name=””的作用等价于<servlet-name></servlet-name>;urlPattern={“”}的作用等价于<url-pattern></url-pattern>。所以使用注解方式同样可以完成部署。注解@WebServlet(name=”TestServlet01”,urlPatterns={“/TestServlet01”})其实可以简化,name参数用于定义Servlet的名字,方便在web.xml文件中查找对应的Servlet实现类,而在注解方式中name参数并不必需(可以省略),因为注解正位于它说明的Servlet实现类的前一行,所以可以省略,这样,注解配置就可以修改为如下形式。@WebServlet(urlPatterns={“/TestServlet01”})如果注解中仅有一个参数,那么可以省略参数名而仅保留参数值,因此注解还可以进一步简化为@WebServlet(“/TestServlet01”)4.3.2 Annotation配置部署方式多重映射Servlet的多重映射是指同一个Servlet可以被映射成多个虚拟路径,客户端可以通过多个路径实现对同一个Servlet的访问。例如,在前一个例子(例4-3)中,我们修改注解为@WebServlet(urlPatterns={"/TestServlet01","/Test01"}),那么在浏览器中输入地址“http://localhost:8080/chapter04/TestServlet01”和“http://localhost:8080/chapter04/Test01”结果相同,说明的确实现了多重映射。4.3.2 Annotation配置部署方式通配符映射开发者有时希望某个目录下的所有路径都可以访问同一个Servlet,这时就需要在Servlet映射的路径中使用通配符“*”,当客户端访问一个Servlet时,如果请求的URL地址能够匹配多个虚拟路径,那么Tomcat将采取最具体的匹配原则查找与请求最接近的虚拟路径,匹配过程涉及到两个路径,所请求的路径称为访问路径,所配置的虚拟路径称为配置路径,路径匹配也就是将访问路径映射为配置路径,其匹配原则依次如下。精确匹配配置路径:@WebServlet(urlPatterns={“/TestServlet01”})

访问路径:http://localhost:8080/chapter04/TestServlet01目录匹配在特定的目录下使用通配符,格式为“/目录名/*”,可以匹配此目录下任意文件的访问路径。扩展名匹配格式为“*.扩展名”,可以匹配任意以“扩展名”结尾的访问路径。任意匹配当我们在注解中配置“/*”时意味着对此项目虚拟路径的任意访问都匹配,4.3.2 Annotation配置部署方式缺省映射如果某个Servlet的映射路径仅仅是“/”,那么这个Servlet就是当前Web应用的缺省Servlet,Servlet服务器在接收到访问请求时,若找不到匹配的Servlet,就会将访问请求交给缺省Servlet处理,也就是说,缺省Servlet用于处理其他Servlet都不处理的访问请求,4.3.2 Annotation配置部署方式Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()之前,都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。简介HTTP请求消息HTTP请求消息创建创建读取响应数据调用Servlet从HttpServletRequest对象读取数据将响应数据写入HttpServletResponse对象浏览器访问Servlet过程4.4请求和响应请求行请求消息头请求消息体获取请求行信息的方法获取请求消息体的方法获取请求消息头的方法在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法4.4.1HttpServletRequest对象方法声明功能描述StringgetMethod()该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)StringgetRequestURI()

该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分StringgetQueryString()

该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容StringgetProtocol()

该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0或HTTP/1.1StringgetContextPath()

该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以“/”开头,表示相对于整个WEB站点的根目录,路径结尾不含“/”。如果请求URL属于WEB站点的根目录,那么返回结果为空字符串("")StringgetServletPath()

该方法用于获取Servlet的名称或Servlet所映射的路径StringgetRemoteAddr()

该方法用于获取请求客户端的IP地址,其格式类似于“”StringgetRemoteHost()

该方法用于获取请求客户端的完整主机名,其格式类似于“”。需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址方法声明功能描述intgetRemotePort()

该方法用于获取请求客户端网络连接的端口号StringgetLocalAddr()

该方法用于获取Web服务器上接收当前请求网络连接的IP地址StringgetLocalName()

该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名intgetLocalPort()

该方法用于获取Web服务器上接收当前网络连接的端口号StringgetServerName()

该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分intgetServerPort()

该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分StringgetScheme()

该方法用于获取请求的协议名,例如http、https或ftpStringBuffergetRequestURL()

该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改1.获取请求行消息的相关方法请求行包含三部分内容,分别是请求方式、请求资源路径、HTTP协议及版本,对于这三部分内容,request对象提供了对应的API方法来获取,其中比较常用的方法如下。(1) 获取请求方式,图4-26中的请求方式是GET,用下面的方法完成StringgetMethod()(2) 获取虚拟目录(项目访问路径),图4-26中的虚拟目录是/request-demo,用下面的方法完成StringgetContextPath()(3) 获取URL(统一资源定位符),图4-26中的URL是http://localhost:8080/request-demo/req1,用下面的方法完成StringBuffergetRequestURL()(4) 获取URI(统一资源标识符):图4-26中的URI是/request-demo/req1,用下面的方法完成StringgetRequestURI()(5) 获取请求参数(GET方式):图4-26中的请求参数是username=zhangsan&password=123,用下面的方法完成StringgetQueryString()1.获取请求行消息的相关方法方法声明功能描述StringgetHeader(Stringname)

该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值EnumerationgetHeaders(Stringname)

该方法返回一个Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下,一个头字段名在请求消息中只出现一次,但有时候可能会出现多次EnumerationgetHeaderNames()

该方法用于获取一个包含所有请求头字段的Enumeration对象intgetIntHeader(Stringname)

该方法用于获取指定名称的头字段,并且将其值转为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为-1;如果获取到的头字段的值不能转为int类型,将发生NumberFormatException异常longgetDateHeader(Stringname)

该方法用于获取指定头字段的值,并将其按GMT时间格式转换成一个代表日期/时间的长整数,这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值StringgetContentType()

该方法用于获取Content-Type头字段的值,结果为String类型intgetContentLength()

该方法用于获取Content-Length头字段的值,结果为int类型StringgetCharacterEncoding()

该方法用于返回请求消息的实体部分的字符集编码,通常是从Content-Type头字段中进行提取,结果为String类型2.获取请求头的相关方法3.获取请求消息体方法浏览器在发送GET请求时是没有请求体的,所以需要把请求方式变为POST,对于请求体中的数据,Request对象提供了以下两种方式来获取其中的数据。(1)获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用方法ServletInputStreamgetInputStream(),该方法也可以获取字节。(2)获取字符输入流,如果前端发送的是纯文本数据,则使用方法BufferedReadergetReader()。响应状态码响应消息头响应消息体获取响应状态码的方法获取响应消息体的方法获取响应消息头的方法在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。4.4.2HttpServletResponse对象该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(intstatus)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。setState(intstatus)方法该方法用于发送表示错误信息的状态码,例如,404状态码表示找不到客户端请求的资源。在response对象中,提供了两个重载的sendError(intsc)方法,具体如下:setError(intsc)方法publicvoidsendError(intcode)throwsjava.io.IOExceptionpublicvoidsendError(intcode,Stringmessage)throwsjava.io.IOException1.发送状态码相关的方法设置响应消息头字段的方法方法声明功能描述voidaddHeader(String

name,String

value)

这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段voidsetHeader(String

name,String

value)voidaddIntHeader(Stringname,intvalue)这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()与setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦voidsetIntHeader(String

name,int

value)voidsetContentLength(intlen)

该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值用于设置各种头字段方法声明功能描述voidsetContentType(Stringtype)

该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8voidsetLocale(Localeloc)

该方法用于设置响应消息的本地化信息。对HTTP来说,就是设置Content-Language响应头字段和Content-Type头字段中的字符集编码部分。需要注意的是,如果HTTP消息没有设置Content-Type头字段,setLocale()方法设置的字符集编码不会出现在HTTP消息的响应头中,如果调用setCharacterEncoding()或setContentType()方法指定了响应内容的字符集编码,setLocale()方法将不再具有指定字符集编码的功能voidsetCharacterEncoding(Stringcharset)

该方法用于设置输出内容使用的字符编码,对HTTP协议来说,就是设置Content-Type头字段中的字符集编码部分。如果没有设置Content-Type头字段,setCharacterEncoding方法设置的字符集编码不会出现在HTTP消息的响应头中。setCharacterEncoding()方法比setContentType()和setLocale()方法的优先权高,它的设置结果将覆盖setContentType()和setLocale()方法所设置的字符码表可以有效解决乱码问题2.发送响应消息头相关的方法该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。getOutputStream()方法该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。getWriter()方法3.发送响应消息体相关的方法4.5获取请求参数的通用方式4.5.1请求参数什么是请求参数?为了能更好地回答上述两个问题,我们以用户登录为例,用户想要登录网址,需要进入登录页面,在登录页面输入用户名和密码,并将其提交到后台,后台会校验用户名和密码是否正确,若正确,则正常登录,若不正确,则提示用户名或密码错误,在此例中,用户名和密码其实就是我们所说的请求参数。什么是请求数据?请求数据是包含请求行、请求头和请求体的所有数据。请求参数和请求数据的关系是什么?请求参数是请求数据中的部分内容,若是GET请求,则请求参数在请求行中;若是POST请求,则请求参数一般在请求体中对于请求参数的获取,有以下两种常用方式。GET方式,可以使用以下方法获取请求参数:StringgetQueryString()POST方式,可以使用以下方法获取请求参数:BufferedReadergetReader();4.5.2StringgetQueryString()方法和BufferedReadergetReader()方法方法声明功能描述StringgetParameter(Stringname)该方法用于获取某个指定名称的参数值,如果请求消息中没有包含指定名称的参数,getParameter()方法返回null;如果指定名称的参数存在但没有设置值,则返回一个空串;如果请求消息中包含有多个该指定名称的参数,getParameter()方法返回第一个出现的参数值String[]getParameterValues(Stringname)HTTP请求消息中可以有多个相同名称的参数(通常由一个包含有多个同名的字段元素的FORM表单生成),如果要获得HTTP请求消息中的同一个参数名所对应的所有参数值,那么就应该使用getParameterValues()方法,该方法用于返回一个String类型的数组EnumerationgetParameterNames()getParameterNames()方法用于返回一个包含请求消息中所有参数名的Enumeration对象,在此基础上,可以对请求消息中的所有参数进行遍历处理MapgetParameterMap()getParameterMap()方法用于将请求消息中的所有参数名和值装入进一个Map对象中返回获取请求参数的方法4.5.3通用请求参数获取方法4.5.4通过Request对象传递数据setAttribute()方法该方法用于将一个对象与一个名称关联后存储到ServletRequst对象中,语法格式如下。publicvoidsetAttribute(java.lang.Stringname,java.lang.Objecto);这里name为属性的名称,o为属性的值对象,若ServletRequst对象中已经存在指定名称的属性,则方法会先删除原来的属性,再添加新的属性。若传递给setAttribute()方法的属性值对象为null,则删除指定名称的属性,此时等效于removeAttribute()方法getAttribute()方法该方法用于从ServletRequst对象中返回指定名称的属性值对象,语法格式如下。publicjava.lang.StringgetAttribute(java.lang.Stringname);removeAttribute()方法该方法用于从ServletRequst对象中删除指定名称的属性,语法格式如下。publicvoidremoveAttribute(java.lang.Stringname);getAttribuiteNames()方法该方法用于返回一个包含ServletRequst对象中所有属性名的Enumeration对象,通过此对象,我们可以对ServletRequst对象中的所有属性进行遍历处理。4.6响应信息中文乱码输出问题和请求信息中文请求参数乱码问题4.6.1 响应信息中文乱码输出问题(1)第1种方式。response.setCharacterEncoding("utf-8");//设置响应对象使用utf-8编码response.setHeader("Content-Type","text/html;charset=uft-8");//通知浏览器(2)第2种方式。response.setContentType("text/html;charset=utf-8");//包含第1种方式两个功能第2种方式将第1种方式的两条语句用一条语句来实现,功能相同,比较起来更为简洁,通常的情况下多采用第2种方式。4.6.2 请求信息中文请求参数乱码问题为解决请求参数里中文乱码的问题,只要使得字符串的编码和解码采用同一码表就可以达到。HTML页面中的编码默认采用UTF-8编码,兼容中文,不必修改,Tomcat服务器端默认采用ISO-8859-1解码,不兼容中文,所以只要将服务器端的解码修改为同样的UTF-8编码就可以解决问题。在HttpServletRequest接口中,正好提供了一个setCharacterEncoding()方法,可以设置request对象的解码方式,只要将request对象的解码码表设置成和编码码表一致,就可以解决问题。Web服务器接受到客户端的请求后,由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。sendRedirect()方法的工作原理4.7请求重定向和请求转发4.7.1 请求重定向当一个Web资源收到客户端的请求后,如果希望服务器通知另外一个资源去处理请求,这时,除了使用sendRedirect()方法实现请求重定向外,还可以通过RequestDispatcher接口的实例对象来实现。ServletRequest接口中获取RequestDispatcher对象的方法方法声明功能描述RequestDispatchergetRequestDispatcher(Stringpath)返回封装了某个路径所指定资源的RequestDispatcher对象。其中,参数path必须以“/”开头,用于表示当前Web应用的根目录。需要注意的是,WEB-INF目录中的内容对RequestDispatcher对象也是可见的,因此,传递给getRequestDispatcher(Stringpath)方法的资源可以是WEB-INF目录中的文件方法声明功能描述forward(ServletRequestrequest,

ServletResponseresponse)该方法用于将请求从一个Servlet传递给另外的一个Web资源。在Servlet中,可以对请求做一个初步处理,然后通过调用这个方法,将请求传递给其它资源进行响应。需要注意的是,该方法必须在响应提交给客户端之前被调用,否则将抛出IllegalStateException异常include(ServletRequestrequest,

ServletResponseresponse)该方法用于将其它的资源作为当前响应内容

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论