servlet学习
来源:互联网 发布:uefi ubuntu 双系统 编辑:程序博客网 时间:2024/06/05 03:42
一、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 = //时间戳,单位毫秒
- servlet学习
- Servlet学习
- Servlet学习
- Servlet学习
- Servlet学习
- servlet学习
- Servlet学习
- servlet 学习
- servlet学习
- Servlet学习
- 学习servlet
- Servlet学习
- servlet学习
- Servlet学习
- Servlet学习
- Servlet学习
- Servlet学习
- Servlet学习
- MYSQL 与 Oracle 之间的数据类型转换
- FAFU OJ 博弈(10)乘法游戏
- 闰年的判断
- FPGA+DSP SRIO通信(一)——DSP端参数设置(通道)
- velocit--静态页面模板
- servlet学习
- Kotlin&Java对照学习笔记
- Table Layout
- React项目打包后,404的解决方案
- Nginx基础与主机服务部署
- 阻止表单多次被点击
- MySQL优化系列(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)
- Nginx 核心模块、HTTP模块、邮件模块解析
- Jmeter 接口测试工具性能测试需求分析