Web服务器是通过HTTP协议处理请求的计算机系统,擅长提供静态的Web页面,而不做动态内容和不在服务器上保持数据,因此如果我们需要一个动态页面就需要一些辅助程序来完成。
动态计数:CGI((Common Gateway Interface),PHP((HyperText Preprocessor),ASP((Active Server Page) ),JSP((Java Server Pages)。
Servlet是Java Servlet的简称,称为服务连接器,用Java编写的服务器端程序。
Servlet与CGI对比:
Java Servlet有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省资源。
传统的CGI,每个请求都要求启动一个新的进程,开销大,效率低,性能损耗比较大。
如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;
而对 于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的 选择。
Servlet的任务:
读取浏览器发送的显示数据。
读取浏览器发送的隐式的HTTP请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式 等等。
处理数据并产生结果,这个过程可能需要访问数据库;执行业务层逻辑;调用 Web 服务,或者直接计算得出 对应的响应。
发送显示数据到客户端
发送隐式的HTTP响应到客户端。。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
servlet是没有main()方法的,它受控于另外一个Java应用,这个Java应用成为容器。
利用容器提供的方法,能够轻松让Servlet与Web服务器对话,无需自己建立ServerSocket,监听端口,创建流等操作。容器知道自己与Web服务器之间的协议,所以Servlet不必担心Web服务器以自己之间的API
容器控制着Servlet的生与死。
容器会自动地为它接受的每个Servlet请求创建一个新的线程。针对客户端请求,如果Servlet已经运行完相应的HTTP服务方法,该线程就会结束。
容器可以将JSP代码翻译成Java代码。
servlet程序的结构
servlet的依赖
创建Servlet三种方式:
1.实现Servlet接口;
2.继承GenericServlet类
3.继承HttpServlet方法。
Servlet生命周期可被定义为从创建直到毁灭的整个过程。
init():它在第一次创建Servlet时被调用,在后续每次用户请求时不在调用。
service():只要执行实际任务的主要方法。容器调用该方法来处理浏览器的请求,并把格式化的响应写给客户端。每次服务器收到一个Servlet请求时,服务器会产生一个新线程并调用服务。
destroy():可以让servlet关闭数据库连接、停止后台线程、把cookie列表写入到磁盘,并执行其它类似的清理活动。
注意:在web.xml中metadata-complete=“true”的时候表示忽略所有的注解标识。如果想用注解配置servlet的时候,就需要将其变成true.
一个Web应用程序总是包含一个或多个表单,供用户输入值。
当用户提交表单时,在表单中输入的值就会被当作请求参数发送到服务器。
从req中获取URL中的参数,在通过Post方法进行展示。
还有一个读取所有表单参数的方法getParameterNames(),返回枚举,包含未指定顺序的参数名。
得到枚举之后,可使用hasMoreElements()方法来确定循环的终止,用nextElement()方法来获取每个参数的名称。
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。
web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。若要反转过滤器的顺序,您只需要在 web.xml 文件中反转 filter-mapping 元素即可。
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
向servlet中添加cookie
读取Cookie,需要通过调用HttpServletRequest的getCookies()方法创建一个Cookie对象的数组。然后循环遍历数组,并用getName()和getValue()方法来访问cookie和关联的值。
删除Cookie只需要将setMaxAge()中的参数设置为0就可以了。
HTTP是一种无状态协议,默认情况一下,一个 WEB服务器是无法区分一个HTTP请求是否为第一次访问。
因此出现了会话跟踪技术:
1.URL重写:可以在URL末尾追加一些额外数据来标识session会话,服务器会把该session会话标识符与已存储的有关session会话数据相关联。但是URL有长度限制,它还会动态生成每个URL为页面分配一个session。
2.隐藏的表单字段:一个Web服务器可以发送一个隐藏的HTML表单字段。将标识为一个session放入隐藏域来进行追踪。但是隐藏域技术仅当网页有表单时有效。
3.Cookie:一个Web服务器可以分配一个唯一的session会话ID作为每个Web客户端的cookie,对于客户端的后续请求可以使用接收到的cookie来识别。但是,cookie有很多浏览器不支持。
4.HttpSession:HttpSession对象是在用户第一次访问网站的时候自动创建的。不同于URL重新、 隐藏域或cookie, 放入到HttpSession 的值, 是存储在内存中的, 因此,不要 往 HttpSession放入太多对象或大对象。 尽管现代的 Servlet容器在内存不够用的时候会将保存在 HttpSessions 的对象转储到二级存储上, 但这样有性能问题, 因此小心存储。 放到HttpSession的值不限于String类型。所有保存在HttpSession的数据不会被发送到客户端,不同于其它会话管理技术, Servlet容器为每个 HttpSession 生成唯一的标识, 并将该标识发送给浏览器, 或创建一个名为JSESSIONID的cookie, 或者在 URL后附加一个名 为jsessionid 的参数。 在后续的请求中,浏览器会将标识提交给服务端,这样服务器就可以识别该请求是由哪个用 户发起的。 Servlet容器会自动选择一种方式传递会话标识,无须开发人员介入 。
监听器Listeners:
ServletContextListener能对ServletContext的创建和销毁做出响应。
ServletContextAttributeListener能对ServletContext范围的属性被添加,删除,替换做出响应。
HttpSessionListener:主要监听HttpSession的创建和销毁.
HttpSessionAttributeListener:它会响应HttpSession范围的属性的添加,删除,替换。
ServletRequestListener:会对ServletRequest的创建和销毁时间进行响应。
当一个ServletRequest范围的属性被添加,删除,或者替换时,ServletRequestAttributeListener接口会被调用。