1. 程式人生 > >java學習day33---servlet(中)

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 這個檔案沒有修改,請瀏覽器使用上一次快取的檔案

這些數字稱為響應狀態碼