8、JSP 8.1、什麼是JSP Java Server Pages : Java伺服器端頁面,也和Servlet一樣,用於動態Web技術! 最大的特點: 寫JSP就像在寫HTML 區別: HTML只給用戶提供靜態的數據 JSP頁面中可以嵌入JAVA代碼,為用戶提供動態數據; 8.2、JSP原理 思 ...
8、JSP
8.1、什麼是JSP
Java Server Pages : Java伺服器端頁面,也和Servlet一樣,用於動態Web技術!
最大的特點:
- 寫JSP就像在寫HTML
- 區別:
- HTML只給用戶提供靜態的數據
- JSP頁面中可以嵌入JAVA代碼,為用戶提供動態數據;
8.2、JSP原理
思路:JSP到底怎麼執行的!
代碼層面沒有任何問題
伺服器內部工作
tomcat中有一個work目錄;
IDEA中使用Tomcat的會在IDEA的tomcat中生產一個work目錄
我電腦的地址:
C:\Users\Administrator\.IntelliJIdea2018.1\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp
發現頁面轉變成了Java程式!
瀏覽器向伺服器發送請求,不管訪問什麼資源,其實都是在訪問Servlet!
JSP最終也會被轉換成為一個Java類!
JSP 本質上就是一個Servlet
//初始化
public void _jspInit() {
}
//銷毀
public void _jspDestroy() {
}
//JSPService
public void _jspService(.HttpServletRequest request,HttpServletResponse response)
判斷請求
內置一些對象
final javax.servlet.jsp.PageContext pageContext; //頁面上下文 javax.servlet.http.HttpSession session = null; //session final javax.servlet.ServletContext application; //applicationContext final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWriter out = null; //out final java.lang.Object page = this; //page:當前 HttpServletRequest request //請求 HttpServletResponse response //響應
輸出頁面前增加的代碼
response.setContentType("text/html"); //設置響應的頁面類型 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頁面中;
只要是 JAVA代碼就會原封不動的輸出;
如果是HTML代碼,就會被轉換為:
out.write("<html>\r\n");
這樣的格式,輸出到前端!
8.3、JSP基礎語法
任何語言都有自己的語法,JAVA中有,。 JSP 作為java技術的一種應用,它擁有一些自己擴充的語法(瞭解,知道即可!),Java所有語法都支持!
JSP表達式
<%--JSP表達式
作用:用來將程式的輸出,輸出到客戶端
<%= 變數或者表達式%>
--%>
<%= new java.util.Date()%>
jsp腳本片段
<%--jsp腳本片段--%>
<%
int sum = 0;
for (int i = 1; i <=100 ; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
腳本片段的再實現
<%
int x = 10;
out.println(x);
%>
<p>這是一個JSP文檔</p>
<%
int y = 2;
out.println(y);
%>
<hr>
<%--在代碼嵌入HTML元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>Hello,World <%=i%> </h1>
<%
}
%>
JSP聲明
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar = 0;
public void kuang(){
System.out.println("進入了方法Kuang!");
}
%>
JSP聲明:會被編譯到JSP生成Java的類中!其他的,就會被生成到_jspService方法中!
在JSP,嵌入Java代碼即可!
<%%>
<%=%>
<%!%>
<%--註釋--%>
JSP的註釋,不會在客戶端顯示,HTML就會!
8.4、JSP指令
<%@page args.... %>
<%@include file=""%>
<%--@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"/>
8.5、9大內置對象
- PageContext 存東西
- Request 存東西
- Response
- Session 存東西
- Application 【SerlvetContext】 存東西
- config 【SerlvetConfig】
- out
- page ,不用瞭解
- exception
pageContext.setAttribute("name1","秦疆1號"); //保存的數據只在一個頁面中有效
request.setAttribute("name2","秦疆2號"); //保存的數據只在一次請求中有效,請求轉發會攜帶這個數據
session.setAttribute("name3","秦疆3號"); //保存的數據只在一次會話中有效,從打開瀏覽器到關閉瀏覽器
application.setAttribute("name4","秦疆4號"); //保存的數據只在伺服器中有效,從打開伺服器到關閉伺服器
request:客戶端向伺服器發送請求,產生的數據,用戶看完就沒用了,比如:新聞,用戶看完沒用的!
session:客戶端向伺服器發送請求,產生的數據,用戶用完一會還有用,比如:購物車;
application:客戶端向伺服器發送請求,產生的數據,一個用戶用完了,其他用戶還可能使用,比如:聊天數據;
8.6、JSP標簽、JSTL標簽、EL表達式
<!-- JSTL表達式的依賴 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard標簽庫 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表達式: ${ }
- 獲取數據
- 執行運算
- 獲取web開發的常用對象
JSP標簽
<%--jsp:include--%>
<%--
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="kuangshen"></jsp:param>
<jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
JSTL表達式
JSTL標簽庫的使用就是為了彌補HTML標簽的不足;它自定義許多標簽,可以供我們使用,標簽的功能和Java代碼一樣!
格式化標簽
SQL標簽
XML 標簽
核心標簽 (掌握部分)
JSTL標簽庫使用步驟
- 引入對應的 taglib
- 使用其中的方法
- 在Tomcat 也需要引入 jstl的包,否則會報錯:JSTL解析錯誤
c:if
<head>
<title>Title</title>
</head>
<body>
<h4>if測試</h4>
<hr>
<form action="coreif.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:if>
<%--自閉合標簽--%>
<c:out value="${isAdmin}"/>
</body>
c:choose c:when
<body>
<%--定義一個變數score,值為85--%>
<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>
c:forEach
<%
ArrayList<String> people = new ArrayList<>();
people.add(0,"張三");
people.add(1,"李四");
people.add(2,"王五");
people.add(3,"趙六");
people.add(4,"田六");
request.setAttribute("list",people);
%>
<%--
var , 每一次遍歷出來的變數
items, 要遍歷的對象
begin, 哪裡開始
end, 到哪裡
step, 步長
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/> <br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
<c:out value="${people}"/> <br>
</c:forEach>
9、JavaBean
實體類
JavaBean有特定的寫法:
- 必須要有一個無參構造
- 屬性必須私有化
- 必須有對應的get/set方法;
一般用來和資料庫的欄位做映射 ORM;
ORM :對象關係映射
- 表--->類
- 欄位-->屬性
- 行記錄---->對象
people表
id | name | age | address |
---|---|---|---|
1 | 秦疆1號 | 3 | 西安 |
2 | 秦疆2號 | 18 | 西安 |
3 | 秦疆3號 | 100 | 西安 |
class People{
private int id;
private String name;
private int id;
private String address;
}
class A{
new People(1,"秦疆1號",3,"西安");
new People(2,"秦疆2號",3,"西安");
new People(3,"秦疆3號",3,"西安");
}
- 過濾器
- 文件上傳
- 郵件發送
- JDBC 複習 : 如何使用JDBC , JDBC crud, jdbc 事務
10、MVC三層架構
什麼是MVC: Model view Controller 模型、視圖、控制器
10.1、早些年
用戶直接訪問控制層,控制層就可以直接操作資料庫;
servlet--CRUD-->資料庫
弊端:程式十分臃腫,不利於維護
servlet的代碼中:處理請求、響應、視圖跳轉、處理JDBC、處理業務代碼、處理邏輯代碼
架構:沒有什麼是加一層解決不了的!
程式猿調用
|
JDBC
|
Mysql Oracle SqlServer ....
10.2、MVC三層架構
Model
- 業務處理 :業務邏輯(Service)
- 數據持久層:CRUD (Dao)
View
- 展示數據
- 提供鏈接發起Servlet請求 (a,form,img…)
Controller (Servlet)
接收用戶的請求 :(req:請求參數、Session信息….)
交給業務層處理對應的代碼
控制視圖的跳轉
登錄--->接收用戶的登錄請求--->處理用戶的請求(獲取用戶登錄的參數,username,password)---->交給業務層處理登錄業務(判斷用戶名密碼是否正確:事務)--->Dao層查詢用戶名和密碼是否正確-->資料庫