第四阶段笔记

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两个特点

  1. 重定向的地址是任意的(前提要存在否则报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应用被加载到被卸载都有效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值