1. 程式人生 > 實用技巧 >Java後端期末複習

Java後端期末複習

Java後端期末考試複習重點

文章目錄

java後端期末考試複習重點

1. 選擇題 15個 2分/題

2. 填空題 10個 2分/題

  1. 常用資料庫:

    MongoDB 非關係型資料庫 NoSQL

    MySQL 關係型資料庫 SQL

  2. C/S Client/Server 客戶端/伺服器
    B/S Brower/Server 瀏覽器/伺服器

  3. Swing 控制元件的建立(書第九章)

    import javax.swing.JButton;
    
    public class Main {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Java按鈕元件示例"); // 建立Frame視窗
    		frame.setSize(400, 200);
    		JPanel jp = new JPanel(); // 建立JPanel物件
            // 重點
    		JButton btn1 = new JButton("我是普通按鈕"); // 建立JButton物件
    		jp.add(btn1);
    		frame.add(jp);
    	}
    }
    
  4. Java web 請求處理過程

  5. MVC模型

    MVC 模式代表 Model-View-Controller(模型-檢視-控制器) 模式。這種模式用於應用程式的分層開發。

    • Model(模型) - 模型代表一個存取資料的物件或 JAVA POJO。它也可以帶有邏輯,在資料變化時更新控制器。

    • View(檢視) - 檢視代表模型包含的資料的視覺化。

    • Controller(控制器) - 控制器作用於模型和檢視上。它控制資料流向模型物件,並在資料變化時更新檢視。它使檢視與模型分離開。

3. 程式填空 3題 7空 14分

1. 多執行緒(書P305)

建立執行緒的方法

必考

extends <-> Thread

implements <-> Runnable

package multithreading;

// 方法一:繼承Thread類,重寫run()方法 -> extends Thread
class ExtendsThread extends Thread {

	@Override
	public void run() {
		System.out.println("extends Thread");
	}

}

// 方法二:實現Runnable介面,重寫run()方法 -> implements Runnable
class ImplementsRunnable implements Runnable {

	@Override
	public void run() {
		System.out.println("implements Runnable");
	}

}

public class Multithreading {
	public static void main(String[] args) {
//		主執行緒
		System.out.println("main thread");
//		呼叫start()方法,啟動一個新執行緒
		new ExtendsThread().start();
//		由於Runnable介面只聲明瞭一個run()方法,因此須藉助Thread類中的Thread(Runnable target)構造器來建立一個Thread物件,以呼叫start()方法,啟動一個新執行緒
		new Thread(new ImplementsRunnable()).start();
	}
}

判斷執行緒個數

必考

執行緒個數 = new XXX.start() 方法數 + 1(主執行緒)

例如本段程式,有兩個start()方法,則執行緒個數為2+1

public class Multithreading {
	public static void main(String[] args) {
//		主執行緒
		System.out.println("main thread");
//		呼叫start()方法,啟動一個新執行緒
		new ExtendsThread().start();
//		由於Runnable介面只聲明瞭一個run()方法,因此須藉助Thread類中的Thread(Runnable target)構造器new一個Thread物件,呼叫start()方法,啟動一個新執行緒
		new Thread(new ImplementsRunnable()).start();
	}
}

注意:while for 函式 中是否有 start()

2. 檔案流

IO流的分類

  • 根據單位:

    • 字元流:文字類
    • 位元組流:二進位制資料類
  • 根據流向:

    • 輸入流:只讀
    • 輸出流:只寫
  • 根據功能:

    • 實體流:只有基本讀寫操作
    • 裝飾流:實體流基礎上實現高階功能

位元組流

位元組輸入/輸出流:

InputStream/OutputStream

檔案位元組輸入/輸出流:

FileInputStream/FileOutputStream

字元流

字元輸入/輸出流:

Reader/Writer

檔案字元輸入/輸出流:

FileReader/FileWriter

程式碼詳見書 P340

3. JDBC 資料庫

開發步驟

  1. 獲取連線
  2. 開啟事務
  3. 獲取到 PreparedStatement
  4. 使用 PreparedStatement 執行兩次更新操作
  5. 正常情況下提交事務
  6. 出現異常回滾事務
  7. 最後關閉資源

preparedSatement 的好處

  1. prepareStatement()會先將 SQL 語句傳送給資料庫預編譯。PreparedStatement 會引用著預編譯後的結果。
    可以多次傳入不同的引數給 PreparedStatement 物件並執行。減少 SQL 編譯次數,提高效率。
  2. 安全性更高,沒有 SQL 注入的隱患。
  3. 提高了程式的可讀性

使用 PreparedStatement 的步驟:

  1. 編寫 SQL 語句,未知內容使用?佔位:“SELECT * FROM user WHERE name=? AND password=?”;
  2. 獲得 PreparedStatement 物件
  3. 設定實際引數:setXxx(佔位符的位置, 真實的值)
  4. 執行引數化 SQL 語句
  5. 關閉資源Statement 中的方法:
    Statement 介面中的方法

int executeUpdate(String sql)

用於傳送 DML 語句,增刪改的操作,insert、update delete

引數:SQL 語句

返回值:返回對資料庫影響的行數

ResultSet executeQuery(String sql)

用於傳送 DQL 語句,執行查詢的操作。select

引數:SQL 語句

返回值:查詢的結果集

4. 簡答題 4個 4分/題

Servlet的生命週期

  1. 載入和例項化:
  2. 初始化:Servlet容器呼叫init()初始化Servlet物件。
  3. 請求處理:Servlet容器建立ServletRequest物件和ServletResponse物件,Servlet呼叫servlet方法來處理客戶端的請求,呼叫doGet(),doPost()方法接收客戶端的請求,並且發回相應的響應。
  4. 服務終止:當web被終止,或Servlet容器終止執行,或Servlet容器過載新的例項,Servlet呼叫destroy()方法釋放佔用的資源。

Filter生命週期:(其實filter可以看作是一種特殊的servlet,所以生命週期和servlet大致相同)

  1. 通過建構函式例項化;
  2. 初始化init();
  3. 業務邏輯處理:doFilter();
  4. 銷燬:destory()

請求轉發與重定向

重定向:客戶端行為,從本質上講等於兩次請求,前一次請求的物件不會儲存,位址列的URL地址會改變。
請求轉發:伺服器的行為,是一次請求,轉發後請求物件會儲存,位址列的不會改變。

三種域物件

物件名稱 物件的型別
request HttpServletRequest
session HttpSession
application ServletContext

request

request是表示一個請求,只要發出一個請求就會建立一個request,它的作用域僅在當前請求中有效。
用處:常用語伺服器間同一請求不同頁面之間的引數傳遞,常用語表單的控制元件值傳遞。

session

伺服器會為每一個會話建立一個Session物件,所以Session中的資料可供當前會話中所有Servlet共享。
用處:常用於web開發中的登入驗證介面(當用戶登陸成功後瀏覽器分配其中一個Session鍵值對)。

application (ServletContext上下文)

作用範圍:所有的使用者都可以取得此資訊,此資訊在整個伺服器端被保留。Application屬性範圍值只要設定一次,則所有的網頁視窗都可以取得資料。ServletContext在伺服器啟動時建立,在伺服器關閉時銷燬,一個JavaWeb應用只建立一個ServletContext物件。

1、作用範圍不同,Cookie 儲存在客戶端(瀏覽器),Session 儲存在伺服器端。

2、存取方式的不同,Cookie 只能儲存 ASCII,Session 可以存任意資料型別,一般情況下我們可以在 Session 中保持一些常用變數資訊,比如說 UserId 等。

3、有效期不同,Cookie 可設定為長時間保持,比如我們經常使用的預設登入功能,Session 一般失效時間較短,客戶端關閉或者 Session 超時都會失效。

4、隱私策略不同,Cookie 儲存在客戶端,比較容易遭到不法獲取,早期有人將使用者的登入名和密碼儲存在 Cookie 中導致資訊被竊取;Session 儲存在服務端,安全性相對 Cookie 要好一些。

5、儲存大小不同, 單個 Cookie 儲存的資料不能超過 4K,Session 可儲存資料遠高於 Cookie。


學會簡單的 Cookie與Session 操作

DataBase 操作 (SQL 基本語句 JDBC詳見上面內容)

查詢

SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;

插入

插入操作主要有以下兩種寫法:

第一種形式無需指定要插入資料的列名,只需提供被插入的值即可:

INSERT INTO table_name
VALUES (value1,value2,value3,...);
12

第二種形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
12

更新

更新表中已經存在的元素

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
123

刪除

#根據條件刪除表中已經存在的元素
DELETE FROM table_name
WHERE some_column=some_value;
123

5. 程式設計題 2個 (參照作業題)

  1. Java8

    詳細資料:

    由淺入深體驗 Stream 流 – IBM Developer

    Java 8 習慣用語 – IBM Developer

    作業1:

    1 建立Student類物件,包括私有屬性id,name,age,訪問器方法,建構函式。

    2 建立8個學生物件的集合List

    3 普通方法和lambda表示式方法實現排序

    4 Stream流實現輸出年齡在18歲以上,排名前5,排除第1個的學生資訊

    // Student.java 學生類
    public class Student {
    	private String id;
    	private String name;
    	private int age;
    
    	public Student(String id, String name, int age) {
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	@Override
    	public String toString() {
    		return "id=" + id + ", name=" + name + ", age=" + age;
    	}
    }
    
    // Main.java 主類
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    
    public class Main {
    	public static void main(String[] args) {
    		List<Student> students = new ArrayList<Student>();
    //		迴圈生成學生資訊,並建立學生物件新增到列表中
    		for (int i = 1; i <= 8; i++) {
    			String id = "190707020" + i;
    			String name = "student" + i;
    //			在18的基礎上隨機加[0, 5)範圍內的整數,生成不同的年齡
    			int age = 18 + (int) (Math.random() * 5);
    			students.add(new Student(id, name, age));
    		}
    
    //		建立一個與students內元素相同的列表
    		List<Student> newStudents = new ArrayList<Student>(students);
    
    //		普通方法排序
    		students.sort(new Comparator<Student>() {
    			@Override
    			public int compare(Student o1, Student o2) {
    				return o1.getAge() - o2.getAge();
    			}
    		});
    		students.forEach(System.out::println);
    
    //		λ表示式排序
    		newStudents.sort((o1, o2) -> o1.getAge() - o2.getAge());
    		newStudents.forEach(System.out::println);
    
    //		Stream流實現輸出年齡在18歲以上,排名前5,排除第1個的學生資訊
    		students.stream() // 構造流
    				.filter(s -> s.getAge() > 18) // 選擇年齡大於18歲的學生
    				.limit(5) // 選擇前5個元素
    				.skip(1) // 跳過第1個元素
    				.forEach(System.out::println); // 遍歷輸出
    	}
    }
    
  2. Jsp 處理請求

    例如基礎的登陸表單驗證

    基本思想

    1. 使用者在登陸介面輸入使用者名稱和密碼
    2. 然後提交給處理jsp檔案,由這個檔案進行處理
    3. 處理完跳轉到登陸成功或者失敗介面

    index.jsp (表單post請求)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>登入頁面</title>
      </head>
      <body>
        <form
          action="${pageContext.request.contextPath}/loginServlet"
          method="post"
        >
          使用者名稱:<input type="text" name="username" /><br />
          密碼:<input type="password" name="password" /><br />
          <input type="submit" value="提交" />
        </form>
      </body>
    </html>
    

    LoginServlet.java (處理請求引數)

    package com.servlet;
    
    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;
     
    @WebServlet("/loginServlet")
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
     
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String info = "";
            if("admin".equals(username) && "123456".equals(password)){
                info = "歡迎你" + username + "!";
            }else{
                info = "使用者名稱或密碼錯誤!";
            }
            request.setAttribute("info", info);
            request.getRequestDispatcher("info.jsp").forward(request,response);
        }
     
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
        }
    }
    

    info.jsp 結果頁

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>登入提示</title>
      </head>
      <body>
        <p><%= request.getAttribute("info") %></p>
        <p><a href="index.jsp">返回首頁</a></p>
      </body>
    </html>