Servlet的三生命周期
Servlet的生命周期是由Servlet的容器来控制的,它可以分为3个阶段;初始化,运行,销毁。
当客户端第一次请求Servlet时,Servlet被加载到内存中,容器会创建Servlet实例,并调用其init() 方法进行初始化工作
容器创建请求对象和响应对象,然后调用Servlet的service()方法为客户端提供服务
当Servlet不再被需要时,容器调用Servlet的destory()方法将Servlet实例销毁。
Servlet API
直接实现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);
}
}
ServletConfig对象
对应的是Servlet的配置参数信息,由服务器提供对应的具体实现。具体实现是在服务器调用init方法时传入到Servlet实例中。例如init()和init(ServletConfig config)
config对象由服务器提供实现,并在服务器调用该方法时传入Servlet实例
public interface ServletConfig {
public ServletContext getServletContext();
//用于获取Servlet上下文对象
public String getInitParameter(String name);
//用于获取当前Servlet对象的配置 参数
public Enumeration<String> getInitParameterNames();
//用于获取当前Servlet对象 的所有配置参数的迭代器
}
response响应
ServletResponse对象用于封装服务器的响应信息
request请求
ServletRequest对象是在servlet接口中所定义的service方法中出现
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
·用于封装客户端的请求信息·是由服务器提供对应的实现类
jspSmartUpload
文件上传下载组件,是由jspsmart.com开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的 JSP 文件中
1、使用简单。在 JSP 文件中仅仅书写三五行 JAVA 代码就可以搞定文件的上传或下载,方便
2、能全程控制上传。利用 jspSmartUpload 组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。
3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件
4、下载灵活。仅写两行代码,就能把 Web 服务器变成文件服务器。不管文件在 Web 服务器的目录下或在其它任何目录下,都可以利用 jspSmartUpload 进行下载