1. 程式人生 > >JSP學習與理解(一)

JSP學習與理解(一)

parse runtime this java服務 b站 sps odin 作用域 地址欄

一.JSP的運用



1).WHY
JSP是簡Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一個文件中編寫,只對網頁中的要動態產生的內容采用java代碼來編寫,而對固定不變的靜態內容采用普通靜態html頁面的方式編寫。

Java Server Page:java服務器網頁,在html頁面編寫java代碼



2).新建一個JSP頁面,在body節點內的<% %> 即可編寫java代碼

<body>
  <%
     Date date=new Date();
     System.out.println(date);
   %>
</body>




3).可以放置在WEB應用程序中的除了WEB-INF及其子目錄外的其他任何目錄中,JSP頁面的訪問路徑和普通html的訪問路徑形式也完全一樣。




4).JSP的運行原理:JSP本質上是一個Servlet
每個JSP頁面在第一次被訪問時。JSP引擎將它翻譯成一個Servlet源程序,接著再把這個Servlet源程序編譯成Servlet的class類文件,然後再由WEb容器(Servlet引擎)向調用普通Servlet程序一樣的方式來裝載和解釋執行這個由jsp翻譯成的Servlet程序。



5)JSP頁面的隱含變量:

public void _jspService(HttpServletRequest request,HttpServletReponse reponse)throws java.io.IOException,ServletException{
       PageContext pageContext
=null; HttpSession session=null; ServletContext application=null; ServletConfig config=null; JspWriter out=null; object page=this;
//...
//使用<% %>編寫的代碼在此位置,可以用到request,reponse,pageContext,session
//application,config,out,page這8個隱含對象。(實際上還可以使用一個叫exception的隱含對象)
}


1.request:HttpServletRequest的一個對象.


2.reponse:HttpServletRepomse的一個對象(在JSP頁面中幾乎不會調用reponse的任何方法。)
3.pageContext:頁面的上下文,是PageContext的一個對象。可以從該對象獲取到其他8個隱含對象,也可以從中獲取到當前頁面的其他信息。(學習自定義標簽時使用它)
4.session:代表瀏覽器和服務器的一次會話,是HttpSession的一個對象。
5.application:代表當前WEB應用,是ServletContext對象。
6.config:當前JSP對應的Servlet的ServletConfig對象(幾乎不使用)。若需要訪問當前Jsp配置的初始化參數,需要通過映射的地址才可以。



映射JSP:

<servlet>
    <servlet-name>hellojsp</servlet-name>
    <jsp-file>/hello.jsp</jsp-file>
    <init-param>
       <param-name>test</param-name>
       <param-value>testValue</param-value>
    </init-param>
</servlet>

<servlet-mapping>
     <servlet-name>hellojsp</servlet-name>
     <url-pattern>/hellojsp<url-pattern>
<servlet-mapping>


7.out:JspWriter對象,調用out.println() 可以直接把字符串打印到瀏覽器上。
8.page:指向當前JSP對應的Servlet對象的引用,開發的時候幾乎不使用。
9.exception:在聲明了page指令的isErrorPage="true"時,才可以使用

<%@ page isErrorPage="true" %>


pageContext,request,session,application(對屬性的作用域的範圍從小到大)
out,config,page,reponse


二.JSP基本語法



1).JSP模板元素:JSP頁面中的靜態HTML內容



2).JSP表達式(expression)提供了將一個JAVA變量或表達式的計算結果輸出到客戶端的簡化方式,它將要輸出的變量或表達式直接封裝在<%=和%>之中。




3).JSP腳本片段(Scriptlet)是指嵌套在<%和%>之間的一條或多條java程序代碼
多個腳本片段中的代碼可以相互訪問




 <%
     String ageStr=request.getParameter("age");
     Integer age=Integer.parseInt(ageStr);
     if(age>=18){
         out.println("成年..");
     }else{
         out.println("未成年...");
     }
   %>




4).JSP聲明:JSP聲明將Java代碼封裝在<%和%>之中,它裏面的代碼將被插入進Servlet的_jspServlet方法的外面(在JSP頁面中幾乎不用)



5).JSP註釋的格式
<%-- JSP註釋--%> <!--HTML註釋 -->
區別:JSP註釋可以制止java代碼的運行



和屬性相關的方法:
1).
Object getAttribute(String name):獲取指定的屬性
Enumeration getAttributeNames():獲取所有的屬性的名字組成的Enumeration對象
removeSttribute(String name):移除指定的屬性
void serAttribute(String name,Object o):設置屬性



2).pageComtext,request,session,application對象都有這些方法
這四個對象也稱為域對象。

pageContext:屬性的作用範圍僅限於當前JSP頁面

request:屬性的作用範圍僅限於同一個請求。
session:屬性的作用範圍僅限一次會話,瀏覽器打開到關閉稱之為一次會話(在此期間會話不失效。)
application:屬性的作用範圍限於當前WEB應用。是範圍最大的屬性作用範圍,只用在一處設置屬性,在其他各處的JSP或Servlet中都可以得到



6.請求的轉發和重定向



請求的轉發:
1.調用HttpServletRequest的getRequestDispatcher()方法獲取RequestDispatcher對象
調用getRequestDispatcher()需要傳入轉發的地址

String path="testServlet";
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path);



2.調用httpServletRequest的forward(request,reponse)進行請求轉發
RequestDispatcher.forward(request,reponse);



2).請求的重定向代碼:
執行請求的重定向,直接調用reponse.sendRedirect(path)方法
//path為重定向的地址
String path="testSetvlet";
reponse.sendRedirect(path);
1).本質區別:請求的轉發只發了一次請求,而重定向則發了兩次請求



具體:
1.地址欄是初次請求的地址;
請求的重定向:地址欄不再是初次發出的地址,地址欄為最後響應的地址

2.請求轉發:在最終的Servlet中,request對象和中轉的那個request是同一個對象。
請求的重定向:在最終的Servlet中,request對象和中轉的那個request不是同一個對象。

3.請求轉發:只能轉發給當前WEB應用的資源
請求的重定向:可以定向到任何資源.

4.請求轉發:/代表當前WEB應用的根目錄
請求的重定向:/代表WEB站點的根目錄。


三.JSP指令


JSP指令:JSP指令是為JSP引擎設計的,他們並不直接產生任何可見輸出,而是告訴引擎如何處理jsp頁面中的其余部分


常見的有page,include,taglib
Page指令:
page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面的什麽地方,它 作用的都是整個JSP頁面,為了保持程序的可讀性和遵循良好的編程習慣,page指令最好放在整個jsp頁面的起始部分.



2)page指令常用的屬性:
1import屬性:指定當前JSP頁面對應的Servlet需要導入的類;

<%@page import="java.text.DateFormat"%>



2.session屬性:取值為true或false,指定當前頁面的session隱藏變量是否可用,也可以說訪問當前頁面是是否一定生成httpSession對象。

<%page session="false"%>



1.errosPage和isErrorPage:



>errorPage指定若當前頁面出現錯誤的實際響應頁面時。其中/表示的是當前WEB應用的根目錄。

<% page errorPage="/error.jsp"%



>isErrorPage指定當前頁面的錯誤處理頁面,可以說明當前頁面是否可以使用Exception隱藏變量,需要註意的是isErrorPage="true",並使用exception的方法了,一般不建議能夠直接訪問該頁面
>如何使客戶不能直接訪問某一個頁面呢? 杜宇Tomcat服務器而言,WEB-INF下的文件是不能通過在瀏覽器直接輸入來訪問的,但通過請求轉發是可以的。



4.contentType:指定當前JSP頁面的響應類型。實際調用的是reponse,setContentType="text/html; charset=UTF-8"
通常情況下,對於JSP頁面而言其取值均為text/html;chaeset=UTF-8.charset指定返回的頁面的字符編碼是什麽。通常是UTF-8



5.pageEncoding:指定當前JSP頁面的字符編碼,通常情況下該值和contextType中的charset一致。



3.include指令:
1).include指令用於通知JSP引擎在翻譯當前JSP頁面時將其他的內容合並進當前JSP頁面轉換成的Servlet源文件中,這種在源文件級別進行引入的方式 稱為靜態引入,當前JSP頁面與靜態引入的頁面緊密結合為一個Servlet
2).file屬性的設置值必須使用相對路徑。如果以"/"開頭,表示當前WEB應用程序的根目錄(註意不是站點根目錄),否則,表示相對於當前文件。



4.jsp:include標簽
1).<jsp:include page="b.jsp"></jsp:include>
2).動態引入:並不是像include指令一樣生成一個Servlet院文明就挨罵,而是生成兩個Servlet源文件,然後通過一個方法的方式把目標頁面包含進來。
org.apache.jasper.runtime.JspRuntimeLibrary.include(request,reponse,"b.jsp",out,flase);



5.include指令和jsp:include標簽:
1).<jsp:include>



jsp:forward:

1).<jsp:forward page="/include/b.jsp"></jsp:forward>

<%request.getRequestDispatcher("/include/b.jsp").forward(request,response)%>



2).但使用jsp:forward可以使用jsp:param字標簽向b.jsp傳入一些參數,同樣jsp:include也可以用jsp:param標簽

<jsp:forward page="/include/b.jsp"></jsp:forward>
<jsp:param value="abcd" name="username"/>

or

<jsp:forward page="/include/b.jsp"></jsp:forward>
<jsp:param value="abcd" name="username"/>
</jsp:include>
在b.jsp頁面可以通過request.getParameter("username")虎丘到傳入的請求參數。

JSP學習與理解(一)