【精選】JSP技術知識點大合集
JSP簡介

JSP介紹
JSP(全稱Java Server Pages)Java服務端頁面技術,是JavaEE平臺下的技術規范。它允許使用特定的標簽在HTML網頁中插入Java代碼,實現動態頁面處理,所以JSP就是HTML與Java代碼的復合體。JSP技術可以快速的實現一個頁面的開發,相比在Servlet中實現頁面開發將變得更加容易。
常見的視圖層技術
HTML、JSP、Thymeleaf等。
前后端分離開發方式
在前后端分離的項目中真正可以做到“術業有專攻”(開發人員分離) 。前后端分離開發方式中前端頁面由專業團隊完成頁面的開發,并通過請求調用后端的api接口進行數據交互。在開發前端頁面的團隊中更多關注的技術如:html、CSS、jQuery、Vue、Nodejs等前端技術。前端追求的是:頁面表現,速度流暢,兼容性,用戶體驗等等。而后端團隊則更多的是業務的具體實現。在后端開發的團隊中更多關注的技術如:==設計模式、分布式架構、微服務架構、數據庫的操作、Java的性能優化以及數據庫優化等技術。==前后端分離已成為互聯網項目開發的業界標準使用方式,特別是為大型分布式架構、彈性計算架構、微服務架構、多端化服務(多種客戶端,例如:瀏覽器,車載終端,安卓,IOS等等)打下堅實的基礎。
JSP運行原理

JSP技術特點
JSP和Servlet是本質相同的技術。當一個JSP文件第一次被請求時,JSP引擎會將該JSP編譯成一個Servlet,并執行這個Servlet。如果JSP文件被修改了,那么JSP引擎會重新編譯這個JSP。
JSP引擎對JSP編譯時會生成兩個文件分別是.java的源文件以及編譯后的.class文件,并放到Tomcat的work目錄的Catalina對應的虛擬主機目錄中的org\apache\jsp目錄中。兩個文件的名稱會使用JSP的名稱加”_jsp”表示。如:index_jsp.java、index_jsp.class
JSP與Servlet區別
-
JSP以源文件形式部署到容器中。而Servlet需要編譯成class文件后部署到容器中。
-
JSP部署到web項目的根目錄下或根目錄下的其他子目錄和靜態同資源位于相同位置。而Servlet需要部署到WEB-INF/classes目錄中。
-
JSP中的HTML代碼會被JSP引擎放入到Servlet的
out.write()方法中。而在Servlet中我們需要自己通過對字符流輸出流的操作生成響應的頁面。 -
JSP更擅長表現于頁面顯示,Servlet更擅長于邏輯控制。
JSP標簽的使用
原始標簽
JSP的三種原始標簽
JSP的原始標簽在JSP的任何版本中都可以使用。
<%! %> 聲明標簽
聲明標簽用于在JSP中定義成員變量與方法的定義。標簽中的內容會出現在JSP被編譯后的Servlet的class的**{ }**中。
//<%! %>聲明標簽
<%!
int a =10;
int add(int a,int b){
return a+b;
}
%>
<% %>腳本標簽
腳本標簽用于在JSP中編寫業務邏輯。標簽中的內容會出現在JSP被編譯后的Servlet的_jspService方法體中。
//腳本標簽
<%
int b=10;
%>
<%= %>賦值標簽
賦值標簽用于在JSP中做內容輸出。標簽中的內容會出現在_jspService方法的out.print()方法的參數中。注意我們在使用賦值標簽時不需要在代碼中添加 ”;”。
//賦值標簽
<%=a%>
<%=b%>
JSP原始標簽的使用
需求:以20%概率顯示你中獎了。
<%@ page import="java.util.Random" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int flag = new Random().nextInt(100);
if(flag<=20){
%>
中獎了<%=flag%>
<%}else {%>
沒中獎<%=flag%>
<%}%>
</body>
</html>
JSP的指令標簽
JSP指令標簽的作用是聲明JSP頁面的一些屬性和動作。
<%@指令名稱 屬性=“值” 屬性=“值1,值2…”%>
JSP指令標簽分類
Page指令標簽
contentType
設置響應類型和編碼。
pageEncoding
設置頁面的編碼。
import
導入所需要的包。
language
當前JSP頁面里面可以嵌套的語言。
session
設置JSP頁面是否獲取session內置對象。
buffer
設置JSP頁面的流的緩沖區的大小。
autoFlush
是否自動刷新。
exends
聲明當前JSP的頁面繼承于那個類.必須繼承的是httpservlet 及其子類。
isELIgnored
是否忽略el表達式。
errorPage
當前JSP頁面出現異常的時候要跳轉到的JSP頁面。
isErrorPage
當前JSP頁面是否是一個錯誤頁面。若值為true,可以使用JSP頁面的一個內置對象 exception。
Include指令標簽
靜態包含,可以將其他頁面內容包含進來,一起進行編譯運行.生成一個java文件.
<%@include file=“被包含JSP的相對路徑” %>
Taglib指令標簽
導入標簽庫。
<%@taglib prefix=“前綴名” uri=“名稱空間” %>
JSP的內置對象
JSP中一共預先定義了9個這樣的對象,分別為:request、response、session、application、out、pagecontext、config、page、exception。
request對象
request 對象是 HttpServletRequest類型的對象。
response對象
response 對象是 HttpServletResponse類型的對象。
session對象
session 對象是HttpSession類型的對象。只有在包含 session=“true” 的頁面中才可以被使用。
application對象
application 對象是ServletContext類型的對象。
config 對象
config 對象是ServletConfig類型的對象。
out 對象
out 對象是JspWriter類型的對象。
pageContext 對象
是JSP的上下文對象,pageContext 對象是PageContext類型的對象。作用是取得任何范圍的參數,==通過它可以獲取 JSP頁面的out、request、reponse、session、application 等對象。==pageContext對象的創建和初始化都是由容器來完成的,在JSP頁面中可以直接使用 pageContext對象。
page 對象
page 對象代表JSP本身。
exception 對象
exception 對象的作用是顯示異常信息,只有在包含 isErrorPage="true" 的頁面中才可以被使用。
請求轉發
什么是請求轉發
請求轉發是服務端的一種請求方式,相當于在服務端中直接請求某個資源。
RequestDispatcher dispatcher = request.getRequestDispatcher("/test.jsp");
dispatcher.forward(request,response);
簡寫方式:
request.getRequestDispatcher("/test.jsp").forword(request,response);
請求轉發與重定向的區別
- 請求轉發對于客戶端瀏覽器而言是在一次請求與響應中完成,而重定向是在兩次請求兩次響應中完成。
- 請求轉發并不會改變客戶端瀏覽器的地址欄中的內容。而重定向會改變客戶端瀏覽器地址欄中的內容。
- 請求轉發可以使用request對象傳遞數據,而重定向不能使用request對象傳遞數據。
- 如果是處理的DML操作,建議使用重定向方式為客戶端瀏覽器產生響應,可以解決表單重復提交現象。
## JSP中的四大作用域對象
作用域:“數據共享的范圍”,也就是說數據能夠在多大的范圍內有效。
| 對象名稱 | 作用范圍 |
| ----------- | ---------------- |
| application | 整個應用都有效 |
| session | 在當前會話中有效 |
| request | 在當前請求中有效 |
| page | 在當前頁面有效 |
## JSTL標簽庫
### 什么是JSTL標簽庫
JSTL(Java server pages standard tag library,即JSP標準標簽庫)JSTL標簽是基于JSP頁面的。這些標簽可以插入在JSP代碼中,本質上JSTL也是提前定義好的一組標簽,這些標簽封裝了不同的功能,在頁面上調用標簽時,就等于調用了封裝起來的功能。JSTL的目標是使JSP頁面的可讀性更強、簡化JSP頁面的設計、實現了代碼復用、提高效率。
在JSP2.0版本后開始支持JSTL標簽庫。在使用JSTL標簽庫時需要在JSP中添加對應的taglib指令標簽。
```jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL標簽分類
根據JSTL標簽所提供的功能,可以將其分為5個類別。
核心標簽
最常用、最重要,也是最基本的標簽
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
格式化標簽
JSTL格式化標簽用來格式化并輸出文本、日期、時間、數字。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL標簽
JSTL SQL標簽庫提供了與關系型數據庫(Oracle,MySQL,SQL Server等等)進行交互的標簽。
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
XML標簽
JSTL XML標簽庫提供了創建和操作XML文檔的標簽。
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
JSTL函數
JSTL包含一系列標準函數,大部分是通用的字符串處理函數。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
EL表達式
什么是EL表達式
EL(Expression Language)是一種表達式語言。是為了使JSP寫起來更加簡單,減少java代碼,可以使得獲取存儲在Java對象中的數據變得非常簡單。在JSP2.0版本后開始支持EL表達式。
語法結構
${表達式}
${對象.屬性名}
EL表達式中的操作符
| 操作符 | 描述 |
|---|---|
| ( ) | 優先級 |
| + | 加 |
| - | 減或負 |
| * | 乘 |
| / 或div | 除 |
| % 或 mod | 取模 |
| == 或 eq | 測試是否相等 |
| != 或 ne | 測試是否不等 |
| < 或 lt | 測試是否小于 |
| > 或gt | 測試是否大于 |
| <= or le | 測試是否小于等于 |
| >= 或 ge | 測試是否大于等于 |
| && 或 and | 測試邏輯與 |
| || 或 or | 測試邏輯或 |
| ! 或not | 測試取反 |
| empty | 測試是否空值 |
EL表達式的隱含對象
| 隱含對象 | 描述 |
|---|---|
| pageScope | page 作用域 |
| requestScope | request 作用域 |
| sessionScope | session 作用域 |
| applicationScope | application 作用域 |
| param | Request 對象的參數,字符串 |
| paramValues | Request對象的參數,字符串集合 |
| header | HTTP 信息頭,字符串 |
| headerValues | HTTP 信息頭,字符串集合 |
| initParam | 上下文初始化參數 |
| cookie | Cookie值 |
| pageContext | 當前頁面的pageContext |
使用EL表達式取出作用域中的值
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
獲取作用域屬性中的數據時,也可以只寫屬性名,EL表達式會按照pageScope、requestScope、sessionScope、applicationScope的順序查找該屬性的值。
${name}
JSTL標簽庫與EL表達式的使用
JSTL標簽庫的使用步驟
- 添加jstl.jar
- 在JSP頁面中添加taglib指令標簽。
JSTL核心標簽的使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
< c : if >
標簽判斷表達式的值,如果表達式的值為 true 則執行其主體內容。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:if test="${1==1}">
Hello,JSTL
</c:if>
</body>
</html>
< c:choose >, < c:when >, < c:otherwise >
< c:choose >標簽與Java switch語句的功能一樣,用于在眾多選項中做出選擇。
switch語句中有case,而< c:choose >標簽中對應有< c:when >,switch語句中有default,而< c:choose >標簽中有< c:otherwise >。
如果有多個
< c:when >條件都滿足,則返回第一個< c:when >條件對應的內容,如果都不滿足,則返回< c:otherwise >條件中的內容!
< c:forEach >
迭代器,用于迭代集合。
| 屬性 | 描述 |
|---|---|
| items | 被迭代的集合 |
| begin | 迭代器的起始因子 |
| end | 迭代器的結束因子 |
| step | 迭代因子的增長數 |
| var | 代表當前迭代元素的變量名稱 |
| varStatus | 代表循環狀態的變量名稱 |
| varStatus 屬性 | |
|---|---|
| current | 當前這次迭代的(集合中的)項 |
| index | 當前這次迭代從 0 開始的迭代索引 |
| count | 當前這次迭代從 1 開始的迭代計數 |
| first | 用來表明當前這輪迭代是否為第一次迭代的標志 |
| last | 用來表明當前這輪迭代是否為最后一次迭代的標志 |
| begin | 屬性值 |
| end | 屬性值 |
| step | 屬性值 |
<c:forEach begin="0" end="9" step="2" varStatus="shuxin">
forEach......${shuxin.count} ${shuxin.first} ${shuxin.last} ${shuxin.index}<br/>
</c:forEach>
使用ForEach迭代List
需求:
創建Users對象,含有userid,username屬性。
創建一個Servlet,在Servlet中創建多個Users對象并放到List集合中,在showUsers.jsp的頁面中顯示所有的Users對象的信息。
Users對象
public class Users {
private Integer userid;
private String username;
public Users() {
}
public Users(Integer userid, String username) {
this.userid = userid;
this.username = username;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
FindUsersServlet
@WebServlet("/findUser.do")
public class FindUsersServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//創建Users對象
Users users1=new Users(1,"zhangsan");
Users users2=new Users(2,"lisi");
//實例化List容器
List<Users> list = new ArrayList<>();
list.add(users1);
list.add(users2);
//將list傳入到Request對象中
req.setAttribute("list",list);
//通過請求轉發的方式調用JSP渲染頁面
req.getRequestDispatcher("showUser.jsp").forward(req,resp);
}
}
showUsers.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" align="center">
<tr>
<th>用戶ID</th>
<th>用戶名</th>
</tr>
<c:forEach items="${requestScope.list}" var="users">
<tr>
<td>${users.userid}</td>
<td>${users.username}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
使用ForEach迭代Map
需求:
創建Users對象,含有userid,username屬性。
創建一個Servlet,在Servlet中創建多個Users對象并放到Map集合中,在showUsers2.jsp的頁面中顯示所有的Users對象的信息。
FindUsersServlet2
@WebServlet("/findUsers2.do")
public class FindUsers2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//創建Users對象
Users users1=new Users(1,"zhangsan");
Users users2=new Users(2,"lisi");
//實例化Map容器
Map<String,Users> map = new HashMap<>();
map.put("users1",users1);
map.put("users2",users2);
//將Map傳入到Request對象中
req.setAttribute("map",map);
//通過請求轉發的方式調用JSP渲染頁面
req.getRequestDispatcher("showUser2.jsp").forward(req,resp);
}
}
showUsers2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" align="center">
<tr>
<th>Map的key</th>
<th>用戶ID</th>
<th>用戶名</th>
</tr>
<c:forEach items="${requestScope.map}" var="users">
<tr>
<td>${users.key}</td>
<td>${users.value.userid}</td>
<td>${users.value.username}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
JSTL格式化標簽的使用
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
對日期的格式化處理
<fmt:formatDate value="${data}" pattern="yyyy-MM-dd"/>
對數字格的式化處理
<fmt:formatNumber value="${balance}" type="currency"/>
@WebServlet("/format.do")
public class FormatServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("date",new Date());
req.setAttribute("number",18613453.4868);
req.getRequestDispatcher("format.jsp").forward(req,resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.date}
<hr/>
<fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd" />
<hr/>
<fmt:formatNumber value="${requestScope.number}" type="currency"/>
</body>
</html>
MVC模式
什么是MVC模式
MVC模式:Model、View、Controller即模型、視圖、控制器。是軟件的一種架構模式(Architecture pattern)。MVC要實現的目標是將軟件的用戶界面和業務邏輯分離,可提高代碼可擴展性、可復用性、可維護性、以及靈活性。
View(視圖):用戶的操作界面。如:html、jsp。
Model(模型):具體的業務模型與數據模型。如:service、dao、pojo。
Controller(控制):處理從視圖層發送的請求,并選取模型層的業務模型完成響應的業務實現,并產生響應。如:Servlet。
MVC模式與應用程序分層的區別
MVC模式是一種軟件的架構方式,而應用程序分層這是一種代碼的組織方式。MVC模式與應用程序分層的目標都是一致的:為了解耦和、提高代碼復用性。
浙公網安備 33010602011771號