Java Web编程之Servlet技术详解
java web编程之servlet技术,知多少?
1、servlet基础
针对servlet技术开发,sun公司提供了一些列接口和类,其中最重要的是javax.servlet.servlet接口,两个重要的包是javax.servlet和javax.servlet.http,servlet就是一种实现了servlet接口的类,它由web容器(tomcat/jetty等)负责调用并创建,用于接收和响应用户请求。servlet接口中定义了5个抽象方法:
servlet顶层类结构如下所示:
2、第一个servlet程序
新建一个java web工程,然后新建hello类,hello.java源码如下:
package zzz; import java.io.ioexception; import java.io.printwriter; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class hello extends httpservlet { @override public void doget(httpservletrequest request, httpservletresponse response) throws ioexception { // 设置响应消息编码 response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); out.println("hello world"); } @override public void dopost(httpservletrequest request, httpservletresponse response) throws ioexception { this.doget(request, response); } }
配置文件web.xml如下:
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="webapp_id" version="3.1"> <display-name>zzz</display-name> <servlet> <!-- 注册servlet --> <servlet-name>hello</servlet-name> <!-- 指定servlet名称 --> <servlet-class>zzz.hello</servlet-class> <!-- 指定servlet完整类名 --> </servlet> <servlet-mapping> <!-- 映射servlet对外访问路径 --> <servlet-name>hello</servlet-name> <!-- 指定servlet名称 --> <url-pattern>/hello</url-pattern> <!-- 指定访问servlet的虚拟路径 --> </servlet-mapping> </web-app>
启动运行浏览器显示如下:
3、servlet生命周期
servlet生命周期大致分为3个阶段,初始化阶段、运行阶段和销毁阶段。以下是各个阶段详细说明:
初始化阶段:客户端向servlet容器发出请求访问servlet时,容器首先解析请求,查看内存中是否有该servlet对象,如果有直接使用;否则创建该servlet对象,然后调用init()方法,注意,servlet整个声明周期中,init()只会调用一次
运行阶段:这个是servlet最重要的阶段,此阶段容器会构造一个servletrequest和servletresponse对象作为参数传递到servlet的service()方法中。对于servlet的每一次访问,servlet容器都会调用一次service()方法,service()方法在servlet整个生命周期中会被调用多次
销毁阶段:当服务器关闭或者web应用被移除出容器时,会进入到此阶段,此时会调用destroy()方法,整个生命周期中destroy()方法只会被调用一次
在客户端首次访问servlet时,容器会创建该servlet对象,但是有时希望servlet对象在tomcat启动时跟随启动,这怎么处理呢?此时,只需要在web.xml中使用<load-on-startup>元素即可,示例配置如下:
<servlet> <servlet-name>hello</servlet-name> <servlet-class>zzz.hello</servlet-class> <!-- 自动加载servlet程序 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
4、servletconfig和servletcontext
servletconfig接口
servlet运行期间,如果需要一些辅助信息,例如文件编码、使用servlet的公司等,这些信息可以在web.xml中使用<init-param>元素进行配置,当tomcat初始化一个servlet时,会将该servlet配置信息封装成一个servletconfig对象通过init(servletconfig config)传递到servlet。servletconfig定义了一系列获取配置信息的方法:
接下来以getinitparameter()为例,讲解该方法使用示例:
web.xml配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="webapp_id" version="3.1"> <display-name>zzz</display-name> <servlet> <servlet-name>hello</servlet-name> <servlet-class>zzz.hello</servlet-class> <init-param> <param-name>company</param-name> <param-value>dahua</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
hello.java文件如下:
package zzz; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletconfig; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class hello extends httpservlet { @override public void doget(httpservletrequest request, httpservletresponse response) throws ioexception { // 设置响应消息编码 response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); servletconfig config = this.getservletconfig(); string param = config.getinitparameter("company"); out.println("company: " + param); } @override public void dopost(httpservletrequest request, httpservletresponse response) throws ioexception { this.doget(request, response); } }
servletcontext接口
当servlet容器启动时,会为每一个web应用创建一个唯一的servletcontext对象代表当前web应用,该对象不仅封装了该web应用的所有信息,而且实现了多个servlet对象间的数据共享。在web.xml中不仅可以配置servlet的初始化信息,还可以配置整个web应用的初始化信息,配置方式如下所示:
<context-param> <param-name>name</param-name> <param-value>luoxn28</param-value> </context-param> <context-param> <param-name>company</param-name> <param-value>dahua</param-value> </context-param>
注意:一个<context-param>元素里只能有一个<param-name>和<param-value>,上面的配置在web.xml中<web-app>下配置。hello.java文件如下:
package zzz; import java.io.ioexception; import java.io.printwriter; import java.util.enumeration; import javax.servlet.servletcontext; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class hello extends httpservlet { @override public void doget(httpservletrequest request, httpservletresponse response) throws ioexception { // 设置响应消息编码 response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); servletcontext context = this.getservletcontext(); enumeration<string> paramnames = context.getinitparameternames(); while (paramnames.hasmoreelements()) { string name = paramnames.nextelement(); string value = context.getinitparameter(name); out.println(name + ": " + value + "<br/>"); } } @override public void dopost(httpservletrequest request, httpservletresponse response) throws ioexception { this.doget(request, response); } }
由于一个web应用中所有servlet共享一个servletcontext对象,所以servletcontext对象的域属性可以被web应用中所有的servlet访问。在servletcontext接口中定义了分别增加、删除、设置servletcontext域属性的4个方法:
通过以上方法就可以实现多个servlet间共享数据,这个具体实例就不贴代码了,网上可参考的资料很多,比如可以点击:
以上就是本文的全部内容,希望对大家了解java web的servlet技术有所帮助。
参考资料
1、《java web程序开发入门》servlet技术章节