1.servlet基础1)什么是servlet?什么是servlet容器[tomcat]Sun公司制定的一种用来扩展web服务器功能的组件规范。(1)扩展web服务器功能早期的web服务器(apachehttpserver等)不能够处理动态资源的请求(需要计算生成动态页面),需要扩展。早期使用cgi程序来扩展。注:cgi(commongatewayinterface通用网关接口),可以使用perl,c等来开发符合cgi规范的程序。因为cgi开发复杂,可移值性不好,现在用得比较少了。(2)组件规范1)什么是组件?符合规范,实现部分功能,并且可以部署到相应的容器里面才能运行的软件模块。Servlet就是一个组件,需要部署到servlet容器里面才能运行。2)什么是容器?符合规范,提供组件的运行环境的程序。tomcat就是一个提供了servlet运行环境的容器。2)如何写一个servlet?Step1,写一个java类,实现servlet接口或者继承HttpServlet抽象类。Step2,编译Step3,打包即创建一个具有如下结构的文件夹:appname(应用名)WEB-INFclasses(放.class文件)lib(可选,放.jar文件)web.xml(描述文件)Step4,部署将step3创建好的整个文件夹拷贝到容器。注:可以使用jar命令将step3创建好的整个文件夹压缩成”.war”为后缀的文件。Step5,启动容器,访问servlet)servlet是如何运行的?比如,在浏览器地址栏输入=jerry&salary=2000Step1,浏览器依据ip,port建立连接。Step2,浏览器将相关数据(比如请求参数)按照Http协议的要求打包(请求数据包),然后发送。Step3,容器解析请求数据包(请求数据包),然后将解析的结果保存到request对象,同时,还会创建一个rsponse对象。Step4,容器创建servlet对象,然后调用该对象的service方法(会将事先创建好的request和response对象作为参数)。注:可以在service方法里面,通过request获得请求参数,可以将处理结果写到response。Step5,容器从response获取处理结果,然后将这些处理结果打包(响应数据包)并发送。Step6,浏览器解析响应数据包,生成相应的页面。4)http协议(了解)(1)什么是http协议?是由w3c制定的一种网络应用层协议,规定了浏览器与web浏览器之间如何通信的及相应的数据包的结构。1)如何通信Step1,建立连接Step2,发送请求Step3,关闭响应Step4,关闭连接如果要再次发送请求,需要重新建立新的连接,即”一次请求,一次连接”2)优点Web服务器可以利用有限的连接数为尽可能多的请求服务。(2)两种数据包结构1)请求数据包请求行(请求方式请求资源路径协议类型和版本)消息头是一些键值对(使用”:”隔开),表示特定含义,比如浏览器可以发送”user-agent”消息头告诉服务器,浏览器的类型和版本。实体内容只有当发送post请求时,才会有数据(请求参数)。2)响应数据包状态行(协议类型和版本状态码状态描述)状态码是一个三位数字,表示服务器处理请求的状态,常见的有200正常500系统错误404请求地址错误消息头服务器也可以发送一些消息头给浏览器,比如:发送”Content-Type”消息头,通知浏览器,服务器返回的数据类型实体内容程序处理的结果,浏览器会将这些处理结果取出来,生成相应的页面。(3)另种请求方式formaction=””method=””method:以什么的方式来向浏览器提交数据1)get请求a).直接在浏览器地址栏输入某个地址b).表单默认提交方式c).点击链接2)get请求的特点a)会将请求参数显示在浏览器地址栏,不安全(比如路由器就会记录请求地址)。b)会将请求参数添加到请求行(放在请求资源路径的后面),只能提交少量的数据给服务器(请求行只能存放大约2K左右的数据)。3)post请求a)设置method=”post”4)post请求的特点a).不会将请求参数显示在浏览器地址栏,相对安全(不会对请求参数加密)。b).会将请求参数放到实体内容里面,可以提交大量的数据给服务器。2.servlet核心1)servlet输出中文(1)为什么会有乱码Out.println方法在默认情况下,会使用”iso-8859-1”来编码。(2)解决方式response.setContentType(“text/html;charset=utf-8”);作用1:out.println方法会使用指定的字符集来编码。作用2:设置content-type消息头的值,告诉浏览器,服务器返回的数据的类型。2)表单包含中文参数(1)为什么会有乱码?表单提交时,浏览器会对表单中的中文参数值进行编码(会使用打开该所在页面时的字符集编码,比如使用”utf-8”来编码)。服务器端默认情况下,会使用”iso-8859-1”来解码。(2)解决方式Step1,确保浏览器会使用指定的字符集来编码。metahttp-equiv=”content-type”Content=”text-html;cahrset=utf-8”Step2,在服务器端,使用指定的字符集来解码。方式一request.setCharacterEncoding(“utf-8”);注:只针对post请求有效。方式二uname=newString(uname.getBytes(“iso-8859-1”));注:先还原浏览器发送过来的字节数组,然后再使用指定的字符集来解码。3)如何获得请求参数值Stringrequest.getParameter(StringparamName);String[]request.getParameterValues(StringparamName);4)servlet容器如何处理请求资源路径比如:在浏览器地址栏输入浏览器会将”/web05_2/abc.html”作为请求资源路径发送给容器。Step1,依据应用名找到应用所在的文件夹Step2,容器认为访问的是一个servlet,去web.xml中查找要有没有和”abc.html”匹配的servlet。精确匹配:url-pattern/abc.html/url-pattern通配符匹配:使用”*”匹配零个或者多个字符。比如:url-pattern/*/url-pattern后缀匹配:使用”*.”开头,后接任意字符。比如:url-pattern*.do/url-pattern匹配所有以”.do”结尾的请求。Step3,如果找不到匹配的servlet,则查找相应的文件。5)如何将多个servlet合并成一个Step1,后缀匹配,比如servlet-mappingservlet-nameActionServlet/servlet-nameurl-pattern*.do/url-pattern/servlet-mappingStep2,分析请求资源路径。6)转发与重定向重定向:(1)什么是重定向?服务器通知浏览器向一个地址发送请求注:服务器可以发送一个302状态码和一个Location消息头(值是一个地址,一般称之为重定向地址),浏览器收到之后,会立即向重定向地址发送请求。(2)如何重定向response.sendRedirect(Stringurl);(3)细节重定向之前,容器会清空response对象上缓存的所有数据。(4)特点a.重定向地址是任意的。b.重定向之后,浏览器地址栏的地址会发生改变。转发:(1)什么是转发?一个web组件(servlet/jsp)将未完成的处理结果交给另一个web组件继续做。比如一个servlet将处理结果转交给一个jsp来展现。(2)如何转发?Step1,绑定数据到request。request.setAttribute(Stringname,Objectobj);Step2,获得转发器RequestDispatcherrd=request.getRequestDistacher(Stringurl);Step3,转发rd.forward(request,response);Objectrequest.getAttribute(Stringname);注:该方法有可能返回null。(3)转发的特点a.转发之后,浏览器地址栏的地址不变。b.转发的目的地必须是同一个应用。转发与重定向的区别:(1)能否共享request转发可以,重定向不可以。注:(重定向)当容器收到请求,会立即创建request和response,当响应发送完毕,会立即销毁这两个对象。(2)浏览器地址栏的地址是否会发生变化。转发不变,重定向会变。(3)目的地转发的目的地必须是同一个应用,而重定向没有限制。7)servlet的生命周期(1)什么是servlet的生命周期?容器如何去创建servlet对象,如何对其进行初始化操作,如何调用其方法来处理请求以及如何销毁该对象的整个过程。(2)生命周期分成哪几个阶段1)实例化a.什么是实例化容器调用servlet的构造器,创建servlet对象。b.什么时候进行实例化操作情况1:容器收到请求之后。请求2:容器事先创建。需要配置load-on-startup参数。参数值是一个大于等于0的整数,越小优先级越高(却先被创建)。注:容器在默认情况下,对于某个类型的servlet,只会创建一个实例2)初始化a.什么是初始化容器调用servlet的init方法。b.GenericServlet的init方法是如何实现的?将容器传递进来的ServiceConfig对象保存下来,并且提供了getServiceConfig方法来获得该对象。c.如何实现自己的初始化处理逻辑?overrideinit()。d.init方法只会执行一次。e.初始化参数Step1,配置init-paramparam-namecompany/param-nameparam-valueIBM/param-value/init-paramStep2,读取ServletConfig.getInitParameter(“”);3)就绪a.什么是就绪?容器调用servlet的service方法来处理请求。b.HttpServlet的service方法是如何实现的?依据请求类型调用对应的doXXX方法(doGet/doPost)我们写一个servlet,可以选择overrideservice方法或者overridedoGet和doPost方法。4)销毁a.什么是销毁容器在删除servlet对象之前,会调用该对象的destroy方法。b.destroy方法只会执行一次。(3)生命周期相关的几个接口与类1)Servlet接口initservicedestroy2)GenericServlet抽象类实现了Service接口中的部分方法(init,destroy)。3)HttpServlet抽象类继承了GenericServlet,实现了service方法。8)servlet上下文(1)什么是servlet上下文?容器启动之后,会为每一个web应用创建唯一的一个符合servletContext接口要求的对象。特点:a.唯一性:一个web应用对应一个servlet上下文。b.持久性:只要容器不关闭,应用没有被删除,则上下文会一直存在。(2)如何获得servlet上下文?GenericServlet,ServletConfigFilterConfig,HttpSession都提供了getServletContext方法。(3