servlet学习笔记(二)

10.web项目中的路径问题
路径WebContent/path/ 下面
俩个页面:
pathA.html
A页面中有超链接,链接到B页面
<a href="pathB.html">pathB.html</a>

   pathB.html

一个servlet的映射路径:
/PathServletTest
这个servlet里面服务器内部直接跳转到A页面

注意: 相对路径,指的是相对于当前路径,当前路径指的是当前地址栏里面的路径.

正常情况:
直接访问A页面:
...web_test/path/pathA.html
点击超链接:href="pathB.html"
...web_test/path/pathB.html

404的情况:
先访问servlet,再跳转到A页面:
...web_test/PathServletTest
这时候页面显示的是A页面,因为servlet跳转了.
点击超链接:href="pathB.html"
...web_test/pathB.html

因为要访问到pathB.html需要这样的路径:...web_test_servlet/path/pathB.html

所以上面的这种情况就报错了 404


11.路径中最左边的/
   例如 :一个servlet的映射路径
   /servlet/test/myfristservet
  这里的第一个/就是我们要讨论的.
  路径中其他/都是表示路径的分割。

   注意:如果路径最左没有/,那么路径就是要按照当前路径算,如果最左边有/,那么这个路就要按照这个/所代表的含义来算。
  
   这个/一般会有俩种含义:
http://ip:port/
    1.代表地址栏中端口号后的那个/
   例如:在这种情况下 
   /test.html 
   相当于:
   http://ip:port/test.html


http://ip:port/项目名字/
2.代表地址栏中项目名字后的那个/
    例如:在这种情况下 
    /test.html 
    相当于:
    http://ip:port/项目名字/test.html



    注意:这里指的都是路径最左面的/
特点:和客户端相关的路径中的/
      http://ip:port/
a. html页面中的/代表地址栏中端口号后的那个/
b. 客户端重定向中的/代表地址栏中端口号后的那个/

特点:和服务器端相关的路径中的/
      http://ip:port/项目名字/
c. web.xml文件中的/代表地址栏中项目名字后的那个/
d. 服务器内部跳转中的/代表地址栏中项目名字后的那个/



12.request session application
   这三个对象可以在服务器内部帮我们保存数据以及传递数据.
        类型            对象名
   HttpServletRequest   request
   HttpSession      session
   ServletContext       application

   
   request:
     保存数据:
 key必须是String,value是Object类型
 request.setAttribute("key", value);
 取数据:
 通过key拿到value值,需要的话可以强转
 Object o = request.getAttribute("key");

 作用范围:request的存/取数据只能在一次请求之内起作用.比如服务器内部跳转的时候(因为内部跳转客户端只发一次请求).
 注意:客户端重定向是不行的,因为客户端重定向会发出多个请求.


   session:

  保存数据和取数据:
     和上面request一模一样的操作,只是对象的名字变化了,上面的加request,而这个叫session.

  如何获得:
  HttpSession session = req.getSession();

  作用范围:在一个会话之中起作用.一个会话可以包括很多个request请求,所以放在session中的数据,可以被多个请求所共享.
 
   
   application:
      保存数据和取数据:
     和上面request也是一模一样的操作

      如何获得:
     ServletContext application = 
        req.getSession().getServletContext();

  作用范围:整个项目在运行期间,只有一个application对象,所以这个对象是所有人所有会员共享的,大家都可以向这个对象里面存值,也可以再拿出来.因为 这个对象一个项目中只有一个.

作用范围: request<session<application
(page<request<session<application 这page是之后我们在jsp中要学习的另一个范围,页面范围,只在一个页面中起作用。)

注意:getParameter("key")方法和getAttribute("key")方法,getParameter是接收客户端传过来的值,getAttribute方法是取到之前调用setAttribute方法保存到这个对象里面的值.

13.会话追踪技术 session cookie
http协议的访问是无状态的访问,就是说当前这次访问是不会知道之前访问的状态的.(http协议的访问是不会帮我们保存访问的记录/痕迹的).
有些我们的访问是不需要知道之前访问的状态的.比如我们访问一些静态的页面,在访问一个校园网站的时候,第一次访问点击了页面中的校园风采,第二次访问点击了学生作品,这俩次访问完全可以没有任何关系,也不需要知道各自访问的状态.
但是有些访问我们是一定要知道之前几次访问的状态的.比如在购物网站的时候,第一次访问点击购买了一个手机,第二次访问点击购买了一个电脑,第三次访问点击购物车结算,这个时候我们就必须知道前俩次访问的时候购买了什么,要不然就没有方法去结算。
所以我们就有了会话追踪技术来解决这个访问无状态的问题

session和cookie
session是保存在服务器端的一个对象.客户端是没有session的.

cookie在客户端和服务器端都会有。但是存在的形式不一样.在客户端cookie是以本地文件(浏览器管理的文件)的形式存在的,在服务器端是以java对象的形式存在.

cookie的作用:和session一样,是用来保存用户访问的信息数据的。但是session是把数据保存在服务器端的内存里面,cookie是把数据保存在客户端的文件里面.


客户端访问服务器的时候,服务器会给这个客户端创建一个会话,也就是一个session对象,服务器端的内存里面同时可能有好多个session对象,分别对应的不同的客户端,每一个session对象都有一个唯一的id值,叫做JSESSIONID。

服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个session的JSESSIONID的值返回给浏览器,浏览器接收到后会把这个值以一个cookie文件的形式保存起来.

之后,这个浏览器再发生请求到服务器的时候,就会把之前保存在cookie文件中的JSESSIONID的值传给服务器,服务器通过这个JESSIONID的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应.

这样以来,最后就能到达一个效果,我们客户端的每一次访问,在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享.


如何从服务器端向浏览器写回cookie
    //创建cookie对象
    Cookie c1 = new Cookie("name","tom");
    Cookie c2 = new Cookie("msg","hello");
    //设置cookie的有效时间
    c1.setMaxAge(60*60*24*365);
    c2.setMaxAge(60*60*24*365*10);
    //把cookie放到response里面
    resp.addCookie(c1);
    resp.addCookie(c2);
    
 最后response对象会把cookie带回到浏览器,并又浏览器把cookie对象中的内容保存到对应的一个cookie的文件中。

 注意:如果没有设置cookie生效的时间,那么这个cookie就是会话cookie,当会话结束(关闭浏览器)的时候cookie就是失效了。


     如何在servlet中拿到从浏览器发送过来的cookie文件中的数据
   //从request中拿到一个cookie数组
   //如果没任何cookie数据则返回null
       Cookie[] cookies = req.getCookies();
   //遍历数组 拿出key和value
   for(Cookie c:cookies){
    String key = c.getName();
    String value = c.getValue();
   }

   注意:session对象的创建时间。
   


14.URL重写
也属于会话追踪技术的一种.

URL重写解决了这样一个问题:
当前浏览器把cookie禁用之后,浏览器在发请求的时候,就不会把cookie带到服务器端了(其中最重要的也包括JSESSIONID),因为禁用cookie之后浏览器拒绝一切站点向浏览器写入cookie的(注意再禁用之前是否已经有一些已经存在的cookie了),这样的话,多个请求就不能在服务器端拿到同一个session对象了(因为发送请求的时候没有把JSESSIONID的值传给服务器)。

把JSESSIONID从客户端传给服务器,有俩种方式:
1.JSESSIONID保存在cookie文件中,浏览器发送请求的时候把这个cookie文件中的数据带给服务器(cookie).

    2.通过传参的方式,把JSESSIONID的值通过要访问的URL传给服务器.(URL重写)


如何实现URL重写:
String url = resp.encodeURL("..");
这个方法参数就是我们要访问的URL,这个方法会把重写后的URL以字符串的形式返回.

例如:在一个超链接中,本来要访问的URL是:<a href="GetDataFromSession">

重写后:
<a href="GetDataFromSession;jsessionid=5480EF9016295A73DC56731A2F123246">


15.Filter(过滤器)
作用:在一个请求去访问某个资源的时候,filter可以在这个请求访问到这个资源之前,把请求拦下,然后做出一系列的处理或者判断(比如编码的转换,信息的过滤、权限的判断、是否已经登录的验证等等),最后filter再决定是否要让这个请求去访问那个资源.

如何写一个filter:
写一个java类,然后实现javax.Servlet.Filter接口

这个接口中有三个方法:
init  destroy  doFilter
init:这个过滤器类被服务器创建对象的时候会调用到这个方法。
destroy:过滤器对象被销毁的时候会调用这个方法。
doFilter:当过滤器拦截到请求的时候,会调用这个doFilter.

注意:
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain)

这个方法有三个参数,第三个参数表示的一个过滤器链对象,因为同一个请求有可能要依次的通过俩个或者多个过滤器,在web中把这样多个过滤器看做一个过滤器链条对象,就是用这个FilterChain类型的对象来表示。
chain.doFilter(req,res)表示把当前的req和res传给这个过滤器链条中的下一个过滤器进行过滤,如果说链条中已经没有下一个过滤器,那么就把这次访问放行,让它去访问它真正要访问的资源.

注意:如果这次访问没有符合过滤器中的条件,那么我们就不用调用chain.doFilter(req,res)这个方法把这次访问放行了,而是可以直接进行跳转(服务器内部跳转或者客户端重定向),跳转到一个页面,页面中提示用户一下,为什么这次不让他去访问,比如说 还没有登录、权限不够等等原因。


    最后还需要在web.xml文件中进行配置:
例如:

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.briup.filter.EncodingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这个配置和servlet的配置很相似。

<url-pattern>/*</url-pattern>
表示当前这个过滤器,要拦截的路径是/*,表示项目中所有的资源。

<url-pattern>/servlet/*</url-pattern>
表示当前这个过滤器,要拦截的路径是/servlet/*,也就是项目下面的servlet路径下面的所有资源.

<url-pattern>/firstServlet</url-pattern>
表示当前这个过滤器,要拦截的路径是/firstServlet,也就是说这个过滤器只会拦截这一个路径.

如果要拦截的路径有俩个,我们可以配置俩个<filter-mapping>标签分别都去和同一个<filter>标签对应。

 注意:1.这里的/代表地址栏中项目名字后的/
  2.某一个资源是不是会被拦截,要看地址栏中会不会出现我们在web.xml文件所配置的要拦截的路径.


16.监听器(Listener)
作用:监听web中的一些事件的发生,如果某些事件一旦发生了,那么这个监听器就会调用某些方法进行处理.
比如:在web中可以监听request对象的创建和销毁.

如何去写一个监听器:
1.写一个类,实现一个特点的接口。
2.在web.xml文件中进行配置。
web.xml:
 <listener>
    <listener-class>com.briup.listener.RequestListener</listener-class>
 </listener>

比如:
监听request对象的创建和销毁要实现接口ServletRequestListener
监听session对象的创建和销毁要实现接口HttpSessionListener
监听application对象的创建和销毁要实现接口  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • Servlet整个运行过程图:servlet运行 Web应用的标准目录结构:Web应用的标准目录结构 (一)Req...
    Yinag阅读 381评论 0 0
  • 本文包括:1、Filter简介2、Filter是如何实现拦截的?3、Filter开发入门4、Filter的生命周期...
    廖少少阅读 7,266评论 3 56
  • HTTP协议 基于TCP连接的传输协议 默认端口是80 基于请求—响应模式的协议 HTTP协议的请求头 HTTP协...
    罗志贇阅读 663评论 0 50
  • servlet登陆功能实现与思考 servlet实现登陆功能主要是通过get()方法或者post()方法接收前端页...
    ezsync小智阅读 218评论 2 1
  • 有没有那么一些人,即使走过,也会时不时想起; 有没有那么一段路,即使不曾美好,也会让你深深怀念; 有没有那么一段情...
    萧与水寒_落与水花阅读 324评论 0 0