日期:2014-05-18  浏览次数:20719 次

JspWriter与PrintWriter
在做网银这块的时候遇到的问题,网银有个自动对账地址,设定后他们的服务器会主动发出请求到我们的服务器通知交易成功,如果验证通过,需要返回一个ok,表示接收到请求,是通过JSP的JspWriter的out对象print方法完成的,即
out.print("ok")


现在我对这个接口有所改动,将请求地址改为了action地址,而且我使用了struts2框架,在action中无法找到jsp中的out内置对象,查了很多内容,说PrintWriter和JspWriter都集成了io.Writer,那么PrintWriter的printF方法是否和out的print方法有同样的作用呢
response.getWriter().print("ok")


------解决方案--------------------
一.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缓冲区中的内容输出到浏览器端.如果想让上面的代码的按代码的先后顺序输出可以写成:
spWriter out1 = pageContext.getOut();

out1.print("222");

out1.flush(); //刷新缓冲区
PrintWriter pw = response.getWriter();
       
pw.print("111");
       *out对象调用PrintWriter对象的print( )方法输出缓冲区中的内容的条件:

^设置page指令的buffer属性关闭了out对象的缓存功能
^写入到out对象中的内容充满了out对象的缓冲区
^整个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值,如果得到的v