前言:通过编写一个servlet类,向浏览器发送hello world来阐述servlet。
一:创建动态web项目
1. 首先切换到javaEE视图。
在ecplise左边即项目管理器哪里右键点击新建一个 Dynaimc Web Project,输入项目名(eg:StudyServlet),Dynaimc web module version 选择
2.5版本【2.5使用xml文件配置servlet】,点击完成。
在src下新建一个servlet,类名HelloWorld。
2.打开servers(Window --> Show View --> Servers),右键单击tomcat服务器,选择 Add and Remove,把新建的web项目部署到
服务器上。运行服务器。运行完成后打开浏览器。
显示Hello world!代表一个简单的servlet编写成功。
二:servlet
1.什么是servlet
servlet本身就是一种Java类,这种Java类提供了web形式的方法(JavaEE规范中),只要实现了servlet接口的类,都是一种servlet资源。
2.如何创建servlet
servlet有三种创建方法:
实现servlet接口
继承GenericServlet
继承HttpServlet
HttpServlet-继承-->GnericServlet-实现-->Servlet
第一种方式:实现servlet接口
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; /*主要实现该方法,当浏览器访问一个servlet 时,该方法被tomcat服务器调用*/
第二种方式:继承GenericServlet
service方法:
我们可看出来,service还是抽象方法,并没有被重写,如果以这种方式创建servlet我们需要自己写service方法。
init方法:
有个带参数的init方法,该方法在启动tomcat服务器时会被调用【执行一些初始化工作】。
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
该方法就两句代码,将config成员变量初始化,然后调用init()方法。去看无参的init方法发现是空实现。
可以想想一下why?该方法会在tomcat服务器启动时执行一些初始化工作【带参数的init】,如果粗心的程序猿直接重写带参的init方法却忘记了
将config成员变量初始化,而使用了声明却未定义的变量可能会造成意料不到的结果。所以,如果你要执行一些初始化工作,实现无参的init方法。
第三种方式:继承HTTPServlet抽象类
这种方法使我们最常用的也是最好用的。
仔细看可以发现HTTPServlet并没有抽象方法,却是抽象类,why?
回想一下抽象类和接口。当写了一个类,方法也全部实现,但是却不想别人直接使用它,可以把它声明为抽象类,让想使用
他的人通过继承来使用。
service源码:
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException { HttpServletRequest request;
HttpServletResponse response; try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
声明了两个HTTPServletRequest和response变量,将servletRequest和response对象强转。然后调用另一个service方法
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
} } else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp); } else if (method.equals(METHOD_POST)) {
doPost(req, resp); } else if (method.equals(METHOD_PUT)) {
doPut(req, resp); } else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp); } else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
// String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
该方法就判断了浏览器的提交方式然后调用相应方法。一般我们使用doGet和doPost方法【实际上我们只重写了doGet方法】。
三:servlet配置
当我们写了一个servlet,如何让他与一般的java类不同,tomcat服务器如何识别他?这就需要配置文件【配置文件会在tomcat服务器启动时被解析,只要按它的约束,就能正常解析】。
当然,直接创建servlet,ecplise会帮我们配置好。
<servlet>
<description></description>
<display-name>HelloWorld</display-name>
<!-- servlet的名字 -->
<servlet-name>HelloWorld</servlet-name>
<!-- servlet的限定名,包名+类名 -->
<servlet-class>com.briup.servlet.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet的名字,和上同 -->
<servlet-name>HelloWorld</servlet-name>
<!-- url匹配 http://IP:Port/项目名 /HelloWorld 就可以访问该servlet -->
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
四:servlet的生命周期
servlet默认是单例,在web运行期间一个servlet类只会创建一个对象。
servlet的生命周期可以用3个方法体现init、service、destory
init(ServletConfig config)
servlet初始化。调用时间取决于<load-on-startup>标签。
<load-on-startup>标签表示当前这个servlet需要在启动tomcat服务器期间就被创建出来
<load-on-startup>标签里面需要放一个正整数,数值的大小可以决定servlet对象被创建的先后顺序,【数值越小就越先被创建】。
(如果有多个servlet对象需要在tomcat启动期间被创建的话)
注意:如果值一样,也是可以创建成功的,有内部顺序,并非依次创建。
service(ServletRequest req,ServletResponse res)
tomcat服务器会执行该方法处理浏览器的请求。
destory()
当servlet需要销毁时调用servlet中的该方法。
销毁时间:
1.tomcat服务器【正常】关闭
2.tomcat重新加载项目的时候
总结:
通过创建一个动态的web程序向浏览器发送Hello World阐述了servlet,如何创建,如何配置,生命周期,简要的介绍了一下servlet接口,GenericSerlvet、HTTPServlet类。
接下来就要详细介绍一些方法,以及如何使用servlet做一些东西。