本質:JSP就是Servlet,JSP也是Java類,經過JSP引擎將JSP轉譯成Servlethtml
瀏覽器請求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
一、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" %>
二、局部代碼塊
能夠將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
六、forward請求轉發服務器
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頁面在轉譯成對應Servlet文件時,會自動聲明一些對象,在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>