servlet+jsp基礎知識三

honghu79 13年前發布 | 2K 次閱讀 ActionScript google應用商城
1、問題
通過servlet01-02的相應案例可以看出,servlet里面
1、有大量的out.println("<html>")等語句
2、每個 servlet里面有大量的連接訪問數據庫的代碼,代碼冗余不利于后期維護
采用jsp可以解決以上問題
2、hey.jsp例子
<%
 for (int i=1;i<=10000;i++){
  out.print("JSP");
 }
%>

3、通過例子來理解JSP、內建對象、JSP引擎
理解:
 實際上 JSP也是servlet,是一路貨,是同樣的東西
 訪問這個JSP實際上也是訪問servlet
 當我們用瀏覽器訪問JSP的時候,tomcat服務器要首先要把這個jsp文件讀取了,并把它轉換成servlet
 實際上我們訪問的就是這個轉換后的servlet
servlet與Jsp原理是一樣的,只是jsp的效率稍微高些
 
 Tomcat服務器是怎么把它轉換成servlet的呢?通過jsp引擎來進行轉換
 其中 JSP引擎是Tomcat里面的一個小程序,用來將用戶寫的JSP轉換成指定的servlet,然后再輸出到瀏覽器
 
 
 訪問一個 html頁面和訪問一個jsp是不一樣的
  訪問一個html頁面,服務器只是簡單做個響應
  訪問一個jsp時,首先要將jsp轉換成servlet然后在將其輸出到瀏覽器上
   第一次運行比較慢,首先要將jsp轉換成servlet。
   下一次運行時不需要轉化,直接運行調用即可。
 
 
比如看
D:\tomcat6\work\Catalina\localhost\org.e2learning.servlet.03\org\apache\jsp
2個文件,其中hey_jsp.java就是tomcat將hey.jsp文件轉換成hey_jsp.java
 
out內建對象,隱含對象
什么叫內建對象,引擎形成的servlet代碼的形成的內容方面已經聲明了
SUN相關標準規定:不同服務器的jsp引擎是不一樣的,但其生成的的內建對象必須是一樣的。
out,response,request
4、如何寫一個jsp文件?
 先寫不變的部分
 再寫jsp部分
----------       -----------
|         |      |  頭      |
| jsp     |      |          |      
|         |      |   jsp    |
|         |      |   尾     |
----------       ------------
 

5、什么是 JSP指令?
jsp指令<%@page import ="java.sql.*" %>
      ========這是數據庫的類庫, 如果再有一個的話,用,隔開
jsp指令是指揮jsp引擎的,要求其在jsp引擎在生成的servlet代碼內加些東西。并不在瀏覽器中顯示。

重要技巧:
<%out.writer(rs.getString(1));%> ====>相當于<%=rs.getString(1)%>
<%=表達式%>======〉<%out.writer(表達式);%>
 
即便寫一個jsp沒有<%%>,也要寫成jsp
header.jsp文件-----應用最多的是頁面的頭部分
foot.jsp文件-----頁面的尾部分
<%@include file="header.jsp" %>
jsp引擎將jsp文件轉換成servlet的時候,一旦讀取到上面這一行,則將讀取所指定的文件到此,完畢后繼續轉換。

<input type="button" class="button" value="Add Emp &raquo;" onclick="location='emp_form.jsp'"/>
                   =================
                   地址欄地址變更為emp_form.jsp
  
6、要注意的問題:
 a、include引入的文件里面定義的變量不能和當前文件定義的變量名相同
 否則會出現 550錯誤,JSP引擎錯誤
 b、<%page import="java.sql.*"%>   以下錯誤信息是由于import后面的java.sql.*沒引起來
 org.apache.jasper.JasperException: /emp_list.jsp(1,17) quote symbol expected
 at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
 at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
 at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:88)
 at org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:198)
 at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:148)
 at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:160)
 at org.apache.jasper.compiler.ParserController.getPageEncodingForJspSyntax(ParserController.java:490)
 at org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(ParserController.java:431)
 at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:207)
 at org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:120)
 at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:180)
 c、以下代表單元格內容為空格<td>&nbsp;</td>

7、
<%out.write("<a href='emp_formb.jsp'>addEmp</a>"); %>
<input type="button" class="button" value="add EMP" onclick="location='emp_listb.jsp'"/>

8、cookies理解
                    
cookies
瀏覽器第一次訪問服務器的時候,服務器在響應的時候,讓瀏覽器把一部分小的數據帶回去,這部分小的數據就是cookies
比如坐車,坐10次送1次;這個老板應該做什么呢?
方式:
1\服務器卡
2\每人發個卡  cookies
給每人發一個卡,來一次填寫一個卡
用servlet和jsp寫cookies是一樣的。

9、servlet中cookies,通過sniffer抓包分析
servlet中加上有以下代碼:
  Cookie cookie=new Cookie("some_cookie","1000");//用來封裝cookies信息
  response.addCookie(cookie);//通過響應來添加cookies;response.addCookie()
通過客戶端訪問servlet時:
 http第一次請求
 http響應
  Set-Cookies:some_cookie=1000
 http第二次請求  會通過請求協議頭的方式把這個信息帶給服務器
  cookie:some_cookie=1000;
  一次請求可以帶n個cookie
  響應的時候多個set-cookie
  
  // 用來封裝Cookie的信息
  //名字和值都是字符串
  
  
10、寫 cookie:response  
  String value1 = URLEncoder.encode("1+1=2", "utf-8");
  String value2 = URLEncoder.encode("兩千", "utf-8");
  Cookie cookie1 = new Cookie("some_cookie", value1);
  Cookie cookie2 = new Cookie("other_cookie", value2);
  // 生成響應頭中的set-cookie項
  
  //  0 馬上刪除
  //  <0 瀏覽器關閉即刪除
  //  >0 秒數
  cookie1.setMaxAge(60);
  
  response.addCookie(cookie1);
  response.addCookie(cookie2);
  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  out.println("<HTML>");
  out.println("<HEAD><TITLE>A Servlet</TITLE></HEAD>");
  out.println("<BODY>");
  out.println("<h1>Add Cookie</h1>");
  out.println("</BODY>");
  out.println("</HTML>");

11、得到cookie    :request
  getcookies
 response.setContentType("text/html;charset=utf-8");
  PrintWriter out = response.getWriter();
  // 如果請求協議頭中沒有cookie,則返回null
  //由于cookies返回的可能不是一個,所以是以數組
  Cookie[] cookies = request.getCookies();
  if (cookies != null) {
   for (int i = 0; i < cookies.length; i++) {
    Cookie cookie = cookies[i];
    //顯示在控制臺上看下
     System.out.println();
    
    out.println("<h1>" + cookie.getName() + ": "
      + URLDecoder.decode(cookie.getValue(),"utf-8") + "</h1>");
   }
  }
12、cookies的編碼問題
存儲cookies的時候,其字符串不能包含 "= ;",盡量不要寫太復雜。(主要是協議頭里面包含=號和;號)
如果非要在里面加上=;號時,需要進行URLEncode的編碼
比如說 
  String value1 = URLEncoder.encode("1+1=2", "utf-8");
  String value2 = URLEncoder.encode("兩千", "utf-8");
  Cookie cookie1 = new Cookie("some_cookie", value1);
  Cookie cookie2 = new Cookie("other_cookie", value2);
  通過編碼之后再保存 就可以解決以上問題。

    out.println("<h1>" + cookie.getName() + ": "
      + URLDecoder.decode(cookie.getValue(),"utf-8") + "</h1>");

13、假設一個論壇需要登錄注冊模塊
要求:必須是我們數據庫里面的用戶才能登陸,否則不能登陸
我們用什么辦法檢測過,這個用戶登錄過
 避免:只是設置了個門口,而沒用設置墻
 if(num==1) {
  -------
  最好加上下面cookies代碼
   -------
   response.sendRedirect("emp_list.jsp");
  } else {
   response.sendRedirect("login_form.jsp");
  }
 可以采用這種方式,如果成功登陸了,則會返回一個cookies,當再次訪問的時候可以帶一個cookies上來。
   cookies代碼
   Cookie cookie = new Cookie("user_key",name);
   //cookie.addMaxAge(60);
   response.addCookie(cookie);
  這里嚴格一下都要進行編碼
新建一個validate.jsp頁面,通過include導入到其他頁面,來進行信息的驗證
validate.jsp
<%
 Cookie[] cookies = request.getCookies();
 boolean b = false;
 if (cookies != null) {
  for (int i = 0; i < cookies.length; i++) {
   if ("user_key".equals(cookies[i].getName())
     && cookies[i].getValue() != null
     && cookies[i].getValue().length() > 0) {
    b = true;
    break;
   }
  }
 }
 if (!b) {
  response.sendRedirect("login_form.jsp");
 }
%>
 
需要在登陸之后才能看到的jsp文件前面加上
<%@include file="validate.jsp" %>
14、碰到的問題:
 
 
 web.xml文件中<servlet-name>saveCookie</servlet-name>
 web.xml文件中<servlet-name>savecookie</servlet-name>區別??
 
15、cookie的年齡
cookie默認是有年齡的,一關瀏覽器就自動刪除了。
cookie.setMaxAge(60);//設置cookie年齡為多少秒?
  
  //  0 馬上刪除
  //  <0 瀏覽器關閉即刪除(默認)
  //  >0 秒數
 
 
 
 
validate.jsp
<%
 Cookie[] cookies = request.getCookies();
 boolean b = false;
 if (cookies != null) {
  for (int i = 0; i < cookies.length; i++) {
   if ("user_key".equals(cookies[i].getName())
     && cookies[i].getValue() != null
     && cookies[i].getValue().length() > 0) {
    b = true;
    break;
   }
  }
 }
 if (!b) {
  response.sendRedirect("login_form.jsp");
 }
%> 
這個代碼是有bug的。
只要Cookie:user_key=1000;即可
       =====
原因就是cookie是讓人拿回家的,用戶如果了解原理就可以修改這個cookie。

登陸安全級別相對來說比較高的話,session比cookie要安全點,但是并不是完美安全
一個cookie不能超過4k
輸入法是一個強大的搜索引擎
 本文由用戶 honghu79 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!