一、servlet原理理解
我们发送Http请求的时候,其实是一个发送一个Http报文,servlet容器会自动将这个报文封装成一个ServletRequest请求对象,而在Httpservlet中的service方法会先将ServletRequest 转换成HttpServletRequest,接着又通过另一个service来判断http的请求方式,这些都处理好了之后就会找到对应的doxxx方法来执行我们的业务逻辑了
当我们创建一个servlet的时候,一般是extends HttpServlet,而HttpServlet本身就是一个抽象类,它也是继承自抽象类GenericServlet这个抽象类,而GenericServlet已经实现了Servlet,ServlerConfig.Serializable这个几个接口。
让我们来看看HttpServlet中的几个方法
@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); }
重写的这个service方法主要是将request 和 response 转换成 HttpServletRequest 和 HttpServletResponse
接着来看看下面这个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()这两种
下面一段引用博文:http://www.cnblogs.com/langtianya/archive/2013/01/30/2883308.html
Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口 .
在Servlet接口中定义了5个方法,其中有3个方法代表了Servlet的生命周期:
init方法,负责初始化Servlet对象
service方法,负责相应客户的请求
destory方法,当Servlet对象退出声明周期时,负责释放占有的资源
当Web容器接收到某个Servlet请求时,Servlet把请求封装成一个HttpServletRequest对象,然后把对象传给Servlet的对应的服务方法.
HTTP的请求方式包括DELETE,GET,OPTIONS,POST,PUT和TRACE,在HttpServlet类中分别提供了相应的服务方法, 它们是,doDelete(),doGet(),doOptions(),doPost(), doPut()和doTrace().
HttpServlet的功能
HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对象,并把 Http请求直接封装到HttpServlet对象中,大大简化了HttpServlet解析请求数据的工作量。HttpServlet容器响应Web客户请求流程如下:
1)Web客户向Servlet容器发出Http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)Servlet容器把HttpServlet的响应结果传给Web客户。
二、创建HttpServlet的步骤——“四部曲”
1)扩展HttpServlet抽象类;
2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法;
3)获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串;
4)生成HTTP响应结果。通过HttpServletResponse对象生成响应结果,它有一个getWriter()方法,该方法返回一个PrintWriter对象。
二、servlet之cookies理解
可参考以下博客:
需要明白的是,如果在servlet中设置cookie的时候,在页面的request中是获取不到设置的cookies的,因为返回结果的cookie是添加在response中的,只有再次请求的时候,request中才会添加cookie
下面介绍几种在不同地方获取到cookie的方法
1.0 在servlet中
得到cookie:request.getCookies() 返回一个数组
设置cookie:Cookie c1 = new Cookie("name","ada"); response.addCookie(c1); 这是将cookie添加到响应头中去
设置cookie有效期:c1.setMaxAge();//最小单位是秒
2.0 在jsp中
因为jsp中9大内置对象就包括了request,response,所以用法和在servlet中一样,Java代码用<% %>括起
3.0 在js中
设置cookie:document.cookie = "name=ada";
得到cookie:
function getcookie(cookiename){ var cookiestring = document.cookie; var start = cookiestring.indexof(cookiename + '= '); if (start == -1) // 找不到 return null; start += cookiename.length + 1; var end = cookiestring.indexof( "; ", start); if (end == -1) return unescape(cookiestring.substring(start)); return unescape(cookiestring.substring(start, end)); }
设置cookie有效时间:expires = //时间戳,单位毫秒