Servlet
B/S架构(了解)
1)什么是B/S架构
客户端使用浏览器,服务端使用web浏览器,客户端跟服务器之间使用HTTP协议进行通讯。
2)优点
①客户端不需要单独安装(因为使用浏览器);C/S架构比较麻烦的是需要单独安装每个客户端,并且一旦客户端版本发生改变,就需要再次安装。
②开发相对简单;C/S架构需要我们分别在,客户端和服务器端编写相应的通信处理模块和自定义协议,而B/S架构使用标准的HTTP协议(即不再需要自定义协议),而且浏览器与Web服务器已经包含了相应的通信模块了。
Servlet的运行过程
比如,在浏览器地址栏输入:http://ip:port/web01/hello(web01/hello为请求资源路径)。
step1:浏览器依据ip和port建立与Servlet容器之间的连接。
step2:浏览器将请求数据打包(即按照http协议的要求,将相关数据封装成一个数据包,一般称之为请求数据包)并发送给Servlet容器。
step3:Servlet容器解析请求数据包,并将解析之后得到的数据放到已创建的request对象上,同时,容器也已经创建好了一个response对象。
step4:Servlet容器依据请求资源路径(即/web01/hello)找到Servlet的配置,然后创建Servlet对象(根据xml文件里配置的类而创建)。
step5:Servlet容器接下来调用Servlet对象的service方法,并且会将事先创建好的request对象和response对象作为service方法的参数传递给Servlet对象。
step6:Servlet可以通过request对象获得请求参数,进行相应的处理,然后将处理结果写到response对象上。
step7:Servlet容器读取response对象上的数据,然后将处理结果打包(响应数据包)并发送给浏览器。
step8:浏览器解析响应数据包,将返回的数据展现给用户。
常见错误及解决方式
1)404:是一个状态码(是一个三位数字,由服务器发送给浏览器,告诉浏览器是否正确处理了请求),404的意思是说:服务器依据请求资源路径,找不到对应的资源。
解决:①依据http://ip:port/appname/url-pattern检查你的请求地址是否正确。
②仔细检查web.xml,特别要注意servlet-name是否一致。
2)500:服务器处理出错,一般是因为程序运行出错。
解决:①检查程序的代码,比如:是否继承。
②检查web.xml,类名要填写正确。
3)405:服务器找不到对应的service方法。
解决:检查service方法的签名(方法名、参数类型、返回类型、异常类型)。
什么是HTTP协议
HTTP(Hypertext transport protocol)是超文本传输协议。是一种应用层协议,由W3C制定,它定义了浏览器(或者其他客户端)与Web服务器之间通讯的过程及数据格式。
2.2通讯的过程
step1:浏览器建立与Web服务器之间的连接(Socket)。
step2:浏览器要将请求数据打包(请求数据包),然后发送给Web服务器。
step3:Web服务器将处理结果打包(响应数据包),然后发送给浏览器。
step4:Web服务器关闭连接。
* 注意事项:特点:一次请求,一次连接。优点:Web服务器可以利用有限的连接个数为尽可能多的客户服务(效率高)。如果浏览器要再发请求,就必须重新建立一个新的连接。
2.3数据格式
1)请求数据包
①请求行:请求方式+请求资源路径+协议描述。
②若干消息头:消息头是一些键值对,一般由W3C定义,有特定的含义。浏览器和服务器之间,可以通过发送消息头来传递一些特定的信息,比如:浏览器可以通过user-agent消息头来通知服务器浏览器的类型和版本。
③实体内容:只有当请求方式为post时,浏览器才会将请求参数添加到实体内容里面,如果请求方式为get,浏览器会将请求参数添加到请求资源路径的后面。
2)响应数据包
①状态行:协议描述+状态码+状态描述。
②若干消息头:服务器也可以发送一些消息头给浏览器,比如content-type,告诉浏览器服务器返回的数据类型和编码格式(字符集,比如:UTF-8、ISO-8859-1)。
③实体内容:程序处理之后,返回的结果。
get请求与post请求
1)哪些情况下,浏览器会使用get方式发请求:
①直接在浏览器地址输入某个地址。 ②点击链接地址。
③表单默认的提交方法:<form method="get(默认)/post">。
2)哪些情况下,浏览器会用post方法发请求:
①设置表单的method属性值为“post”。
3)get请求的特点:
①get请求会将请求参数添加到请求资源路径的后面,因为请求行存放的数据大小有限(也就是地址栏的最长字节数),所以get请求只能提交少量的数据。
②get请求会将请求参数显示在浏览器地址栏,不安全(比如,路由器会记录整个地址)。
4)post请求的特点:
①post请求会将请求参数添加到实体内容里面,所以,可以提交大量的数据。
②post请求不会将请求参数显示在浏览器地址栏,相对安全一些。但是,post请求并不会对请求参数进行加密处理。用HTTPS协议进行加密处理。
重定向
1什么是重定向
服务器发送一个302状态码及一个Location消息头(值是一个地址,称为重定向地址),通知浏览器立即向重定向地址发请求。
2如何重定向
使用response.sendRedirect(String url);
3注意两个问题
1)重定向之前,不要调用out.close();会报错!
out.println("添加成功");//能看到这个输出!(如果不写这个输出,则响应为空白页)
out.close();
response.sendRedirect("list");//看不到重定向结果!
2)重定向之前,服务器会先清空response对象上缓存的数据。Servlet只允许同时发送一个响应。
out.println("添加成功");//看不到这个输出!缓存数据被清空(响应一)
response.sendRedirect("list");//能看到重定向结果!(响应二)
out.close();
4两个特点
- 重定向的地址是任意的(前提要存在否则报404)。
2)重定向之后,浏览器地址栏的地址会变成重定向地址。
转发
一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续完成。常见的情况是:一个Servlet将数据处理完毕之后,转交给一个JSP去展现。
1.如何转发
step1:绑定数据到requset:request里有个HashMap。
request.setAttribute(String name,Object obj);//name:绑定名。obj:绑定值。
另一个方法获取绑定值:
Object request.getAttribute(String name);//如果绑定对象的值不存在,会返回null
step2:获得一个转发器:url:要转发给哪一个Web组件
RequestDispatcher rd=request.getRequsetDispatcher(String url);
step3:转发
rd.forward(request,response);//JSP和Servlet会共享相同的请求和响应对象
step4:在转发的目的地,可以使用request.getAttribute方法获得绑定的数据,然后进行处理。
2.编程需要注意的两个问题
1)转发之前,先清空response对象中缓存的数据。
out.println("hello");//看不到结果
rd.forward(request, response);//能看到结果
2)转发之前,不能调用out.close()或着out.flush只能同时处理一个响应
out.println("hello");//看到结果
out.close();
rd.forward(request, response);//看不到结果
3.转发的特点
1)转发的目的地只能够是同一个应用内部的某个组件的地址。
2)转发之后,浏览器地址栏的地址不变。
3)转发所涉及的各个Web组件可以共享同一个request对象和response对象
Servlet生命周期
1、载入:第一次请求的时候被初始化,只一遍
2、初始化:调用init方法,只一遍
3、执行:每一个请求,new一个新的线程,调用一遍service->super.service->doGet/doPost
① 不要在Servlet中设计成员变量(多个请求线程共享,会发生资源冲突问题。正常即使设也是只读,不可写的即final)
② doGet,doPost常见异常
③ HTTP Status 405 - HTTP method POST(GET) is not supported by this URL;增加doPost()或者doGet()方法即可
4、销毁:卸载前调用destroy方法,子类Servlet一般不需要覆盖这个方法
Session
什么是session:
- 服务器端的状态管理技术。
②当浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id号,称之为sessionId)。接下来,服务器在默认情况下,会使用set-cookie消息头将这个sessionId发送浏览器,浏览器会将这个sessionId保存下来(内存中,因为指定生存时间)。当浏览器再次访问服务器时,会将sessionId使用cookie消息头发送给服务器,服务器依据这个sessionId就可以找到之前创建的session对象。
③用户与服务器之间的多次交互叫一次会话。
1、将http状态信息保存在服务器端的技术
2、取得: HttpSession session = request.getSession();
如果session已经被创建,则返回已经创建的。如果未创建,则创建新的session。一个客户端拥有一个session对象。
3、作用域:被属于同一个会话的请求共享。
4、其他方法:
session.getId() 返回相关联的session的id。
session.setMaxInactiveInterval(6) 以秒为单位设置session的最大空闲时间(也可以在web.xnk中<session-config>中配置空闲时间,在tomcat的web.xml中的也会有配置,默认是30分钟)。
session.invalidate() 强制session失效。
Cookie
什么是cookie:
①是一种客户端的状态管理技术。
②当浏览器访问服务器的时候,服务器可以将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据保存下来。当浏览器再次访问服务器时,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
1、将http状态信息保存在客户端的技术
2、不是服务器直接读取本地的cookie,是浏览器读cookie,而服务器读浏览器发出的名为cookie的请求头信息。
3、取得:
Cookie cookie = new Cookie("name","value");
添加多对值,要new多个cookie。
4、方法:
cookie.setMaxAge(3600*24) 设置cookie的有效期。如果不设置cookie有效期,cookie就不会被增加到客户端硬盘上,只能写在客户端的内存中。
5、响应信息中添加cookie:
response.addCookie(cookie);
6、取得客户端发来的cookie:
request.getCookie();
返回Cookie[]类型的数组,再调用getName() getValue()来访问 他的name和value读取的不是客户端硬盘和内存中的信息,而是浏览器发送给服务器请求头Cookie中的信息。
ServletConfig
一般用于处理该Servlet在配置文件配置的信息
1、标记里氏参数名和参数值,要写多对参数,就要用多个<init-param>标记
2、取得:
ServletConfig sc = this.getServletConfig();
3、方法:
sc.getInitParameter("aaa") -> 返回名为aaa的参数值
sc.getServletName() -> 取得所属Servlet的名字
sc.getInitParameterNames() -> 返回所有参数名的枚举
ServletContext
一个web应用只有一个ServletContext对象。所有的Servlet都共享这个ServletContext对象,又称为Application对象,也是一个作用域:
空间:最广,被所有Servlet共享
时间:最长,从web应用被加载到被卸载都有效