Servlet之JSP

JSP本質

  • JSP是一種動態網頁技術
  • 常見的幾種動態網頁技術:JSP(Java Server Page)、ASP(Active Server Page)、PHP(Hypertext Preprocessor)

本質:JSP就是Servlet,JSP也是Java類,經過JSP引擎將JSP轉譯成Servlethtml

JSP執行過程

image
瀏覽器請求jsp,tomcat收到.jsp請求,則會到org.apache.jasper.servlet.JspServlet處理,JspServlet調用相應的java類,jsp引擎根據.jsp生成的java類(位於tomcat子目錄work下面有_jsp.java,_jsp.class),執行*.jsp.class,將HTML數據輸出給tomcat,tomcat再將這些數據輸出給客戶端。java

JSP語法

一、page:設置jsp文件向Servlet轉換時的公共參數web

<%@ page contentType="text/html; charset=utf-8" language="java" pageEncoding="utf-8"%>
<%@ page import="java.util.*, java.lang.*" %> 
<%@ page session="false" %> 
<%@ page errorPage="error.jsp" %>
  • contentType:設置瀏覽器解析響應信息時使用的編碼和解析格式
  • language:設置jsp要轉譯成的文件類型
  • import:導入須要的jar包,多個包用逗號分隔
  • pageEncoding:設置頁面的編碼格式
  • session:設置Servlet中是否有session對象
  • errorPage:當頁面發生邏輯錯誤的時候,跳轉的頁面
  • extend:轉譯過去的Servlet類要繼承的父類

二、局部代碼塊
能夠將java代碼與HTML標籤寫到一個jsp頁面中,格式爲<% %>,java代碼轉譯成Servlet文件中,java代碼與輸出是保存在Servlet方法中的
缺點是代碼可讀性差,開發效率低,通常不用這種方式apache

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
 int i = new Random().nextInt(10);
 if (i/2==0){
%>
    <b>今天吃火鍋</b>
<%}else{%>
    <b>今天吃燒烤</b>
<%}%>
</body>
</html>

三、全局代碼塊
定義公共方法時須要使用全局代碼塊,格式爲<%! %>,轉譯後生成的代碼在Servlet類中,調用的時候須要使用局部代碼塊瀏覽器

<html>
<head>
    <title>Title</title>
</head>
<body>
<%--全局代碼塊寫在<%! %>中--%>
<%!
 public String getStr(){
 return "全局代碼塊";
 }%>
<% System.out.println(getStr()); %>
</body>
</html>

四、腳本調用方式
格式爲:<%= %>,使用這種調用方式,調用的方法必須有返回值,不能在變量或者方法後面加分號緩存

<%!
 public String str = "全局代碼塊";
 public String getStr(){
 return str;
 }%>
<%=str%>
<%=getStr()%>

五、includetomcat

  • 靜態導入
    <%@ include file="logo.jsp" %> file是相對路徑
    在servlet引擎轉譯時,就把此文件內容包含了進去(兩個文件的源代碼整合到一塊兒,所有放到_jspService方法中),因此只生成了一個servlet,因此兩個頁面不能有同名的變量。
    耦合性較高,不夠靈活。
  • 動態導入
    <jsp:include page=「logo.jsp」></jsp:include>
    在servlet引擎轉譯後,請求的此頁面,因此共生成了兩個servlet,因此能夠有同名變量。
    生成兩個servlet,至關於兩個類之間的調用,耦合性較低,很是靈活。

六、forward請求轉發服務器

  • <jsp:forward page=""></jsp:forward>用於請求轉發!標籤之後的代碼,將不會被執行。
  • 標籤中間可使用<jsp:param name="" value="">增長轉發參數,可是不能寫其餘任何字符,否則會報錯

page.jspsession

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--請求的頁面--%>
<%--轉發到forward.jsp頁面--%>
<jsp:forward page="forward.jsp">
    <jsp:param name="location" value="East"></jsp:param>
    <jsp:param name="city" value="Beijing"></jsp:param>
</jsp:forward>
</body>
</html>

forward.jspapp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--我是轉發後的頁面--%>
<%--獲取轉發過來的參數--%>
<b>地區:</b><%=request.getParameter("location")%>
<br>
<b>城市:</b><%=request.getParameter("city")%>
</body>
</html>

JSP九大內置對象

jsp頁面在轉譯成對應Servlet文件時,會自動聲明一些對象,在JSP頁面中能夠直接使用。能夠在局部代碼塊和腳本段語句中使用,可是不能在全局代碼塊中使用。
九大內置對象:

  • pageContext 頁面的上下文對象,封裝了其餘內置對象及當前頁面運行的信息,每個頁面都有一個對應的pageContext對象,隨着當前頁面的結束而結束。
  • request 封裝當前請求的數據,由tomcat建立,一次請求對應一個request對象
  • session 封裝同一個用戶不一樣請求的共享數據,一次會話對應一個session對象
  • application 至關於ServletContext對象,一個web項目只有一個對象,存儲多有用戶的共享數據,從服務器啓動到服務器結束
  • response 響應對象,用來響應請求,講處理結果返回給瀏覽器
  • page 表明當前jsp對象,與java中的this指針相似
  • exception 異常對象,存儲當前運行異常信息,必須在page指令中添加屬性isErrorPage="true"
  • config 至關於ServletConfig對象,用來獲取web.xml中的配置數據,完成Servlet初始化
  • out 響應對象,jsp內部使用,帶有緩存區的響應對象,效率高於Response

JSP做用域

四大做用域

  • pageContext 表示當前頁面。解決當前頁面內數據共享問題,獲取其餘內置對象
  • request 表示一次請求。一次請求的Servlet數據共享經過請求轉發的方式,將數據流轉到下一個Servlet
  • session 表示一次會話。一個用戶發送的不一樣請求之間的數據共享,能夠將數據從一個請求流轉到其餘請求
  • application 項目內不一樣的數據共享問題,將數據從一個用戶流轉到其餘用戶

JSP的路徑

一、相對路徑 相對於當前頁面的路徑。缺點:資源的位置不能隨便修改,改了位置就訪問不到了;若是目錄結構比較深,路徑寫起來很麻煩。
page.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Page</title>
</head>
<body>
<%--使用相對路徑--%>
<a href="a/a.jsp">跳轉到a.jsp</a>
</body>
</html>

a.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a</title>
</head>
<body>
<%--使用相對路徑--%>
<a href="../page.jsp">返回到page.jsp </a>
</body>
</html>

二、絕對路徑 在請求路徑的前面加/,表示當前服務器的根路徑,使用的時候添加 /虛擬項目名稱/資源目錄/文件名
page.jsp

<body>
<%--使用絕對路徑--%>
<a href="/jsp/a/a.jsp">跳轉連接a</a>
</body>

a.jsp

<body>
this is a.jsp
<a href="/jsp/page.jsp">返回到page.jsp </a>

三、使用絕對路徑須要手動添加虛擬項目名稱,仍是比較麻煩,可使用全局路徑聲明

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
 String scheme = request.getScheme();
 String serverName = request.getServerName(); int serverPort = request.getServerPort();
 String contextPath = request.getContextPath(); String basePath = scheme+"://"+serverName+":"+serverPort+contextPath+"/";
 System.out.println(basePath);//http://localhost:8080/jsp/
%>
<html>
<head>
    <%--head頭中添加base--%>
 <base href="<%=basePath%>">
    <title>Page</title>
</head>
<body>
<%--直接寫資源路徑就能夠了--%>
<a href="a/a.jsp">跳轉到a.jsp</a>
</body>
</html>
相關文章
相關標籤/搜索