Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:java
void init(ServletConfig config) throws ServletExceptionweb
void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException浏览器
void destory()服务器
java.lang.String getServletInfo()cookie
ServletConfig getServletConfig()session
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据须要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。架构
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,而后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,因此它的地址栏中仍是原来的地址。app
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址,所以从浏览器的地址栏中能够看到跳转后的连接地址,很明显redirect没法访问到服务器保护起来资源,可是能够从一个网站redirect到其余网站。jsp
forward更加高效,因此在知足须要时尽可能使用forward(经过调用RequestDispatcher对象的forward()方法,该对象能够经过ServletRequest对象的getRequestDispatcher()方法得到),而且这样也有助于隐藏实际的连接;在有些状况下,好比须要访问一个其它服务器上的资源,则必须使用重定向(经过HttpServletResponse对象调用其sendRedirect()方法实现)。ide
JSP有9个内置对象:
request:封装客户端的请求,其中包含来自GET或POST请求的参数;
response:封装服务器对客户端的响应;
pageContext:经过该对象能够获取其余对象;
session:封装用户会话的对象;
application:封装服务器运行环境的对象;
out:输出服务器响应的输出流对象;
config:Web应用的配置对象;
page:JSP页面自己(至关于Java程序中的this);
exception:封装页面抛出异常的对象。
ervlet是一个特殊的Java程序,它运行于服务器的JVM中,可以依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个相似于Servlet的Java程序,能够简化页面内容的生成。Servlet和JSP最主要的不一样点在于,Servlet的应用逻辑是在Java文件中,而且彻底从表示层中的HTML分离开来。而JSP的状况是Java和HTML能够组合成一个扩展名为.jsp的文件。有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,固然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。
答:JSP中的四种做用域包括page、request、session和application,具体来讲:
page表明与一个页面相关的对象和属性。
request表明与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;须要在页面显示的临时数据能够置于此做用域。
session表明与某个用户与服务器创建的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户本身的session中。
application表明与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局做用域。
因为HTTP协议自己是无状态的,服务器为了区分不一样的用户,就须要对用户会话进行跟踪,简单的说就是为用户进行登记,为用户分配惟一的ID,下一次用户在请求中包含此ID,服务器据此判断究竟是哪个用户。
1)URL 重写:在URL中添加用户会话的信息做为请求的参数,或者将惟一的会话ID添加到URL结尾以标识一个会话。
2) 设置表单隐藏域:将和会话跟踪相关的字段添加到隐式表单域中,这些信息不会在浏览器中显示可是提交表单时会提交给服务器。
这两种方式很难处理跨越多个页面的信息传递,由于若是每次都要修改URL或在页面中添加隐式表单域来存储用户会话相关信息,事情将变得很是麻烦。
3)cookie:cookie有两种,一种是基于窗口的,浏览器窗口关闭后,cookie就没有了;另外一种是将信息存储在一个临时文件中,并设置存在的时间。当用户经过浏览器和服务器创建一次会话后,会话ID就会随响应信息返回存储在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器让服务器识别用户身份。会话中能够为用户保存信息。会话对象是在服务器内存中的,而基于窗口的cookie是在客户端内存中的。若是浏览器禁用了cookie,那么就须要经过下面两种方式进行会话跟踪。固然,在使用cookie时要注意几点:首先不要在cookie中存放敏感信息;其次cookie存储的数据量有限(4k),不能将过多的内容存储cookie中;再者浏览器一般只容许一个站点最多存放20个cookie。固然,和用户会话相关的其余信息(除了会话ID)也能够存在cookie方便进行会话跟踪。
4)HttpSession:在全部会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动建立HttpSession,每一个用户能够访问他本身的HttpSession。能够经过HttpServletRequest对象的getSession方法得到HttpSession,经过HttpSession的setAttribute方法能够将一个值放在HttpSession中,经过调用HttpSession对象的getAttribute方法,同时传入属性名就能够获取保存在HttpSession中的对象。与上面三种方式不一样的是,HttpSession放在服务器的内存中,所以不要将过大的对象放在里面,即便目前的Servlet容器能够在内存将满时将HttpSession中的对象移到其余存储设备中,可是这样势必影响性能。添加到HttpSession中的值能够是任意Java对象,这个对象最好实现了Serializable接口,这样Servlet容器在必要的时候能够将其序列化到文件中,不然在序列化时就会出现异常。
Java Web开发中的过滤器(filter)是从Servlet 2.3规范开始增长的功能,并在Servlet 2.4规范中获得加强。对Web应用来讲,过滤器是一个驻留在服务器端的Web组件,它能够截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。若是有,那么容器将把请求交给过滤器进行处理。在过滤器中,你能够改变请求的内容,或者从新设置请求的报头信息,而后再将请求发送给目标资源。当目标资源对请求做出响应时候,容器一样会将响应先转发给过滤器,在过滤器中你能够对响应的内容进行转换,而后再将响应发送到客户端。
常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减小传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。
过滤器相关的接口主要有:Filter、FilterConfig和FilterChain。
Java Web开发中的监听器(listener)就是application、session、request三个对象建立、销毁或者往其中添加修改删除属性时自动执行代码的功能组件,以下所示:
ServletContextListener:对Servlet上下文的建立和销毁进行监听。
ervletContextAttributeListener:监听Servlet上下文属性的添加、删除和替换。
HttpSessionAttributeListener:对Session对象中属性的添加、删除和替换进行监听。
ServletRequestListener:对请求对象的初始化和销毁进行监听。
ServletRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。
HttpSessionListener:对Session的建立和销毁进行监听。
补充: session的销毁有两种状况:
session超时(能够在web.xml中经过<session-config>/<session-timeout>
标签配置超时时间);
经过调用session对象的invalidate()方法使session失效。