• 读head first servlet and jsp有感(2)(转)


    1.使用session保存多个请求会共同用到的属性,因为只要是同一浏览器发过来的多个请求,都属于同一个会话(同一个浏览器多个窗口发送都属于同一个会话,这个求解)

    2.容器通过会话id得知哪个客户是谁,因为如果你的ip地址是路由器的地址,就不能唯一地表示你。第一次会话时,客户发送请求到服务器,然后服务器接收到请求后,作出响应并且将响应发回到客户那里,然后在响应首部加上会话id,以后每次浏览器发送请求到服务器的时候,都会在首部加上这个会话id,那么每次服务器都会知道是哪个客户发送请求过来,就会调用响应的httpSession对象。(session对象通过request.getSession())得到),实质上的会话id是通过cookie对象设置进去首部的

    3.当你调用request.getSession的时候,容器会自动帮你做一下工作

         (1)创建新的httpSession对象

         (2)产生位移的会话id,并且创建新的cookie对象,将会话id与cookie相连

         (3)将cookie对象加进去响应的set-cookie首部下面

    4.当浏览器禁用cookie的时候,会话id会放在url后面,作为参数传收,但是不能使用request.getParameter()得到,这里有点不理解,求指教

    5.删除会话,通过设置会话超时或者调用invalidate()方法

        (1)在dd中配置, <session-config><session-timeout>15</session-timeout></session-config>

        (2)session.setMaxInactiveInternal(20*69)

        (3)cookie都是服务器先发送第一个响应的时候设置的,当你i想在客户和服务器之间每次都知道用户的名字时候,可以在第一次服务器做响应的时候把名字设置在cookie上,因为cookie是一个名/值对,并且它的交互是自动的。cookie就是客户和服务器之间交换的一小段数据

                 第一次在服务器端的时候,

                 Cookie cookie = new Cookie("username",name);

                 Cookie.setMaxAge();//设置cookie的存货时间

                 response.addCookie(cookie)//把cookie发送到客户

                 //从客户请求得到cookie

                  Cookie[] cookies = request.getCookies();

                  for(int i = 0;i < cookies.length;i++){

                        Cookie cookie = cookies[i];

                         if(cookies[i].getName.equals("username")){

                         再通过getValue得到这个username对应的值

    }

                  当你的对象需要每次都在客户和服务器中交流的时候,即每次都要在浏览器中显示的数据,则一般应该产生一个cookie对象,然后将它设置在set-cookie首部中

    }

         session保存的是对象,cookie中保存的是字符串

    6.jsp的使用

    (1).jsp会变成一个servlet对象

    (2).<%%>里面的语句会放在具体的jspService()方法里面,<%=%>等价于out.println()

    (3).<%!%>是声明,会变成转化后的servlet的类范围里面,方法或语句都可以

    (4).在建立jspService()方法的时候,会产生一大堆隐式对象,例如httpServletRequest和jspWriter这种,会有一半servlet应该有的所有隐式对象

    (5).将jsp转换成java源代码和编译成一个class文件只会发生一次在一个jsp中

    (6).可以在dd中使用jsp-file配置初始化参数

    (7).pageContext是jsp特有的隐式对象,并且可以通过这个对象得到其他所有的对象(而且能得到所有域的属性)

    7.jsp动作和el

    (1).<jsp:useBean id="" class="" scope="" />来声明和初始化一个bean属性,如果没有这个id属性的话,会创建一个新的对象,然后set进去,相当于定义一个变量

    useBean中的id要与getProperty中的name相匹配,默认是page属性域

    (2).<jsp:getProperty name="" property="" />相当于从name找到在useBean中已经定义的变量,然后得到这个属性对象的property值,通过get方法

    (3).当在jsp:useBean中使用type属性的时候,生产的servlet会是类型,class属性是指当你要新创建对象的时候new的类型

         Type p = null;

          if(p==null){

           p = new class();

    }

    (4).el表达式

    当使用el表达式的时候,第一个是使用findAttribute找到这个名字对应的对象,后面都是调用get方法。先找页面,再找请求,会话,到应用作用域

    .和[]来访问,使用[]的时候,可以用它来访问list或数组或者map,例:${musicList[0]}

    使用musicMap["Ambient"]是查找ambient对应的键值,如果没有引号,则先查找ambient对应的建,再查找到这个建对应的键值

    请求参数,可以在el中通过param得到,例:

    <input type="text" name="food" />  在jsp中,${param.food}

    el中有cookie隐式对象,可以使用${cookie.属性名.value}来得到你要的cookie的值

    只有pageContext是真正得到对象,其他都只是得到作用域不是真正得到对象(例如request),只是作用域属性的map

    (5)include指令和jsp:include动作的区别

    include指令:将整个jsp代码放进去,只会编译一次,如果代码修改后,web容器是不会知道的(不过一般现在web容器已经支持这个功能),静态 使用file

    include动作:只是将include进去的jsp的响应与本来的响应合起来,每次有请求到来时,include动作中的jsp页面都会重新编译一次,所以为动态包含 使用page

    可以使用jsp:param来给包含的页面添加东西

    <jsp:forward page="" />来转向到另一个jsp中,使用这个的时候,缓冲区会在转发之前清空,等于转发之前的内容不会打印出来

    「Stay Hungry. Stay Foolish.」
  • 相关阅读:
    Context都没弄明白,还怎么做Android开发?
    Android中Drawable分类汇总
    查找首个非重复字符
    七个对我最好的职业建议(译文)
    Android:最全面的 Webview 详解
    Android开发之微信底部菜单栏实现的几种方法汇总
    android 底部菜单栏实现(转)
    Android实现顶部底部双导航界面功能
    Android BottomNavigationBar底部导航控制器的使用
    Android底部导航栏的四种实现
  • 原文地址:https://www.cnblogs.com/Bluesgao/p/7644008.html
Copyright © 2020-2023  润新知