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
-
Java web 请求处理过程
-
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语句影响的行数
开发步骤
- 获取连接
- 开启事务
- 获取到 PreparedStatement
- 使用 PreparedStatement 执行两次更新操作
- 正常情况下提交事务
- 出现异常回滚事务
- 最后关闭资源
preparedSatement 的好处
- prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。
可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。 - 安全性更高,没有 SQL 注入的隐患。
- 提高了程序的可读性
使用 PreparedStatement 的步骤:
- 编写 SQL 语句,未知内容使用?占位:“SELECT * FROM user WHERE name=? AND password=?”;
- 获得 PreparedStatement 对象
- 设置实际参数:setXxx(占位符的位置, 真实的值)
- 执行参数化 SQL 语句
- 关闭资源Statement 中的方法:
Statement 接口中的方法
int executeUpdate(String sql)
用于发送 DML 语句,增删改的操作,insert、update delete
参数:SQL 语句
返回值:返回对数据库影响的行数
ResultSet executeQuery(String sql)
用于发送 DQL 语句,执行查询的操作。select
参数:SQL 语句
返回值:查询的结果集
4. 简答题 4个 4分/题
Servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 初始化后调用 init () 方法。
- Servlet 调用 service() 方法来处理客户端的请求。
其中,service()方法会根据请求类型调用doGet()方法或doPost()方法 - Servlet 销毁前调用 destroy() 方法。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
Filter生命周期:(其实filter可以看作是一种特殊的servlet,所以生命周期和servlet大致相同)
- 通过构造函数实例化;
- 初始化init();
- 业务逻辑处理:doFilter();
- 销毁:destory()
请求转发与重定向
重定向:客户端行为,从本质上讲等于两次请求,前一次请求的对象不会保存,地址栏的URL地址会改变。
请求转发:服务器的行为,是一次请求,转发后请求对象会保存,地址栏的不会改变。
三种域对象
对象名称 | 对象的类型 |
---|---|
request | HttpServletRequest |
session | HttpSession |
application | ServletContext |
request
request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域仅在当前请求中有效。
用处:常用语服务器间同一请求不同页面之间的参数传递,常用语表单的控件值传递。
session
服务器会为每一个会话创建一个Session对象,所以Session中的数据可供当前会话中所有Servlet共享。
用处:常用于web开发中的登录验证界面(当用户登陆成功后浏览器分配其中一个Session键值对)。
application (ServletContext上下文)
作用范围:所有的用户都可以取得此信息,此信息在整个服务器端被保留。Application属性范围值只要设置一次,则所有的网页窗口都可以取得数据。ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb应用只创建一个ServletContext对象。
Cookie 和 Session 有什么不同?
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
作业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处理请求
例如基础的登陆表单验证
基本思想
- 用户在登陆界面输入用户名和密码
- 然后提交给处理jsp文件,由这个文件进行处理
- 处理完跳转到登陆成功或者失败界面
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>
本文来自博客园,作者:Biem,转载请注明原文链接:https://www.cnblogs.com/biem/p/14063103.html