9. jsp
9.1 什么是JSP
Java Server Pages : Java服務器端頁面,也和Servlet一樣,用于動態web技術!
最大的特點:
- 寫Jsp就像寫HTML
- 區別:
- HTML只給用戶提供靜態的資料
- JSP頁面中可以嵌套Java代碼,為用戶提供動態資料
9.2 jSP原理
思路: JSP到底怎么執行的!
-
代碼層面沒有任何問題
-
服務器內部 作業
tomcat 中有一個work目錄
idea中使用tomcat會在idea中產生一個work目錄
這個是 idea tomcat的作業空間

路徑:
C:\Users\40875\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_Javaweb-cookie-session\work\Catalina\localhost\Javaweb_cookie_session_war\org\apache\jsp
發現 頁面轉換成了Java程式

瀏覽器向服務器發送請求,不管訪問什么資源,起始都是在訪問Servlet
JSP最終也會被轉換成為一個Java類
JSP本質上就是一個Servlet
//初始化
public void _jspInit() {
}
//銷毀
public void _jspDestroy() {
}
//JSPServlet
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
-
判斷請求
-
內置物件
final javax.servlet.jsp.PageContext pageContext; //頁面背景關系 javax.servlet.http.HttpSession session = null; // session final javax.servlet.ServletContext application; //application final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWriter out = null; //out final java.lang.Object page = this; //page 當前 HttpServletRequest req // request 請求 HttpServletResponse resp //respones 回應 -
輸出頁面前增加的代碼
// 設定回應的頁面型別 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;以上的這些個物件我們可以在JSP頁面中直接使用
jsp原理圖

在JSP頁面中;
只要是Java代碼就會原封不動的輸出
如果是HTML代碼,就會被轉換
out.print("<html>\t\n")
這樣的格式,輸出到前端
9.3 JSP基礎語法
任何語言都有自己的語法,Java中有,JSP作為Java技術的一種應用,它擁有一些自己的擴容的語法,Java所有語法都支持
JSP運算式
<%--JSP運算式
作用:用來將程式的輸出,輸出到客戶端
--%>
<%=變數或者運算式%>
<% new java.util.Date()%>
jsp 腳本片段
<%
int sum=0;
for (int i = 0; i <=100 ; i++) {
sum+=i;
}
out.write("<h1>"+sum+"</h1>");
%>
腳本片段的實作
<%
int x=10;
out.print(x);
%>
<p>這是一個JSP檔案</p>
<%
int y=20;
out.print(y);
%>
<hr>
<%-- 在代碼嵌套HTML元素--%>
<%
for (int i = 0; i <5 ; i++) {
%>
<h1>hellow world <%=i%></h1>
<%
}
%>
JSP宣告
<%!
static {
System.out.println("Loading Servlet!");
}
private int globaVar=0;
public void aaa(){
System.out.println("進入了aaa方法");
}
%>
JSP宣告: 會被編譯到JSP生成Java類中! 其他的,就會被生成到 _jspService 方法中
在JSP中嵌入Java代碼即可
<%%>
<%=%>
<%!%>
<%--注釋--%>
jsp的注釋,不會在客戶端顯示,HTML就會
9.4 JSP指令
<%-- @include會將兩個頁面合二為一--%>
<%@include file="common/header.jsp" %>
<h1>我是網頁的正文</h1>
<%@include file="common/footer.jsp" %>
<hr>
<%--jsp標簽
jsp:include :拼接頁面 本質還是三個
--%>
<jsp:include page="/common/header.jsp"/>
<h1>我是網頁的正文</h1>
<jsp:include page="common/footer.jsp"/>
總結:
在實際開發中建議使用 下面 jsp:include/的方式
如果使用上面那一種的話 如果在header.jsp或者在footer.jsp中宣告了 int a=1; 又在當前jsp中宣告了相同的變數 在jsp頁面不會報錯,去了瀏覽器里面 就報錯了,
所以建議使用 jsp標簽 進行頁面拼接
9.5 九大內置物件
- PageContext 存東西
- Request 存東西
- Response
- Session 存東西
- Application 【ServletContext 】 存東西
- config 【ServletConfig】
- out
- page
- exception
<%
pageContext.setAttribute("name1","波波1"); //保存的資料只在一個頁面中有效
request.setAttribute("name2","波波2"); //保存的資料只在一個請求中有效 轉發可以攜帶請求
session.setAttribute("name3","波波3"); // 保存的資料只在一個會話中有效 瀏覽器關倍訓話停止
application.setAttribute("name4","波波4"); //保存的資料只在服務器中生效 從打開服務器到關閉服務器
%>
request:客戶端向服務器發送請求,產生的資料,用戶看完了就沒作用了,比如:新聞 用戶看完了沒作用了,
session:客戶端向服務器發送請求,產生的資料,用戶用完了一會還有用,比如:購物車;
application:客戶端向服務器發送請求,產生的資料,一個用戶用完了,其他用戶還可能使用:比如:聊天資料;
9.6 JSP標簽 JSTL標簽 EL運算式
開始之前匯入所學的依賴
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL運算式: ${ }
- 獲取資料
- 執行運算
- 獲取web開發的常用物件
JSP 標簽
發送:
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>111</h1>
<jsp:forward page="bbb.jsp">
<jsp:param name="name" value="aaabbb"/>
<jsp:param name="age" value="18"/>
</jsp:forward>
</body>
</html>
接收:
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>222</h2>
姓名:<%= request.getParameter("name") %>
年齡:<%= request.getParameter("age") %>
</body>
</html>
JSTL 運算式
JSTL運算式的使用就是為了彌補HTML標簽的不足;它自定義許多標簽,供我們使用,標簽的功能和Java代碼一樣
核心標簽

JSTL 標簽庫使用步驟
- 引入對應的taglib
- 使用其中的方法
- 在Tomcat也需要引入jstl的包,否則會報錯
c:if
<%@ 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>
<h1>測驗</h1>
<form action="ccc.jsp" method="get">
<%--
EL運算式 獲取表單中的資料
${param.引數名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登錄">
</form>
<%--判斷如果提交用戶是管理員 則登錄成功--%>
<c:if test="${param.username=='admin'}" var="isadmin">
<c:out value="管理員歡迎您!"></c:out>
</c:if>
<c:out value="${isadmin}"></c:out>
</body>
</html>
c:choose c:when
<%@ 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>
<%--定義一個變數Score 值為55--%>
<c:set var="score" value="55"/>
<c:choose>
<c:when test="${score>=90}">
優秀
</c:when>
<c:when test="${score>=80}">
良好
</c:when>
<c:when test="${score>=70}">
一般
</c:when>
<c:when test="${score<=60}">
不及格
</c:when>
</c:choose>
</body>
</html>
c:forEach
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<String> people=new ArrayList();
people.add(0,"1");
people.add(1,"2");
people.add(2,"3");
people.add(3,"4");
people.add(4,"5");
people.add(5,"6");
request.setAttribute("list",people);
%>
<%--
var 每一次遍歷出來的變數
itmes 要遍歷的物件
begin 哪里開始
end 到哪里結束
step 步長
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"></c:out> <br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="5" step="1">
<c:out value="${people}"></c:out> <br>
</c:forEach>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277017.html
標籤:java
