ServletJSP深入详解--Servlet技术

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

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类

step2:编译HelloWorldServlet类

step3:部署HelloWorldServlet类

从表中可以看到,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配置

<servlet>

<servlet-name>HelloWorldServlet</servlet-name>

<servlet-class>org.sunxin.ch02.servlet.HelloWorldServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>HelloWorldServlet</servlet-name>

<url-pattern>/helloworld</url-pattern>

</servlet-mapping>

猜你喜欢

转载自blog.csdn.net/little_____white/article/details/82217188