JSP全稱是Java Server Page,它和Servlet同樣,也是sun公司推出的一套開發動態web資源的技術,稱爲JSP/Servlet規範。JSP的本質其實就是一個Servlet。html
類別 | 適用場景 |
---|---|
HTML | 只能開發靜態資源,不能包含java代碼,沒法添加動態數據。 |
Servlet | 寫java代碼,能夠輸出頁面內容,可是很不方便,開發效率極低。 |
JSP | 它包括了HTML的展現技術,同時具有Servlet輸出動態資源的能力。可是不適合做爲控制器來用。 |
寫在以前: 明確JSP就是一個Servlet。是一個特殊的Servlet。java
JSP的原理:web
1)客戶端提交請求apache
2)Tomcat服務器解析請求地址瀏覽器
3)找到JSP頁面緩存
4)Tomcat將JSP頁面翻譯成Servlet的java文件tomcat
5)將翻譯好的.java文件編譯成.class文件服務器
6)返回到客戶瀏覽器上。session
Http服務器調用JSP文件步驟:
1)Http服務器將JSP文件內容編輯爲一個Servlet接口實現類(.java)
2)Http服務器將Servlet接口實現類編譯爲class文件(.class)
3)Http服務器負責建立這個class的實例對象,這個實例對象就是Servlet實例對象
4)Http服務器經過Servlet實例對象調用jspServlet方法,將JSP文件內容寫入響應體mvc
Http服務器編輯與編譯JSP文件位置:
個人計算機下是:
C:\Users\lenovo\.IntelliJIdea2019.3\system\tomcat\Tomcat_9_0_30_javaweb04\work\Catalina\localhost\ROOT\org\apache\jsp
標誌答案:
C:\Users\Windows系統用戶名\.IntelliJIdea2019.3\system\tomcat\網站工做空間\work\Catalina\localhost\ROOT\org\apache\jsp
當咱們打開index.jsp翻譯的java文件看到的就是public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
類的聲明
在Tomcat的源碼中找到HttpJspBase類的聲明,以下圖:
這張圖一出場,就代表咱們寫的JSP它本質就是一個HttpServlet了。
JSP它是一個特殊的Servlet,主要是用於展現動態數據。它展現的方式是用流把數據輸出出來,而咱們在使用JSP時,涉及HTML的部分,都與HTML的用法一致,這部分稱爲jsp中的模板元素,在開發過程當中,先寫好這些模板元素,由於它們決定了頁面的外觀。
在jsp中,可使用java腳本代碼。形式爲:<% 此處寫java代碼 %>
可是,在實際開發中,極少使用此種形式編寫java代碼。同時須要注意的是:
<% 在裏面寫java程序腳本須要注意:這裏面的內容由tomcat負責翻譯,翻譯以後是service方法的成員變量 %>
示例:
<!--Java代碼塊--> <% out.println("這是Java代碼塊");%> <hr/>
在jsp中,可使用特定表達式語法,形式爲:<%=表達式%>
jsp在翻譯完後是out.print(表達式內容);
因此:<%out.print("當前時間");%>
和<%="當前時間"%>
是同樣的。
在實際開發中,這種表達式語法用的也不多使用。
示例:
<!--JSP表達式--> <%="這是JSP表達式"%><br/> 就至關於<br/> <%out.println("這是沒有JSP表達式輸出的");%>
在JSP中也能夠聲明一些變量,方法,靜態方法,形式爲:<%! 聲明的內容 %>
使用JSP聲明須要注意:
<%! 須要注意的是: 寫在裏面的內容將會被tomcat翻譯成全局的屬性或者類方法。 %>
示例:
<!--JSP聲明--> <%! String str = "聲明語法格式";%> <%=str%>
在使用JSP時,它有本身的註釋,形式爲:<%--註釋--%>
須要注意的是:
在Jsp中可使用html的註釋,可是隻能註釋html元素,不能註釋java程序片斷和表達式。同時,被html註釋部分會參與翻譯,而且會在瀏覽器上顯示
jsp的註釋不只能夠註釋java程序片斷,也能夠註釋html元素,而且被jsp註釋的部分不會參與翻譯成.java文件,也不會在瀏覽器上顯示。
示例:
<%--JSP註釋--%> <!--HTML註釋-->
language:告知引擎,腳本使用的是java,默認是java,支持java。不寫也行。
extends:告知引擎,JSP對應的Servlet的父類是哪一個,不須要寫,也不須要改。
import:告知引擎,導入哪些包(類)。
注意:引擎會自動導入:java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*
導入的形式:
<%@page import=」java.util.Date,java.util.UUID」%>
或者:
<%@page import=」java.util.Date」%>
<%@page import=」java.util.UUID」%>
session:告知引擎是否產生HttpSession對象,便是否在代碼中調用request.getSession()。默認是true。
buffer:JspWriter用於輸出JSP內容到頁面上。告知引擎,設定他的緩存大小。默認8kb。
errorPage:告知引擎,當前頁面出現異常後,應該轉發到哪一個頁面上(路徑寫法:/表明當前應用)
小貼士:當在errorpage上使用了isErrorPage=true以後,ie8有時候不能正常顯示
配置全局錯誤頁面:web.xml
<error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page>
當使用了全局錯誤頁面,就無須再寫errorPage來實現轉到錯誤頁面,而是由服務器負責跳轉到錯誤頁面。
isErrorPage:告知引擎,是否抓住異常。若是該屬性爲true,頁面中就可使用exception對象,打印異常的詳細信息。默認值是false。
contentType:告知引擎,響應正文的MIME類型。contentType="text/html;charset=UTF-8"
至關於response.setContentType("text/html;charset=UTF-8");
pageEncoding:告知引擎,翻譯jsp時(從磁盤上讀取jsp文件)所用的碼錶。pageEncoding="UTF-8"至關於告知引擎用UTF-8讀取JSP
isELIgnored:告知引擎,是否忽略EL表達式,默認值是false,不忽略。
語法格式:<%@include file="" %>
該指令是包含外部頁面。
屬性:file,以 / 開頭,就表明當前應用。
使用示例
靜態包含的特色
語法格式:<%taglib uri="" prefix=""%>
做用:該指令用於引入外部標籤庫。html標籤和jsp標籤不用引入。
屬性:
uri
:外部標籤的URI地址。
prefix
:使用標籤時的前綴。
什麼是隱式對象呢?它指的是在jsp中,能夠不聲明就直接使用的對象。它只存在於jsp中,由於java類中的變量必需要先聲明再使用。其實jsp中的隱式對象也並不是是未聲明,只是它是在翻譯成.java文件時聲明的。因此咱們在jsp中能夠直接使用。
隱式對象名稱 | 類型 | 備註 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | Page指令能夠控制開關 |
application | javax.servlet.ServletContext | |
page | Java.lang.Object | 當前jsp對應的servlet引用實例 |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | page指令有開關 |
out | javax.servlet.jsp.JspWriter | 字符輸出流,至關於printwriter |
pageContext | javax.servlet.jsp.PageContext | 很重要 |
簡介
它是JSP獨有的對象,Servlet中沒有這個對象。自己也是一個域(做用範圍)對象,可是它能夠操做其餘3個域對象中的屬性。並且還能夠獲取其餘8個隱式對象。
生命週期
它是一個局部變量,因此它的生命週期隨着JSP的建立而誕生,隨着JSP的結束而消失。每一個JSP頁面都有一個獨立的PageContext。
經常使用方法
在上圖中,咱們發現沒有頁面域操做的方法,實際上是定義在了PageContext的父類JspContext中,以下圖所示:
域對象名稱 | 範圍 | 級別 | 備註 |
---|---|---|---|
PageContext | 頁面範圍 | 最小,只能在當前頁面用 | 因範圍過小,開發中用的不多 |
ServletRequest | 請求範圍 | 一次請求或當期請求轉發用 | 當請求轉發以後,再次轉發時請求域丟失 |
HttpSession | 會話範圍 | 屢次請求數據共享時使用 | 屢次請求共享數據,但不一樣的客戶端不能共享 |
ServletContext | 應用範圍 | 最大,整個應用均可以使用 | 儘可能少用,若是對數據有修改須要作同步處理 |
Servlet:擅長處理業務邏輯,不擅長輸出顯示界面。在web開發中多用於控制程序邏輯(流程)。因此咱們稱之爲:控制器。
JSP:擅長顯示界面,不擅長處理程序邏輯。在web開發中多用於展現動態界面。因此咱們稱之爲:視圖。
例如:
M:model ,一般用於封裝數據,封裝的是數據模型。
V:view ,一般用於展現數據。動態展現用jsp頁面,靜態數據展現用html。
C:controller ,一般用於處理請求和響應。通常指的是Servlet。
建立一個web項目,在 web 目錄下建立一個 index.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>學生管理系統首頁</title> </head> <body> <%-- 獲取會話域中的數據 若是獲取到了則顯示添加和查看功能的超連接 若是沒獲取到則顯示登陸功能的超連接 --%> <% Object username = session.getAttribute("username"); if(username == null) { %> <a href="/stu/login.jsp">請登陸</a> <%} else {%> <a href="/stu/addStudent.jsp">添加學生</a> <a href="/stu/listStudentServlet">查看學生</a> <%}%> </body> </html>
在 web 目錄下建立一個 login.jsp。實現登陸頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>學生登陸</title> </head> <body> <form action="/stu/loginStudentServlet" method="get" autocomplete="off"> 姓名:<input type="text" name="username"> <br> 密碼:<input type="password" name="password"> <br> <button type="submit">登陸</button> </form> </body> </html>
建立 LoginStudentServlet,獲取用戶名和密碼
package com.itheima.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /* 學生登陸 */ @WebServlet("/loginStudentServlet") public class LoginStudentServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.獲取用戶名和密碼 String username = req.getParameter("username"); String password = req.getParameter("password"); //2.判斷用戶名 if(username == null || "".equals(username)) { //2.1用戶名爲空 重定向到登陸頁面 resp.sendRedirect("/stu/login.jsp"); return; } //2.2用戶名不爲空 將用戶名存入會話域中 req.getSession().setAttribute("username",username); //3.重定向到首頁index.jsp resp.sendRedirect("/stu/index.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
在 web 目錄下建立一個 addStudent.jsp,實現添加學生的表單項
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>添加學生</title> </head> <body> <form action="/stu/addStudentServlet" method="get" autocomplete="off"> 學生姓名:<input type="text" name="username"> <br> 學生年齡:<input type="number" name="age"> <br> 學生成績:<input type="number" name="score"> <br> <button type="submit">保存</button> </form> </body> </html>
建立 AddStudentServlet,獲取學生信息並保存到文件中
package com.itheima.servlet; import com.itheima.bean.Student; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; /* 實現添加功能 */ @WebServlet("/addStudentServlet") public class AddStudentServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.獲取表單中的數據 String username = req.getParameter("username"); String age = req.getParameter("age"); String score = req.getParameter("score"); //2.建立學生對象並賦值 Student stu = new Student(); stu.setUsername(username); stu.setAge(Integer.parseInt(age)); stu.setScore(Integer.parseInt(score)); //3.將學生對象的數據保存到d:\\stu.txt文件中 BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\stu.txt",true)); bw.write(stu.getUsername() + "," + stu.getAge() + "," + stu.getScore()); bw.newLine(); bw.close(); //4.經過定時刷新功能響應給瀏覽器 resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write("添加成功。2秒後自動跳轉到首頁..."); resp.setHeader("Refresh","2;URL=/stu/index.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
建立 ListStudentServlet,讀取文件中的學生信息到集合中
一、將集合添加到會話域中 二、重定向到 listStudent.jsp 頁面上
package com.itheima.servlet; import com.itheima.bean.Student; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; /* 實現查看功能 */ @WebServlet("/listStudentServlet") public class ListStudentServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.建立字符輸入流對象,關聯讀取的文件 BufferedReader br = new BufferedReader(new FileReader("d:\\stu.txt")); //2.建立集合對象,用於保存Student對象 ArrayList<Student> list = new ArrayList<>(); //3.循環讀取文件中的數據,將數據封裝到Student對象中。再把多個學生對象添加到集合中 String line; while((line = br.readLine()) != null) { //張三,23,95 Student stu = new Student(); String[] arr = line.split(","); stu.setUsername(arr[0]); stu.setAge(Integer.parseInt(arr[1])); stu.setScore(Integer.parseInt(arr[2])); list.add(stu); } //4.將集合對象存入會話域中 req.getSession().setAttribute("students",list); //5.重定向到學生列表頁面 resp.sendRedirect("/stu/listStudent.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
在 web 目錄下建立一個 listStudent.jsp
<%@ page import="com.itheima.bean.Student" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>查看學生</title> </head> <body> <table width="600px" border="1px"> <tr> <th>學生姓名</th> <th>學生年齡</th> <th>學生成績</th> </tr> <% ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students"); for(Student stu : students) { %> <tr align="center"> <td><%=stu.getUsername()%></td> <td><%=stu.getAge()%></td> <td><%=stu.getScore()%></td> </tr> <%}%> </table> </body> </html>