javaweb回顧第七篇jsp,javaweb第七篇jsp

來源:互聯網
上載者:User

javaweb回顧第七篇jsp,javaweb第七篇jsp
1:為什麼會有JSP

jsp全名(java server pages)中文叫做java伺服器頁面。在Servlet那一篇我們發現用Servlet可以產生動態網頁面,但是我們卻在Servlet中卻寫了大量的html標籤,此外在Servlet中我們不得不將大量靜態顯示內容和動態生產內容混合在一起,使得我們網頁編輯人員和程式員無法一起進行研發,這樣會大大增加開發的效率,有人會說為什麼不用ajax,因為在那個時候並沒有ajax。所以為了克服這些問題,SUN公司就推出了JSP。

2:JSP的運行機制

我們先來寫一個非常簡單的jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>jsp</title></head><body><%  out.print("Hello Jsp");%></body></html>

 這是一個非常普通的jsp如果我們開啟tomcat伺服器然後在伺服器輸入http://localhost:8080/jsp-test/index.jsp它就會顯示Hello Jsp

當然這不是我說的重點,然後我們開啟jsp編譯後的檔案(位置在.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\jsp-test\org\apache\jsp)裡面有2個檔案一個是index_jsp.java另一個是index_jsp.class。這2個檔案就是當我們訪問jsp的時候由jsp(web)容器產生。現在我們看下index_jsp.java的內容

package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase    implements org.apache.jasper.runtime.JspSourceDependent {  private static final javax.servlet.jsp.JspFactory _jspxFactory =          javax.servlet.jsp.JspFactory.getDefaultFactory();  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;  private javax.el.ExpressionFactory _el_expressionfactory;  private org.apache.tomcat.InstanceManager _jsp_instancemanager;  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {    return _jspx_dependants;  }  public void _jspInit() {    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());  }  public void _jspDestroy() {  }  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)        throws java.io.IOException, javax.servlet.ServletException {    final javax.servlet.jsp.PageContext pageContext;    javax.servlet.http.HttpSession session = null;    final javax.servlet.ServletContext application;    final javax.servlet.ServletConfig config;    javax.servlet.jsp.JspWriter out = null;    final java.lang.Object page = this;    javax.servlet.jsp.JspWriter _jspx_out = null;    javax.servlet.jsp.PageContext _jspx_page_context = null;    try {      response.setContentType("text/html; charset=UTF-8");      pageContext = _jspxFactory.getPageContext(this, request, response,                  null, true, 8192, true);      _jspx_page_context = pageContext;      application = pageContext.getServletContext();      config = pageContext.getServletConfig();      session = pageContext.getSession();      out = pageContext.getOut();      _jspx_out = out;      out.write("\r\n");      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");      out.write("<html>\r\n");      out.write("<head>\r\n");      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");      out.write("<title>jsp</title>\r\n");      out.write("</head>\r\n");      out.write("<body>\r\n");  out.print("Hello Jsp");      out.write("\r\n");      out.write("</body>\r\n");      out.write("</html>");    } catch (java.lang.Throwable t) {      if (!(t instanceof javax.servlet.jsp.SkipPageException)){        out = _jspx_out;        if (out != null && out.getBufferSize() != 0)          try { out.clearBuffer(); } catch (java.io.IOException e) {}        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);        else throw new ServletException(t);      }    } finally {      _jspxFactory.releasePageContext(_jspx_page_context);    }  }}

 看到這個頁面我相信大家很熟悉,可能會說這不是Servlet嗎?我們可以理解成動態Servlet,其中_jspInit、_jspService、_jspDestroy分別對應的是Servlet中的init、service、destroy,他們具有相同的功能,他的優點顯而易見的,就不需要我們在Servlet中去寫上面我用黑體加重的代碼。這樣一來就加快了我們開發的效率。這樣一來我們就很容易理解jsp產生的過程。如

 然後我們在來分析一下Servlet和Jsp的區別

1:Jsp第一次需要編譯成Servlet(只編譯一次)

2:Jsp是Java和HTML可以組合成一個副檔名為.jsp的檔案而Servlet直接從Html分離出來

3:側重點不同,SP側重於視圖,Servlet主要用於控制邏輯。

3:JSP文法3.1:指令元素

指令元素:主要用於為轉換階段提供整jsp頁面的相關資訊,指令元素不會產生任何的輸出到當前的輸出資料流中(說白了就是定義一些關於JSP相關的資訊)

3.1.1:page指令

page指令作用於整個jsp頁面,定義了許多和頁面相關的屬性,那麼我們來看看這些屬性

在我們產生的jsp頁面常常會有這條代碼<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

這上面幾個屬性就是指令元素 language表示開發的語言,contentType表示文本類型,charset和pageEncoding都表示編碼的格式

在將jsp轉成Servlet以後我們可以在_jspService的方法中可以發現response.setContentType("text/html; charset=UTF-8");那麼我們在來看其他的指令元素

<%@ page import="" %>這是是匯入java的類和我們在開發中引用類的作用是一樣的,加入這個指令元素以後產生的Servlet就匯入這個類。

<%@ page isELIgnored="true" %>用的比較多,表示是否啟動EL運算式 如果是Servlet2.3以前的版本預設是true,2.4以後的版本預設是false

<%@ page session="true" %>是否啟動Session 如果是false那麼Session在這個jsp就是無效的 預設是true

<%@ page errorPage="" %> 出現錯誤以後的指向的錯誤頁,此時web.xml配置的對這個就無效了

<%@ page isErrorPage="false" %> 指定這個JSP是否是別的頁面的錯誤頁 預設是false

<%@ page buffer="8kb" %> 指定out對象使用緩衝區的大小 預設值為8kb,none就是不設定緩衝區。

當然還有一些指令元素就不一一說了可以自己查閱一下,大家記住這些指令元素的範圍只能是當前頁面。

3.1.2:include指令

從字面意思我們知道include就是包含的意思,那麼這個指令元素到底幹嘛的呢,它主要用於JSP頁面中靜態包括一個檔案,這個檔案可以是一個html,一個jsp頁面,一個文字檔,一段java代碼,我們來看看運行結果

先寫一個簡單的jsp頁面

1 <html>2 <head>3 <title>我是一個jsp靜態檔案</title>4 </head>5 <body>i am myinclede.jsp6 </body>7 </html>

然後我們在index.jsp中引用

1 <%@ include file="myinclude.jsp" %>

運行結果如下

如果要是一段代碼呢然後我們把myinclede.jsp修改成如下

 1 <%@ page import="java.util.*" %> 2 <html> 3 <head> 4 <title>我是一個jsp靜態檔案</title> 5 </head> 6 <body> 7 <% 8 out.print(new Date().toLocaleString()); 9 %>10 </body>11 </html>

我們在此運行結果如下

3.1.3:taglib指令

這個指令使用者自訂標籤

tablib有三個屬性分別是uri、tagdir、prefi,這個在以後的自訂標籤中詳細講解(暫時簡單介紹)

3.2:指令碼元素

 指令碼元素包括三個部分分別為聲明、指令碼段、運算式

3.2.1:聲明

這個和在java代碼中聲明一個變數或方法一樣,我們來看下它的寫法

<%! int i=1; %>
<% out.print(i); %>

聲明以後我們就可以直接使用這個變數了,記住聲明要在%後面要加上!

當然你也可以聲明一個方法如下

<%! public String getUserName(){return "zhangsan";} %><% out.print(getUserName());%>
注意:使用<%! %>聲明的變數在jsp容器轉換成Servlet類是將該類的執行個體變數或者類變數(聲明時會加上static關鍵字)所以要注意安全執行緒問題3.2.2:指令碼段

指令碼段是在請求處理期間要執行的java代碼<% %>裡面的代碼,這個就不多說了<% out.print(getUserName());%>就算。

3.2.3:運算式

運算式指令碼元素是java語言完成的運算式,在請求計算這些完整運算式時會把結果轉成字串,插入當前的輸入資料流中,運算式以<%=開始 %>結束

比喻姓名:<%= "張三"%>這個就是一個運算式(這個後面不需要添加如何符號)

3.3:動作元素

與 JSP指令元素不同的是,JSP動作元素在請求處理階段起作用。JSP動作元素是用XML文法寫成的。標準的jsp動作元素主要有20種,下面我主要拿常用的說一下

1:<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>

<jsp:useBean>動作用來載入一個將在JSP頁面中使用的JavaBean,它的屬性有id為對象對一個名,class指定Bean的完整包名,scope表示這個對象的範圍

<jsp:setProperty>主要來設定對象值,其中name就是bean對象名,

<jsp:getProperty>主要來擷取對象的,我們來看下例子

public class UserBean {    private String userName;    private String realName;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getRealName() {        return realName;    }    public void setRealName(String realName) {        this.realName = realName;    }
<body>    <jsp:useBean id="user" class="com.lp.beans.UserBean" scope="session"></jsp:useBean>    <jsp:setProperty property="userName" name="user" value="zhangsan" />    <jsp:setProperty property="realName" name="user" value="張三"/>    使用者名稱:<jsp:getProperty property="userName" name="user" />    真實姓名:<jsp:getProperty property="realName" name="user" /></body>

運行結果:

2:<jsp:forward page=""></jsp:forward>這個和上面那個forward作用相同,跳轉地址的。

3:<jsp:include page=""></jsp:include>包含頁面,作用上面也有提及

其他的我這裡不做提及,現在開發用這個估計是不多了,想瞭解的可以自己看看

 4:jsp九大內建對象

在Servlet中我們看到有許多個物件比喻Request,response等那麼Jsp中有嗎,我們說過Jsp是動態Servlet當然會有這些,我們來看看Jsp的9中內建對象

4.1:request

4.2:response

4.3:out,out的對象是JspWriter

4.4:page是jsp轉換成Servlet以後的執行個體object page=this;

4.5:pageContext來擷取當前頁面所有的屬性

4.6:application是javax.servlet.ServletContext的執行個體。

4.7:config是javax.servlet.ServletConfig執行個體

4.8:session

4.9:exception這個表示異常處理

這個我們一看應該都會明白

5:對象和範圍

jsp4種範圍

5.1:request:只在請求一次service有效

5.2:page只在當前頁有效,跳出此頁就無效

5.3:Session在整個會話期間有效

5.4:application在整個應用程式中有效,知道伺服器關閉

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.