1.关于servlet
首先servlet也是java的一个类。它是运行再服务器上的一个java小程序,它在服务器端运行处理客户请求并且做出响应。这也是它的作用。
2.servlet的生命周期
1.新生 :new ,当客户端发送一个请求时,Servlet容器(Tomcat)会查找内存中是否存在Servlet实例,如果不存在,就创建一个Servlet实例。
如果存在Servlet实例,就直接从内存中取出该实例来响应请求。
2.初始化 :一次。初始化阶段,init()方法被调用,可以在init()方法中自定义初始化。
3.服务(运行)阶段: service(doGet,doPost)提供服务,可以多次对客户端请求进行处理并做出响应。体现其作用。
4.销毁 :一次。销毁由容器完成,销毁调用Servlet的destroy()方法。
5.垃圾回收
3. Servlet处理请求:
servlet处理请求主要是基于HttpServletRequest和HttpServletResponse对象的。这两个对象,前者封装了所有客户端请求,
后者封装了所有的响应。通过这两个对象对请求进行处理并做出相应。
4.HttpServletRequest对象
封装了所有客户端请求
常用方法:setCharacterEncoding():设置请求体中的字符编码;
getParameter(name);根据参数名获得参数值;
getSession(); 获取session
getParamerterValues(name):根据参数名获得多个值;
getParameterNames():获得所有的请求参数名
getParameterMap():获得(请求名-值)对的集合
getRemoteAddr():获得客户端的ip地址
getRequestURL():获得完整的请求地址(地址栏)
getRequestURI():获得uri(服务器之后的,不包含请求参数)
getContextPath():获得上下文路径(布署在tomcat中的应用名)
getServletPath():获得请求的uri-mapping(映射名,不包含应用名)
getQueryString():获得请求参数字符串(post请求,无此字符串)
getMethod():获得请求方法名;(get,post)
5.HttpServletResponset对象
封装了服务端给客户端的响应。
常用方法:getWriter():获得一个字符流;(生成网页)
getOutputStream():获得字节流(下载)
setContentType():设置内容类型;
sendRedirct():重定向一个新的页面
addHeader():向客户发送消息头
addCookie():向客户发送一个小文本;
6.Servlet的其他接口
1.ServletContext接口
ServletContext是由容器为我们创建的,只有一个,是servlet上下文接口,通过它可与容器(服务器)进行通迅;每一个工程只有一个上下文;
1.它的作用是: 1.使用它访问运行环境;例如获得web应用运行的真实路径;(/webproject)
2.使用它可存储所有servlet共享的数据;(一个环境下的所有servlet)
2.常用方法:setAttribute();
getAttribute();
getContextPath();获取工程名
getRealPath();
2.ServletConfig接口
ServletConfig是servlet的配置信息对象,在init一个servlet时,我们通过它来获得在web.xml文件配置的数据;
获得ServletConfig对象的方法;this.getServletConfig();
常用方法: getInitParameter();
getInitParameterNames();
7.Servlet的转发和重定向
转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。
1、转发:有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()方法获得,一种是通过ServletContext的getRequestDispatcher()方法获得;
转发是将request中的数据发送到jsp页面进行展示处理,总体来说是将一个web组件将未完成的处理通过容器转交给另外一个web组件继续完成,只有一次请求 例如:
request.getRequestDispatcher (“booklist.jsp"). forward(request, response);//转发到booklist.jsp
2、重定向:HttpServletResponse的sendRedirect()方法。
服务器根据此请求寻找资源并发送给客户,它可以重定向到任意URL,不能共享request的数据,因为是多次请求。例如:response.sendRedirect(“login.jsp");//重定向到login.jsp
详解:假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用sendRedirect()方法,将客户端的请求重新定向到Servlet2。接着浏览器访问servlet2,servlet2对客户端请求作出反应。浏览器URL的地址栏改变。
3、主要区别:
转发 重定向
服务器转向另一个新地址 浏览器获取响应后再发一次新的请求
一个请求对象,且共享数据 两次请求,不共享数据
地址栏不变 地址栏改变为新的地址
新地址必须是应用内部某个地址 可以是任意地址
8.Servlet实例可以有几个?
Servlet实例是可以有多个的,自己写xml就知道了。但一个实例必须对应一个url。但多例很少用,没有意义。
单例多线程就可以满足多用户请求,还节省资源。
所以实际上Servlet并不是单例,只是容器(希望)让它只实例化一次,变现出来的是单例的效果而已。只是Web容器在维护这些Servlet的时候只给创建一个实例存在JVM中,(但可以通过xml让服务器创建多个实例),用户请求服务时,服务器只调用它已经实例化好的Servlet对象来处理请求。