在网上看到这篇关于JSP总结的文章摘录了下来,总共分了7点去进行总结,有理解的部分,也有一知半解的一些内容,希望等我更深入地了解到这方面的知识了再回来看看,能有更大的启发。
一、JSP工作原理
<%! public void jspInit() { System.out.println("jspinit"); } %> <%! public void jspDestory() { System.out.println("jspDestory"); } %>
二、服务端的输出缓冲区
用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节. 用response.isCommitted()可检查看服务端是否已将数据输出到客户端. 如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有。
三、服务端输出重定向
(1)RESPONSE.SETREDERECT("URL")
该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,使浏览器显示重定向网页的内容.
response.sendRedirect("http://localhost:7001/index.html");
(2)下面的方法也能改变HTTP HEADER属性,它的原理和 1 是一样的.
<% response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); String newLocn="/index.html"; response.setHeader("Location",newLocn); % >
(3)采用<JSP:FORWORD>
该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.
如下面的例子中(1)会输出index.html的内容,(2) 不会输出index.html的内容,而是输出
out.println("@@@@@@@@@@@@@@@@@");
中的内容,并且在服务端会抛出:
java.lang.IllegalStateException: Response already committed
异常,但客户端没有任何错误输出。
(1)
<%@page buffer="1kb"%> <% long i=0; for(i=0;i<10;i++) { out.println("@@@@@@@@@@@@@@@@@"); } %> <jsp:forward page="./index.html" />
(2)
<%@page buffer="1kb"%> <% long i=0; for(i=0;i<600;i++) { out.println("@@@@@@@@@@@@@@@@@"); } %>
2. 采用方法(1),(2)request中的变量(通过request.setAttribute()保存到request中的值)不能在新的页面中采用,采用方法(3)能. 综上,我们应该采用(1),(2)重定向比较好。
四、JSP中正确应用类:
代码(1)
<jsp:useBean id="test" scope="request" class="demo.com.testdemo"> </jsp:useBean> <% test.print("this is use java bean"); testdemo td= new testdemo(); td.print("this is use new"); %>
代码(2)
demo.com.testdemo test = (demo.com.testdemo)request.getAttribute("test"); if (test == null) { try { test = (demo.com.testdemo) java.beans.Beans.instantiate(getClass().getClassLoader(),"demo.com.testdemo"); } catch (Exception _beanException) { throw new weblogic.utils.NestedRuntimeException("cannot instantiate 'demo.com.testdemo'",_beanException); } request.setAttribute("test", test); out.print(" "); } out.print(" "); test.print("this is use java bean"); testdemo td= new testdemo(); td.print("this is use new");
五、JSP的调试
java.lang.NullPointerException String a = null; a.substring(0,1);
为避免这种异常最好在对变量操作之前检查看它是否为NULL值.如:
<% String ss=Session.getAttribute("NAME") if isnull(ss) { } else { } %>
String str1="ABCD"; String str2="ABCD"; (或 String str2="AB"+"CD"; ) if (str1==str2) out.print("yes"); else out.print("no"); 结果是"yes"。 String str1,str2,str3; str1="ABCD"; str2="AB"; str3=str2+"CD"; if (str1==str3) out.print("yes"); else out.print("no"); 结果是"no"。 String str1=new String("ABCD"); String str2=new String("ABCD"); if (str1==str2) out.print("yes"); else out.print("no"); 结果是"no"。 String str1=new String("ABCD"); String str2=new String("ABCD"); if (str1.compareTo(str2)==0) out.print("yes"); else out.print("no"); 结果是"yes"。
(4)防止JSP或SERVLET中的输出被浏览器保存在缓冲区中:
浏览器在默认情况下会把浏览过的网页保存在缓冲区中,在调试时,一般不希望这样.把下面的脚本加入程序中,就可防止JSP或SERVLET中的输出被浏览器保存在缓冲区中
<% response.setHeader("Cache-Control","no-store"); //HTTP 1.1 response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); //prevents caching at the proxy server %>
在IE中也可通过设置实现:把/工具/INTERNET选项/常规/设置/的检察所存页面的较新版本,设为每次访问该页时都检查.
六、COOKIE
public class cookie { public String getDomain() //返回该COOKIE的有效域 public int getMaxAge() //返回该COOKIE的有效期,单位为秒 public String getName() //返回该COOKIE的名称 public String getPath() //返回该COOKIE的有效路径 public boolean getSecure() //返回该COOKIE的安全设置 public String getValue() //返回该COOKIE的值 public void setDomain(java.lang.String pattern) //设置该COOKIE的有效域 public void setMaxAge(int expiry) //设置该COOKIE的有效期,单位为秒 public void setPath(java.lang.String uri) //设置该COOKIE的有效路径 public void setSecure(boolean flag) //设置该COOKIE的安全设置 public void setValue(java.lang.String newValue) //设置该COOKIE的值 }
try { Cookie c = new Cookie("mycookie","COOKIE TEST"); response.addCookie(c); } catch(Exception e) { System.out.println(e); }
然后在一个新的JSP文件中:用下面的方法取客户端的COOKIE到cookies中, 如果cookies.length ==0,说明该客户端的浏览器不支持COOKIE
try { Cookie[] cookies = request.getCookies(); if(cookies.length ==0) { System.out.println("not support cookie"); } } catch(Exception e) { System.out.println(e); }
七、JSP和SERVLET的区别: