java學習day33---servlet(中)
由於使用serlvet生成html標籤,程式碼難以維護,可讀性差,容易出錯,所以引入jsp,用於生成HTML標籤
1. jsp
java server page
用途:主要用來生成html標籤
在表現形式上類似於html 但多了一行
<%@ page contentType="text/html;charset=utf-8" %>
上面的程式碼稱為 page 指令,主要作用就是指明此頁面是一個jsp頁面,並且通過contentType說明他的字元編碼和格式
jsp 中有
1). 指令: `<%@ 指令名 %>`
2). 指令碼: `<% 可以是任意java程式碼 %>`
3). 表示式: `<%= 表示式 %>` 把執行結果顯示在頁面上
<%-- Created by IntelliJ IDEA. User: Szy Date: 2018/10/15 Time: 15:54 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%-- 下面是jsp指令碼,用於寫java程式碼 --%> <% int i = 10; java.util.Date date = new java.util.Date(); %> <%-- jsp表示式 --%> <%= i%> <br> <%= date%> </body> </html>
執行結果:
2. el表示式語言
expression language 在jsp用來展示結果的語言
語法 ${ 表示式語言 }
要用el表示式顯示覆雜的內容,需要把內容提前放入`作用域`, el再從`作用域`中把內容取出來顯示
pageContext.setAttribute("名稱", Object); // 把內容起一個名字放入作用域
使用通過EL表示式 ${pageScope.名稱} 進行呼叫
el表示式可以通過
${物件.屬性名} 但這裡的屬性名,依據是物件的get方法,而不是私有屬性名
把get方法中get去掉(或把is方法的is去掉),剩餘的單詞首字母小寫,作為物件的屬性名,例如
getName() ==> name
getUsername() ==> username
getHelloWorld() ==> helloWorld
isClose() ==> close
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2018/9/9
Time: 16:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,westos.Dept" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- ctrl+shift+/ -->
<%--<%
List<Dept> list = new ArrayList<>();
list.add(new Dept(10, "部門1", "北京"));
list.add(new Dept(20, "部門2", "天津"));
list.add(new Dept(30, "部門3", "上海"));
list.add(new Dept(40, "部門4", "西安"));
// 將集合放入作用域
pageContext.setAttribute("list", list);
%>--%>
<!-- 4)利用標籤和el表示式顯示資料 -->
<table border="1" width="100%">
<tbody>
<c:forEach items="${aaa}" var="d">
<tr>
<td>${d.deptno}</td>
<td>${d.name}</td>
<td>${d.loc}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
執行結果:
3. JSTL
java 標準標籤庫
java standard tag library
主要的工具就是配合el表示式,實現迴圈,條件判斷等功能
前提: 加入jstl-1.2的jar包,先將jar包複製在Web中,然後在Project Structure中設定匯入,設定如下圖
然後點選Atifacts,點選右下角的fix,將其新增
匯入標籤庫
<%@ taglib uri="標籤庫唯一標識" prefix="字首" %>
4.控制語句
forEach
<c:forEach items="要遍歷的集合" var="臨時變數名" begin="起始數字" end="結束數字">
${臨時變數名}
</c:forEach>
要遍歷的集合 必須使用${} 從作用域獲取
if
<c:if test="布林條件">內容</c:if>
5. MVC 思想
Model 模型 ==> 資料(例如從資料庫查詢出來的list集合, 裡面包含java物件)
View 檢視 ==> 資料的展現形式 (jsp就是一種檢視技術)
Controller 控制器 ==> 把模型和檢視聯絡起來 (servlet 充當控制器作用)
由servlet器查詢資料,把資料放入作用域,跳轉至jsp檢視
jsp檢視從作用域中獲取資料,並展示
下面演示用servlet從資料庫中讀取資料,跳轉到jsp頁面上顯示(Student部分程式碼略過,含私有屬性,有參構造和get/set方法)
還有刪除,增添,修改等功能步驟類似,不在贅述
package level1;
import util.Utils;
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;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(urlPatterns = "/ServletToJspTest1")
public class ServletToJspTest1 extends HttpServlet {
static { //只需要執行一次,所以放在靜態程式碼塊裡面
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Connection conn =null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = Utils.getConnection();
stmt = conn.prepareStatement("select * from student");
rs = stmt.executeQuery();
List<Student> list = new ArrayList<>(); //建立一個集合儲存Student物件
while(rs.next()) { //將物件新增到list集合中
list.add(new Student(
rs.getInt("sid"),
rs.getString("sname"),
rs.getString("birthday"),
rs.getString("sex")
));
}
//將list集合放入作用域
req.setAttribute("aaa", list);
//跳轉請求控制檯到jsp頁面,讓jsp頁面完成顯示功能
req.getRequestDispatcher("ReceiveReqTest1.jsp").forward(req, resp);
} catch (SQLException e) {
e.printStackTrace();
} finally {
Utils.close(rs, stmt, conn);
}
}
}
<%--
Created by IntelliJ IDEA.
User: Szy
Date: 2018/10/15
Time: 15:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 下面是jsp指令碼,用於寫java程式碼 --%>
<%
int i = 10;
java.util.Date date = new java.util.Date();
%>
<%-- jsp表示式 --%>
<%= i%>
<br>
<%= date%>
<%-- el表示式 --%>
${10} <br>
${"我是字串"} <br>
${date} <br>
</body>
</html>
執行結果:注意地址是servlet的地址,而非直接訪問jsp頁面
> 注意: 伺服器常見的錯誤型別
500 Internal Server Error 伺服器內部錯誤,由於應用程式自己沒有正確處理異常,異常拋給了tomcat,這時就會出現500
404 Not Found 資源未找到錯誤,發生於要訪問的資源不存在(資源可能是servlet, jsp, html)
405 Method Not Allowed 方法不支援,
當沒有覆蓋doGet但傳送了get請求時
當沒有覆蓋doPost但傳送了post請求時
200 OK 表示這次請求正常,沒有錯誤
304 這個檔案沒有修改,請瀏覽器使用上一次快取的檔案
這些數字稱為響應狀態碼