• JspWriter与PrintWriter的关系


    一.JspWriter与PrintWriter的关系:

    1.都是继承自java.io.Writer类.

    JspWriter可以在JSP页面中直接用out对象输出.可以用pageContext.getOut();得到JspWriter对象.PrintWrietr在JSP页面中必须用response.getWriter();方法得到其对象.二者作用域不同.

    2.在JSP页面中同时调用两种方法向页面输出数据,

    PrintWriter中的数据会输出在JspWriter前面.如:  JspWriter out1 = pageContext.getOut(); //在JSP页面中可以直接使用out对象,而不用像这样用pageContext.getOut();来得到JspWriter对象.这样做得到的out1和JSP页面中封装的out对象是同
    一个对象.(可以用out == out1 来判断两个对象是否相等.)
    out1.print("222");
    PrintWriter pw = response.getWriter();
    pw.print("111");

      *这样做的结果,在浏览器端还是先显示 "111",然后再显示"222".说明不管JspWriter与PrintWriter在程序中的顺序怎么样,始终先会输出PringWriter中的数据然后再输出JspWriter中的数据.这是因为out对象相当于插入到了PrintWriter前面的缓冲区中.out对象满足一定条件时,才会调用PrintWriter对象的print()方法,把out缓冲区中的内容输出到浏览器端.如果想让上面的代码的按代码的先后顺序输出可以写成:

                  JspWriter out1 = pageContext.getOut();

                  out1.print("222");

                  out1.flush(); //刷新缓冲区

                  PrintWriter pw = response.getWriter();
           
                  pw.print("111");

                *out对象调用PrintWriter对象的print( )方法输出缓冲区中的内容的条件:

                ^设置page指令的buffer属性关闭了out对象的缓存功能
                ^写入到out对象中的内容充满了out对象的缓冲区
                ^整个JSP页面结束

                ^JSP中调用了out.flush()或response.flushbuffer()

    二、JSP九个隐含对象
               1.JSP九个隐含对象(内置对象):直接在jsp文件里使用
                  HttpServletRequest    request
                  HttpServletResponse    response
                  PageContext     pageContext (页面上下文)
                  HttpSession     session
                   ServletContext     application
                   ServletConfig     config
                   JspWriter     out
                   Object      page
                 Throwable     exception

              2、四个作用域
                  application作用域   ServletContext
                   session作用域    HttpSession
                   request作用域    HttpServletRequest
                   page作用域    PageContext //生命周期是JSP页面编译成JAVA文件时的service方法.方法结束,生命周期也结束

               3.pageContext的findAttribute方法会依次从四个作用域去找。是按什么先后顺序找的?

                   会按作用域由小到大的顺序来查找.即(page-->request-->session-->application).用pageContext.findAttribute("key");
                   的好处就是不用指定作用域的类型.只要这四个作用域中有指定的key.就可以得到其对应的value;

    三.全局错误处理         

                 对页出现的相同的错误或异常不用在每个页面的指令头都追加errorPage="错误页面";指令.
                 而可以在xml中配置全局错误处理.(必须写在xml文件的 <web-app></web-app>标签对中)

                <error-page>
                          <error-code>404</error-code>
                          <location>/404Error.jsp</location>
                </error-page>

               //用于处理404错误的全局配置.所有404错误都会转到404Error.jsp页面中.

               <error-page>
                   <exception-type>java.lang.ArithmeticException</exception-type>
                  <location>/ArithmeticException.jsp</location>
               </error-page>

               //用于处理算术异常的全局配置.所有算术异常都会转到rithmeticException.jsp页面中.

    四、EL表达式的简单介绍:
               1、从四个作用域中取值,可屏蔽null值,如果得到的value为空,则输出"",而不是null.而且不用指定作用域,从四个作用域的取值顺 序也是从小到大的顺序.

                   即(page--   >request-->session-->application).如果有两个作用域中有相同的"key".那么EL表达式取到的value是作用域较小的key所对应的value.而不会把两个作用域中

                   的值都取出来.

                   ${key}
                   ${key.propertityName}
    .

                2、取请求参数的值非常方便
                     ${param.paramName} //取得URL后的参数名所对应的参数值.如<jsp:forward page="2.jsp?name=aaa&age=14"></jsp:forward>

                    用${param.name}就可以得到"aaa",${param.age}就可以得到"14"

      用EL表达式可以省略大量的代码.不用再调用作用域的getAttribute()方法,判断value是否为null的传统方法.

      3.可以取出JavaBean中的属性. 

       如:
    class Person
    {
       private String name;
      
       public void setName(String name)
       {
        this.name = name;
       }
      
       public String getName()
       {
        return this.name;
       }
    }

    可以在JSP页面写入以下代码,方便取出Bean中的属性.
    Person person = new Person();
    person.setName("aa");

    request.setAttribute("per",person);

    ${per.name} //运行结果为"aa"

  • 相关阅读:
    汉语-词语:什么
    汉语-词语:甚么
    汉语-汉字:心
    汉语-词汇:头脑
    汉语-词语:冰冷
    汉语-词汇:冷静
    两个int类型的数据相加,有可能会出现超出int的表示范围。
    两个int类型的数据相加,有可能会出现超出int的表示范围。
    成员变量与局部变量的区别_
    函数额基本概述
  • 原文地址:https://www.cnblogs.com/huangpeng1990/p/4364370.html
Copyright © 2020-2023  润新知