1. 程式人生 > >JSP資料的互動

JSP資料的互動

01.什麼是JSP內建物件(jsp核心)

Java 內建物件

Java  作用域

解析:jsp內建物件web容器建立的一組物件。我們都知道tomcat這款軟體可以看成是一種web容器,所以我們可以知道所謂的內建物件都是tomcat建立的。使用內建物件無需使用new關鍵字,直接使用即可。也就意味著只要你敢啟動tomcat,在記憶體中已經駐留了N多內建物件。

01.什麼是內建物件?

解析:就是web容器建立一組物件,這組物件在tomcat伺服器啟動的時候載入到記憶體,可以被使用者直接使用。

02.Jsp中九大內建物件



03.使用request物件的登入案例

login.jsp頁面


do.jsp頁面


welcome.jsp頁面

北京歡迎您!<%=request.getAttribute("name")%>



04.JSP內建物件session

1.為什麼使用session

       當一個請求傳送到Web伺服器時,無論其是否是第一次來訪,伺服器都會把它當做第一次來對待。在實際開發中,往往希望伺服器能夠識別已訪問過的使用者session物件可以做到,因此我們要使用session。

2.什麼是會話

       Web開發來說,一個會話就是使用者通過瀏覽器與伺服器之間進行的一次通話,它可以包含瀏覽器與伺服器之間的多次請求、響應過程。簡單地說就是在一段時間內,一個使用者與

Web伺服器的一連串相關的互動過程

       在一個會話中,使用者可能多次請求訪問一個網頁,也有可能請求訪問同一個伺服器的其他資源。當用戶向伺服器發出第一次請求時,伺服器會為該使用者建立唯一的會話,會話將一直延續到使用者訪問結束。注意:瀏覽器關閉可以導致會話結束!

3.向session作用域中寫入資料

session.setAttribute("username","張三");

設定session的失效時間

session.setMaxInactiveInterval(60*30);

   獲取sessionId

   <%=session.getId()%>

4.使用session物件實現許可權控制

解析:所謂的許可權控制,就是防止使用者直接在位址列中輸入主介面地址,跳過登陸而操作業務資料。

 5.Session物件的失效

session.removeAttribute()適用於清空指定的屬性   
session.invalidate()是清除當前session的所有相關資訊


05.重定向

如果想從一個頁面重定向到另一個目標頁面,這個時候使用的是response.sendRedirect(“目標地址”);

06.轉發

如果想從一個頁面重定向到另一個目標頁面,這個時候使用的是轉發操作,

  request.getRequestDispatcher("main.jsp").forward(request,response);

重定向和轉發:

  01.從客戶端傳送的請求數量來看,重定向是向伺服器傳送了兩次請求。轉發是伺服器內部進的操作,只發送了一次請求request物件中的資料可以保留 。

  02.URL顯示的角度來說:重定向這兩次請求都是直接受瀏覽器干預的。也就是說重定向後url位址列裡看到的地址發生變化了。而轉發是由伺服器內部從一個資源頁面定位到另一個資源頁面,並沒有經過瀏覽器干預,所以url位址列沒有發生改變。

結論:要想在request中儲存資料,那麼就使用轉發,否則使用重定向。

重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來呼叫目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器傳送一個新的頁面請求。因為,當你使用重定向時,瀏覽器中所顯示的URL會變成新頁面的URL,而當使用轉發時,該URL會保持不變。重定向的速度比轉發慢,因為瀏覽器還得發出一個新的請求。同時,由於重定向方式產生了一個新的請求,所以經過一次重定向後,request內的物件將無法使用。          怎麼選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的物件,所以他是第一選擇。但是由於在轉發之後,瀏覽器中URL仍然指向開始頁面,此時如果過載當前頁面,開始頁面將會被重新呼叫。如果你不想看到這樣的情況,則選擇重定向轉發和重定向的區別不要僅僅為了把變數傳到下一個頁面而使用session作用域,那會無故增大變數的作用域,轉發也許可以幫助你解決這個問題。重定向:以前的request中存放的變數全部失效,並進入一個新的request作用域。轉發:以前的request中存放的變數不會失效,就像把兩個頁面拼到了一起。

重定向過程:

        客戶瀏覽器傳送http請求----

        web伺服器接受後傳送302響應要求客戶瀏覽器傳送一個新的http請求----

        客戶端瀏覽器接受此響應後傳送一個新的http請求到伺服器----

        伺服器根據此請求尋找資源併發送給客戶,

        它可以重定向到任意URL

        不能共享request範圍內的資料。

    轉發過程:

        客戶瀏覽器傳送http請求----

        web伺服器接受此請求後呼叫內部的一個方法在容器內部完成請求處理和轉發動作----

        將目標資源傳送給客戶,它只能在同一個web應用中使用,可以共享request範圍內的資料。



07.Include指令

解析:網站中可能多處需要對使用者的登陸身份進行校驗,例如新增資料和修改資料都需要使用者登陸後進行操作。那麼可以將判定使用者是否已經通過驗證的程式碼提取到一個單獨的頁面中,在其他的頁面中可以引入該頁面程式碼進行判定。

jsp中有兩種包含靜態包含<%@include file="xxx.jsp"%>和動態包含<jsp:include page="xxx.jsp">,下面說一下它們之間的區別 
1、<%@include file="xxx.jsp"%>為jsp中的編譯指令,其檔案的包含是發生在jsp向servlet轉換的時期,而<jsp:include page="xxx.jsp">是jsp中的動作指令,其檔案的包含是發生在編譯時期,也就是將java檔案編譯為class檔案的時期 


2、使用靜態包含只會產生一個class檔案,而使用動態包含會產生多個class檔案 


3、使用靜態包含,包含頁面和被包含頁面的request物件為同一物件,因為靜態包含只是將被包含的頁面的內容複製到包含的頁面中去;而動態包含包含頁面和被包含頁面不是同一個頁面


08.提交表單資料亂碼解決方案

    通過form表單給伺服器提交資料的時候,如果提交的是中文資料,那麼可能會出現亂碼,如果表單的請求方式是post請求,那麼可以使用如下方案解決亂碼:

 在呼叫getParameter()之前,設定請求物件request的編碼方式。

 <% request.setCharacterEncoding("utf-8");%>

002.如果是通過get方式提交的form,兩種處理亂碼方案:

  01.通過new String(str.getBytes(iso-8859-1),utf-8);

  這種方式的缺點,每獲取到一個使用者提交的資料就要進行一道轉換

  02.通過conf下的server.xml文件的

              <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443"URIEcoding=utf-8   />

不推薦使用第二種方式,但是要了解,因為真正的開發中,我們接觸不到伺服器。

09.常見的錯誤碼(響應)

 404:伺服器上找不到請求資源頁面

 500:伺服器內部錯誤

 200 OK 伺服器成功處理了請求(這個是我們見到最多的)


301/302 Moved Permanently(重定向)請求的URL已移走。Response中應該包含一個Location URL, 說明資源現在所處的位置

304 Not Modified(未修改)客戶的快取資源是最新的, 要客戶端使用快取

404 Not Found 未找到資源

501 Internal Server Error伺服器遇到一個錯誤,使其無法對請求提供服務

很有用的

已定義範圍

分類

1XX   (臨時響應)

100-101

資訊提示

2XX 200(伺服器成功響應)

200-206

成功

3XX (302:臨時重定向)  303:永久重定向

300-305

重定向

4XX  403:Forbidden:(禁止) 404:(頁面不存在)

400-415

客戶端錯誤

5XX 程式碼錯誤或者異常

500-505

伺服器錯誤

10.Application原理與應用

01.application物件的作用域範圍是整個應用服務,而它在應用中所承擔的責任就類似於一個全域性變數。只要服務啟動,則application物件就會存在。

02.在一個應用中只有一個application,每一個使用者都會共享這一個application物件。

03.通過統計網站訪問次數來講解application的用法

程式碼如下:
<%
 Integer count=(Integer)application.getAttribute("count");
if(count!=null){
    count=count+1;
}else{
   count=1;
}
application.setAbbribute("count",count);
%>
您是第<%=count%>位訪問者

11.物件作用域


例項程式碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP '1.jsp' starting page</title>   
	
  </head>
  
  <body>
   <% 
   pageContext.setAttribute("page", "我最小");
   request.setAttribute("request", "我是3");
   session.setAttribute("session", "我是2");
   application.setAttribute("application", "我最大");
   request.getRequestDispatcher("/myarea/2.jsp");
   %>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

  
  <body>
    <%=pageContext.getAttribute("page") %>
    <%=request.getAttribute("request") %>
    <%=session.getAttribute("session") %>
    <%=application.getAttribute("application") %>
    <% 
    response.sendRedirect(path+"/myarea/3.jsp");
    
    %>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP '3.jsp' starting page</title>
    
	
  </head>
  
  <body>
     <%=pageContext.getAttribute("page") %>
    <%=request.getAttribute("request") %>
    <%=session.getAttribute("session") %>
    <%=application.getAttribute("application") %>
  </body>
</html>

12.Cookie

解析:cookieWeb伺服器儲存在客戶端的一系列文字資訊,根據域名和埠號區分是否儲存成一個檔案,檔案大小為4k。注意:http://localhost:8080/newshttp://localhost:8080/news/util會形成兩個cookie檔案。


作用:對特定物件的追蹤、統計網頁瀏覽次數、簡化登入


 獲取指定keycookie的核心程式碼


<%
		Cookie[] cookies = request.getCookies();
		if(cookies!=null){
			for(int i=0;i<cookies.length;i++){
				if(cookies[i].getName().equals("uname")){
		  		response.sendRedirect(path+"/welcome.jsp");
				}
			}
}
%>

13.cookie和session的對比
1.session是在伺服器端儲存使用者資訊,cookie是在客戶端儲存使用者資訊 2.session中儲存的值是Object型別,cookie儲存的值是String型別 3.session隨會話的結束而將其儲存的資料銷燬,cookie可以長期儲存在客戶端 4.cookie通常使用者儲存不重要的使用者的資訊,重要的資訊使用session儲存 14.JavaBean 1.什麼是JavaBean 01.JavaBean元件本質上就是一個Java類,只是這個類需要遵循一些編碼的約定 02.從功能上分類:封裝資料、封裝業務。 03.一般滿足的需求: JavaBean是一個公有類,並提供無參的公有的構造方法。 屬性私有。 具有公有的訪問屬性的getter和setter方法。 04.JSP和JavaBean
//引入JavaBean
<%@ page="org.jbit.news.bean.*" %>
//使用JavaBean
<%
  User user=new User();
  user.setUname("luky");
  user.getPwd();
%>