Loading

Java后端期末复习

Java后端期末考试复习重点

1. 选择题 15个 2分/题

2. 填空题 10个 2分/题

  • 常用数据库:

必考

MongoDB -> 非关系型数据库 -> NoSQL
MySQL -> 关系型数据库 -> SQL

  • 开发体系结构:

必考

C/S -> Client/Server -> 客户端/服务器
B/S -> Browser/Server -> 浏览器/服务器

  • Swing 常用组件的创建(书P270):

必考

JButton btn = new JButton("按钮");
类名 对象名 = new 类名("显示文本");

示例代码:

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 btn = new JButton("按钮"); // 创建JButton对象
		jp.add(btn);
		frame.add(jp);
	}
}
  • JSP缩写:

必考

Java Server Pages

  1. Java web 请求处理过程
    在这里插入图片描述

  2. 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(主线程)

例如本段程序,有两个new .....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();
	}
}

new了几个start(),就是几加一
注意:while for 函数 中是否有 start()

2. I/O流(书P332)

什么是流(书P332 11.1.1)

  • 一个无结构化的数据组成的序列

I/O流的分类(书P332 11.1.2)

  • 根据单位:

    • 字节流:以字节为单位,通常传输二进制数据类文件
    • 字符流:以字符为单位,通常传输文本类文件
  • 根据流向:

    • 输入流:表示从一个源读取数据,只读
    • 输出流:表示向一个目标写数据,只写
  • 根据功能:

    • 实体流:只有基本读写操作
    • 装饰流:实体流基础上实现高级功能

字节流

字节输入/输出流:

InputStream/OutputStream

文件字节输入/输出流:

FileInputStream/FileOutputStream

字符流

字符输入/输出流:

Reader/Writer

文件字符输入/输出流:

FileReader/FileWriter

代码详见书 P340

3. JDBC 数据库

JDBC是什么?

  • Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

编译预处理(P385 12.3.5)

  • 什么是编译预处理?
  • 编译预处理的好处?

数据库操作分类

Statement类

  • 查询:ResultSet executeQuery(String sql),返回包含给定查询生成的数据的ResultSet对象
  • 更新:int executeUpdate(String sql),返回SQL语句影响的行数

开发步骤

  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的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  1. Servlet 初始化后调用 init () 方法。
  2. Servlet 调用 service() 方法来处理客户端的请求。
    其中,service()方法会根据请求类型调用doGet()方法或doPost()方法
  3. Servlet 销毁前调用 destroy() 方法。
  4. 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

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,...);

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

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

更新

更新表中已经存在的元素

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

删除

#根据条件删除表中已经存在的元素
DELETE FROM table_name
WHERE some_column=some_value;

5. 编程题 2个 10分/题

Java8

必考

Lambda表达式

Java8详细资料:

为什么完美的 lambda 表达式只有一行 – IBM Developer

由浅入深体验 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); // 遍历输出
   	}
   }

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>
posted @ 2020-11-30 19:31  Biem  阅读(558)  评论(0编辑  收藏  举报