请求行,请求类型 资源 HTTP版本
GET /WxHhdys/assets/js/jquery-1.8.1.min.js HTTP/1.1
请求服务器地址
Host:dj2.baidu.com
显示此HTTP连接的Keep-Alive时间。使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。以前HTTP请求是一站式连接,从HTTP/1.1协议之后,就有了长连接,即在规定的Keep-Alive时间内,连接是不会断开的。
Connection: keep-alive
HTTP客户端运行的浏览器类型、操作系统
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
指定客户端能够接收的内容类型
Accept:image/webp,*/*;q=0.8
Accept-Encoding 指定HTTP客户端浏览器用来展示返回信息所优先选择的语言
Accept-Language 指定客户端浏览器可以支持的web服务器返回内容压缩编码类型
Accept-Encoding: gzip,deflate,sdch Accept-Language: zh-CN,zh;q=0.8
HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器
Cookie: JSESSIONID=6B7D58EB652366C12B421E94420808D2; username=1; pw=MTIzNDU2JiYxNDA3MjkwMzY0OTY3JiYx; JSESSIONID=0148BE5066F89BBC5F384234CCE4CDDA
包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
Referer:http://www.baidu.com/
HTTP/1.1 200 OK[CRLF] //状态行,状态行之后是首部行 connection:close Date: Server: Last-modified: Content-length: Content-Type: text/html[CRLF] Content-Encoding: x-gzip[CRLF][CRLF] <body>
状态码
Code Meaning
200 OK
201 Created
202 Accepted
204 No Content
301 Moved Permantly
302 Moved Temporarily
304 Not Modified
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
Java Servlets是基于Java技术的Web组件,用来扩展以请求/响应为模型的服务器的能力,提供动态内容.
Servlet 由容器或引擎来管理,通过请求/响应模型与Web客户进行交互。
servlet容器是web服务器或应用服务器的一部分,管理和维护servlet的整个生命周期,支持http协议。负责处理客户请求、把请求传送给适当的servlet并把结果返回给客户。
http://www.ibm.com/developerworks/cn/java/j-lo-servlet/
Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。
从上图可以看出 Tomcat 的容器分为四个等级,真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程
添加一个 Web 应用时将会创建一个 StandardContext 容器,并且给这个 Context 容器设置必要的参数,url 和 path 分别代表这个应用在 Tomcat 中的访问路径和这个应用实际的物理路径. 容器将将 Servlet 包装成 Context 容器中的 StandardWrapper。其它的所有 web.xml 属性都被解析到 Context 中,所以说 Context 容器才是真正运行 Servlet 的 Servlet 容器。一个 Web 应用对应一个 Context 容器,容器的配置属性由应用的 web.xml 指定。
web中要直接或间接的实现这个接口。一般趋向于间接实现(继承):javax.servlet.GenericServlet javax.servlet.http.HttpServlet
npublic void init(ServletConfig config) throws ServletException
一旦对servlet实例化后,容器就调用此方法,从ServletConfig对象中读取与容器相关的配置数据,并保存起来供以后使用。 接口规定对任何servlet实例,此方法只能被调用一次,在任何请求传递给servlet之前,此方法可以在不抛出异常的情况下运行完毕
public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException
只有成功初始化后此方法才能被调用处理用户请求。
前一个参数提供访问初始请求数据的方法和字段,后一个提供servlet构造响应的方法。
public void destroy()
容器可以在任何时候终止servlet服务。容器调用此方法前必须给service()线程足够时间来结束执行,因此接口规定当service()正在执行时destroy()不被执行。
public ServletConfig getServletConfig()
在servlet初始化时,容器传递进来一个ServletConfig对象并保存在servlet实例中,该对象允许访问两项内容:初始化参数和ServletContext对象,前者通常由容器在文件中指定,允许在运行时向sevrlet传递有关调度信息,后者为servlet提供有关容器的信息。
public String getServletInfo()
此方法返回一个String对象,该对象包含servlet的信息,例如开发者、创建日期、描述信息等。该方法也可用于容器。
GenericServlet类
实现Servlet、ServletConfig、Serializable, 提供了servlet接口的基本实现部分,其service()方法被申明为abstract,因此需要被派生。
HttpServlet
扩展了GenericServlet类并对servlet接口提供了与HTTP更相关的实现
protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。
在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成 后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。
加载和实例化
Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创 建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系 统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建 Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。
初始化
在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。
初始化期间,servlet实例可能通过抛出UnavailableException 或者 ServletException异常表明它不能进行有效服务。如果抛出上述异常,它将不会被置入有效服务并且应该被容器立即释放。在此情况下destroy方法不会被调用因为初始化没有成功完成。在失败的实例被释放后,容器可能在任何时候实例化一个新的实例,对这个规则的唯一例外是如果失败的servlet抛出的异常是UnavailableException并且该异常指出了最小的无效时间,那么容器就会至少等待该时间指明的时限才会重新试图创建一个新的实例。
请求处理
Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法 必须成功执行。在service()方法中,Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。
如果开发者使用synchronized关键字定义service方法(或者是doGet和doPost),容器将排队处理请求,这是由底层的java运行时系统要求的。强烈推荐不要同步service方法或者HTTP Servlet的诸如doGet和doPost这样的服务方法。
服务终止
当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源.
web-inf目录下的结构
│ web.xml 整个web应用程序的配置文档
│
├─classes 项目中用到的类文件,均由JDK编译成了.class文件
│ login.class
│
└─lib 项目中引用的jar包
javax.servlet.jsp.jstl.jar
jstl-impl.jar
1、tomcat解析URL
Tomcat启动后,监听我们的8080端口,当有Url请求发过来之后,解析出项目名称 abingtest,然后到webapps目录下搜索到该项目文件夹。
2、项目文件找到后,开始寻找类文件
Tomcat去Web.xml文件中寻找<servlet-mapping> 配置节中包含”servlet/login”(请求路径)字符串,进而找到该类文件所在的位置。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>login</servlet-name> //servlet-name元素用来定义servlet的名称,该名称在整个应用中必须是惟一的 <servlet-class>login</servlet-class> //servlet-class元素用来指定servlet的完全限定的类名称 </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/servlet/login</url-pattern> </servlet-mapping> </web-app>
3、调用class文件中的方法
FirstServlet 继承了HttpServlet ,重写了HttpServlet中的doGet() 方法,HttpServlet中还有一个doPost()方法。这两个方法都是用来处理Http请求的。Servlet会根据我们提交表单的方法 (method=post/get)调用service方法来自动选择
web容器在启动时,为每一个web应用程序创建一个对应的ServletContext对象,代表当前web应用
ServletConfig对象是web应用的配置对象(web.xml),维护了ServletContext对象的引用,可以通过ServletConfig.getServletContext()方法获取ServletContext对象
一个应用的多个servlet共享一个ServletContext,ServletContext也成为域对象,它可以获取web应用的初始化配置,实现servlet转发,读取资源文件
http://blog.csdn.net/liugenghao3048/article/details/8832066
servletcontext的获取
//得到ServletContext的方式1 ServletContext context = this.getServletConfig().getServletContext(); //得到ServletContext的方式2 context = this.getServletContext();
Servlet数据共享
servlet a 中 String data = "aaa"; this.getServletContext().setAttribute("data", data); servlet b 中 String value = (String)this.getServletContext().getAttribute("data"); System.out.println(value);
读取web配置文件
<context-param> <param-name>data1</param-name> <param-value>xxxx</param-value> </context-param> <context-param> <param-name>data2</param-name> <param-value>yyyy</param-value> </context-param> <context-param> <param-name>data3</param-name> <param-value>zzzz</param-value> </context-param>
获取参数
String value =(String)this.getServletContext().getInitParameter("data1"); response.getOutputStream().write(("<font color='red'>" + value + "</font>").getBytes()); Enumeration e = this.getServletContext().getInitParameterNames(); while(e.hasMoreElements()){ String name = (String)e.nextElement(); String value1 = (String)this.getInitParameter(name); System.out.println(name+" = "+value1); }
转发数据
转发
String data = "aaaaaaaaaa"; //把数据带给1.jsp (不能通过context域,要通过request域) this.getServletContext().setAttribute("data", data); //转发到1.jsp RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/1.jsp"); rd.forward(request, response);
获取转发数据
<font color="red"> <% //在jsp中,application就是ServletContext String data = (String)application.getAttribute("data"); out.write(data); %> </font>
读取资源文件的内容
资源文件
url=jdbc:mysql://localhost:3306/test username=root password=root
读取资源文件
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties"); String filename = path.substring(path.lastIndexOf("\\")+1); System.out.println("当前读取到的资源名称是:"+filename); FileInputStream in = new FileInputStream(path); //java专门用来读取properties文件的对象 Properties props = new Properties();//内部用map保存数据 props.load(in); System.out.println("当前读取到的资源数据是:"); String url = props.getProperty("url"); String username = props.getProperty("username"); String password = props.getProperty("password");