在網上看到這篇關於JSP總結的文章摘錄了下來,總共分了7點去進行總結,有理解的部分,也有隻知其一;不知其二的一些內容,但願等我更深刻地瞭解到這方面的知識了再回來看看,能有更大的啓發。
html
1、JSP工做原理java
<%! public void jspInit() { System.out.println("jspinit"); } %> <%! public void jspDestory() { System.out.println("jspDestory"); } %>
2、服務端的輸出緩衝區web
用response.getBufferSize()或out.getBufferSize()可取的輸出緩衝區的大小,單位爲字節. 用response.isCommitted()可檢查看服務端是否已將數據輸出到客戶端. 若是返回值是TRUE則已將數據輸出到客戶端,是FALSE則尚未。數據庫
3、服務端輸出重定向編程
(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> cookie
該方法是利用服務器端先將數據輸出到緩衝區的機制,在把緩衝區的內容發送到客戶端以前,原來的不發送,改成發送該頁面的內容,若是在<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)重定向比較好。
4、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");
5、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選項/常規/設置/的檢察所存頁面的較新版本,設爲每次訪問該頁時都檢查.
6、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); }
7、JSP和SERVLET的區別: