Servlet的生命周期是由Servlet的容器来控制的,它可以分为3个阶段;初始化,运行,销毁。
当客户端第一次请求Servlet时,Servlet被加载到内存中,容器会创建Servlet实例,并调用其init() 方法进行初始化工作
容器创建请求对象和响应对象,然后调用Servlet的service()方法为客户端提供服务
当Servlet不再被需要时,容器调用Servlet的destory()方法将Servlet实例销毁。
直接实现Servlet接口,需要实现5个方法
- public interface Servlet {
- public void init(ServletConfig config) throws ServletException;
- //servlet对象创建后执行初始化操作,例如通过config读取配置信息
- public ServletConfig getServletConfig();
- //获取当前Servlet对象的相关 ServletConfig对象。ServletConfig对象用于封装当前Servlet对象的配置信息
- public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
- //对外提供服务。Servlet针对多用户会采用单实例多线程的 方式对外提供服务
- public String getServletInfo();
- //获取当前Servlet的说明信息,一般供工具使用
- public void destroy();
- //在当前Servlet实例被GC回收前所运行的方法,一般用于资源回收
- }
为了简化开发,所以Sun提供了一个通用抽象父类GenericServlet。针对大部分方法提供了默认的空实现,只需要Servlet提供service方法的实现即可,一般用于非通用协议开发中。采用的是适配器模式
- public class Hello3Servlet extends GenericServlet {
- @Override
- public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
- }
- }
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String method = req.getMethod(); //获取客户端的请求方法,例如get/post之类
- if (method.equals(METHOD_GET)) { //如果是GET请求则调用doGet方法
- ...
- doGet(req, resp); //转向调用自己的doGet方法
- } else if (method.equals(METHOD_HEAD)) {
- 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 { //如果是其它请求方法则报错
- 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);
- }
- }
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String protocol = req.getProtocol(); //获取请求所使用的协议,例如http/1.1
- String msg = lStrings.getString("http.method_get_not_supported");
- if (protocol.endsWith("1.1")) {
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
- } else {
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
- }
- }
-
对应的是Servlet的配置参数信息,由服务器提供对应的具体实现。具体实现是在服务器调用init方法时传入到Servlet实例中。例如init()和init(ServletConfig config)
config对象由服务器提供实现,并在服务器调用该方法时传入Servlet实例
- public interface ServletConfig {
- public ServletContext getServletContext();
- //用于获取Servlet上下文对象
- public String getInitParameter(String name);
- //用于获取当前Servlet对象的配置 参数
- public Enumeration
getInitParameterNames(); - //用于获取当前Servlet对象 的所有配置参数的迭代器
- }
ServletResponse对象用于封装服务器的响应信息
ServletRequest对象是在servlet接口中所定义的service方法中出现
- public void service(ServletRequest req, ServletResponse res)
- throws ServletException, IOException;
·用于封装客户端的请求信息·是由服务器提供对应的实现类
文件上传下载组件,是由jspsmart.com开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的 JSP 文件中
1、使用简单。在 JSP 文件中仅仅书写三五行 JAVA 代码就可以搞定文件的上传或下载,方便
2、能全程控制上传。利用 jspSmartUpload 组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。
3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件
4、下载灵活。仅写两行代码,就能把 Web 服务器变成文件服务器。不管文件在 Web 服务器的目录下或在其它任何目录下,都可以利用 jspSmartUpload 进行下载