ServletJSP深入详解--Servlet技术

开发servlet接口需要用到的主要接口和类

ServletJSP深入详解--Servlet技术_第1张图片

Java Applet与Java Servlet有以下一些共同点:

·它们都不是独立的应用程序,都没有main()方法。
·它们都不是由用户或程序员直接调用,而是生存在容器中,由容器管理。Applet运行在浏览器中,Servlet运行在Servlet容器中。
·它们都有生命周期,都包含了init()和destroy()方法。

当然,Applet与Servlet也有不同点。

 

·Applet具有图形界面,运行在客户端的浏览器中。
·Servlet没有图形界面,运行在服务器端的Servlet容器中。

要编写一个Applet,需要从java.applet.Applet类派生一个子类;和Applet类似,要编写一个Servlet,需要实现javax.servlet.Servlet接口,该接口定义了如下五个方法。

init() service() destroy() getServletConfig() getServletInfo()

作用:初始化;处理客户端请求;释放资源;获取ServletConfig对象;返回一个Stirng类型的字符串。

Servlet由Servlet容器来管理,当客户请求到来时,容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象将被容器作为service()方法的参数传递给Servlet,Servlet利用ServletRequest对象获取客户端发来的请求数据,利用ServletResponse对象发送响应数据。ServletRequest和ServletResponse接口都在javax.servlet包中定义。

ServletRequest接口中的常用方法

getAttribute(java.lang.String name)返回以name为名字的属性的值。如果该属性不存在,这个方法将返回null。

getAttributeNames()返回请求中所有可用的属性的名字。如果在请求中没有属性,这个方法将返回一个空的枚举集合。

removeAttribute(java.lang.String name)移除请求中名字为name的属性。

setAttribute(java.lang.String name,java.lang.Object o)在请求中保存名字为name的属性。如果第二个参数o为null,那么相当于调用removeAttribute(name)

getCharacterEncoding()返回请求正文使用的字符编码的名字。如果请求没有指定字符编码,这个方法将返回null。

getContentLength()以字节为单位,返回请求正文的长度。如果长度不可知,这个方法将返回-1。

getContentType()返回请求正文的MIME类型。如果类型不可知,这个方法将返回null。

ServletInputStream getInputStream()返回一个输入流,使用该输入流以二进制方式读取请求正文的内容。ServletInputStream是一个抽象类,继承自java.io.InputStream。

getLocalAddr()返回接收到请求的网络接口的IP地址,这个方法是在Servlet 2.4规范中新增的方法。

getLocalName()返回接收到请求的IP接口的主机名,这个方法是在Servlet 2.4规范中新增的方法。

getLocalPort()返回接收到请求的网络接口的IP端口号,这个方法是在Servlet 2.4规范中新增的方法。

getParameter(java.lang.String name)返回请求中name参数的值。如果name参数有多个值,那么这个方法将返回值列表中的第一个值。如果在请求中没有找到这个参数,这个方法将返回null。

getParameterNames()返回请求中包含的所有的参数的名字。如果请求中没有参数,这个方法将返回一个空的枚举集合。

getParameterValues(java.lang.String name)返回请求中name参数所有的值。如果这个参数并不存在,这个方法将返回null。

getProtocol()返回请求使用的协议的名字和版本,例如:HTTP/1.1。

getReader() throws java.io.IOException返回BufferedReader对象,以字符数据方式读取请求正文。

getRemoteAddr()返回发送请求的客户端或者最后一个代理服务器的IP地址。

getRemoteHost()返回发送请求的客户端或者最后一个代理服务器的完整限定名。

getRemotePort()返回发送请求的客户端或者最后一个代理服务器的IP源端口,这个方法是在Servlet 2.4规范中新增的方法。

getRequestDispatcher(java.lang.String path)返回RequestDispatcher对象,作为path所定位的资源的封装。

getServerName()返回请求发送到的服务器的主机名。

getServerPort()返回请求发送到的服务器的端口号。

setCharacterEncoding (java.lang.String env)覆盖在请求正文中所使用的字符编码的名字。

ServletResponse接口中的常用方法

flushBuffer()强制把任何在缓存中的内容发送到客户端。

getBufferSize()返回实际用于响应的缓存的大小。如果没有使用缓存,这个方法将返回0。

getCharacterEncoding()返回在响应中发送的正文所使用的字符编码(MIME字符集)。

getContentType()返回在响应中发送的正文所使用的MIME类型。

getOutputStream() throws java.io.IOException返回ServletOutputStream对象,用于在响应中写入二进制数据。javax.servlet. ServletOutputStream是一个抽象类,继承自java.io.OutputStream。

getWriter()返回PrintWriter对象,用于发送字符文本到客户端。PrintWriter对象使用getCharacterEncoding()方法返回的字符编码。如果没有指定响应的字符编码方式,默认将使用ISO-8859-1。

isCommitted()返回一个布尔值,指示是否已经提交了响应。

reset()清除在缓存中的任何数据,包括状态代码和消息报头。如果响应已经被提交,这个方法将抛出IllegalStateException异常。

resetBuffer()清除在缓存中的响应内容,保留状态代码和消息报头。如果响应已经被提交,这个方法将抛出IllegalStateException异常。

setBufferSize(int size)设置响应正文的缓存大小。Servlet容器将使用一个缓存,其大小至少是请求的尺寸大小。这个方法必须在响应正文被写入之前调用,如果内容已经被写入或者响对象已经被提交,这个方法将抛出IllegalStateException异常。

setCharacterEncoding(java.lang.String charset)设置发送到客户端的响应的字符编码,例如,UTF-8。

setContentLength(int len)对于HTTP Servlet,在响应中,设置内容正文的长度,这个方法设置HTTP Content-Length实体报头。

setContentType(java.lang.String type)设置要发送到客户端的响应的内容类型,此时响应应该还没有提交。给出的内容类型可以包括字符编码说明,例如:text/html;charset=UTF-8。如果这个方法在getWriter()方法被调用之前调用,那么响应的字符编码将仅从给出的内容类型中设置。这个方法如果在getWriter()方法被调用之后或者在响应被提交之后调用,将不会设置响应的字符编码。在使用HTTP协议的情况中,这个方法设置Content-Type实体报头。

java.lang.IllegalStateException是java.lang.RuntimeException的子类。我们知道对于RuntimeException及其派生的异常是由Java运行系统自动抛出并自动处理,不需要我们去捕获,所以也就不需要在函数声明时声明抛出异常了。

在javax.servlet中,定义了ServletConfig接口。Servlet容器使用ServletConfig对象在Servlet初始化期间向它传递配置信息,一个Servlet只有一个ServletConfig对象。在这个接口中,定义了下面四个方法:

getInitParameter(String name)返回名字为name的初始化参数的值,初始化参数在web.xml配置文件中进行配置。

getInitParameterNames()返回Servlet所有初始化参数的名字的枚举集合。

getServletContext()返回Servlet上下文对象的引用。

getServletName()返回Servlet实例的名字。这个名字是在web应用程序的部署描述符中指定的。

实例:一个简单的servlet--向客户端输出一个字符串。

开发步骤:

step1:编写HelloWorldServlet类

ServletJSP深入详解--Servlet技术_第2张图片

step2:编译HelloWorldServlet类

step3:部署HelloWorldServlet类

ServletJSP深入详解--Servlet技术_第3张图片

ServletJSP深入详解--Servlet技术_第4张图片

从表中可以看到,WEB-INF目录下的classes和lib目录都可以存放Java的类文件,在Servlet容器运行时,Web应用程序的类加载器将首先加载classes目录下的,其次才是lib目录下的类。如果这两个目录下存在同名的类,起作用的将是classes目录下的类。
在表中,我们还可以看到一个特殊的目录WEB-INF,这个目录并不属于Web应用程序可以访问的上下文路劲的一部分。对客户端来说,这个目录是不可见的。但是对于Servlet代码是可见的。在servlet代码中可以通过调用ServletContext对象中的getResource()或者getResourceAsStream()方法来访问WEB-INF目录下的资源,也可以使用RequestDispatcher调用将WEB-INF目录下的内容呈现给客户端。

web.xml配置

HelloWorldServlet

org.sunxin.ch02.servlet.HelloWorldServlet

HelloWorldServlet

/helloworld

GenericServlet抽象类,给出了除service()方法以外其它四个方法的简单实现。实现了servlet接口和ServletConfig接口。GenericServlet定义了两个重载的init()方法,一个无参,一个带ServletConfig参数。带参的init()是servlet接口中init()方法的实现,这个方法中调用第二个不带参数的方法。通常在编写继承自GenericServlet的类时,只需要重写第二个不带参数的init()方法就可以了。在GenericServlet中还定义了下列的方法。getInitParameter(String name)返回名字为name的初始化参数的值。这个参数在xml中配置。实际上是调用servletConfig对象的getInitParameter()方法来得到初始化参数的。getInitParameterNames()返回Servlet所有初始化参数的名字的枚举集合。实际上是调用servletConfig对象的getInitParameterNames()方法来得到初始化参数的。getServletContext()返回Servlet上下文对象的引用。实际上是调用servletConfig对象的getInitParameterNames()方法来得到初始化参数的。

HttpServlet抽象类,继承自GenericServlet。提供了两个重载的service()方法,参数类型为(ServletRequest,ServletResponse)和(HttpServletRequest,HttpServletResponse)(和前者为继承关系),前者为GenericServlet重写service()方法的实现(公共的)。这个方法中将两个参数对象转化为Http的参数对象,然后调用第二个service()方法(受保护的),对客户请求进行处理。针对Http1.1中定义的7中请求方法,HttpServlet分别提供了7个处理方法。在保护的service()中首先调用HttpServletRequest的getMethod()方法,获取Http请求方法的名字,然后根据请求方法的类型,调用相应的doXXX方法。

HttpServletRequestHttpServletResponse

新增方法:

HttpServletRequest

getContextPath()返回请求URL中表示请求上下文的部分,上下文路径是请求URL的开始部分,以/开头,结束没有/。

getCookies()返回客户端在此次请求中发送的所有Cookie对象。

getHeader(String name)返回名字为name的请求报头的值。

getHeaderNames()返回此次请求中包含的所有报头名字的枚举集合。

getHeaders()返回名字为name的请求报头所有的值的枚举集合。

getMethod()返回此次请求中所使用的Http方法的名字,例如get,post或者put。

getPathInfo()返回与客户端发送的请求URL相联系的额外的路径信息。

getPathTranslated()将额外的路径信息转换为真实的路径。

getqueryString()返回请求URL中在路径后的查询字符串。

getRequestURI()返回请求URL中从主机名到查询字符串之间的部分。

getRequestURL()包括除了查询字符串之外的所有内容。

getServletPath()返回请求URI中调用Servlet的部分。

getSession()返回和此次请求相关联的Session。

getSession(boolean create)返回和此次请求相关联的Session。

HttpServletResponse

addCookie(Cookie cookie)增加一个cookie到响应中。

addHeader(String name,String value)用给出的name和value,增加一个响应报头到响应中。

containsHeader(String name)判断以name为名字的响应报头是否已经设置。

encodeRedirectURL(String url)使用sessionID对用于重定向的url进行编码。

encodeURL()使用Session ID对指定的url进行编码。

sendError(int sc)使用参数sc表示的状态码发送一个错误响应到客户端,同时清除缓存。

sendError(int sc,String msg)使用指定的状态码发送一个错误响应到客户端。

sendRedirect(String location)发送一个临时的重定向响应到客户端,让客户端访问新的URL。

setHeader(String name,String value)设置响应报头。

setStatus(int sc)为响应设置状态代码。

 

 

 

 

你可能感兴趣的:(ServletJSP深入详解--Servlet技术)