开发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>