📚 Java Web开发综合练习题与答案
一、选择题
- HTTP请求从连接到服务器开始,到关闭浏览器结束 ✅
- HTTP的Cookie信息保存时间不能为任意长时间 ✅
- Spring用于简化难度 ✅
- SQL中的Update不能完成插入功能,它主要是更新功能 ✅
- SQL中的select用于查询数据 ✅
- Spring框架和另外框架集成比较容易。✅
- SpringMVC可以自动获取参数 ✅
- http地址完整写法是:Http://127.0.0.1:8080/index.html?a=1&b=2 ✅
- 数据库事务ACID包括:持久性,隔离性,一致性,原子性 ✅
二、填空题
- Request是 请求
- Response是 响应
- HTTP成功代码是 200 OK
- Servlet用于 处理请求与响应
- Tomcat是一种 服务器
- MVC是 请求-视图-模型三层设计模式
- SQL中通过 WHERE 进行条件查询
- SQL中通过 外键 进行关联
- 数据库有 关系数据库、文档型数据库、键值数据库、图数据库 等。
- Mysql的驱动名字为 com.mysql.jdbc.Driver
三、判断题(正确打√,错误打×)
| 题目 | 判断 |
|---|---|
| Java EE 是一个轻量级的开发框架,主要用于快速开发Web应用程序。 | ❌ |
| 在Java EE中,Servlet是用于处理HTTP请求和响应的组件。 | ✅ |
| Servlet叫做服务端程序,用于接受和处理用户发出的Http请求。 | ✅ |
| JSP(JavaServer Pages)是一种用于生成动态内容的Java技术,它不能嵌入Java代码。 | ❌ |
| 一次Http请求可以对应多个响应,同时多一个响应对应一个会话。 | ❌ |
| Spring是一个重量级框架,用于简化应用程序开发的复杂度。 | ❌ |
| Spring框架中,@Component注解指的是用于标注一个零件类。 | ✅ |
| SpringBoot是一个快速启动的web服务框架,用于实现服务器的启动环境与配置。 | ✅ |
| 在关系型数据库中,主键用于建立表的唯一顺序性,一般设置为整数自增长类型。 | ✅ |
| 数据库的规范化是减少数据冗余来提高数据存储效率,但可能会降低查询效率。 | ✅ |
四、简答题
4.1 什么是“视图模型控制器”三层架构?
MVC(Model-View-Controller)是一种软件设计模式,广泛用于Web应用开发中,将系统划分为三个核心部分:
- Model(模型):负责数据逻辑和业务规则,通常与数据库交互。
- View(视图):负责展示数据给用户,即UI界面。
- Controller(控制器):接收用户输入,协调Model和View之间的交互。
优点:结构清晰、便于维护、利于分工协作。
4.2 什么是Spring中的依赖注入和控制反转?
- 控制反转(IoC):指对象的创建和管理由框架或容器负责,而不是由程序员硬编码控制。
- 依赖注入(DI):是IoC的一种实现方式,指容器自动将对象所需的依赖注入到对象中,无需手动new。
示例:
@Service
class BookService {}
@Controller
class BookController {
@Autowired
private BookService bookService; // 自动注入依赖
}
4.3 关系型数据库和非关系数据库的区别,常用的关系型和非关系型数据库有哪些?
| 特点 | 关系型数据库 | 非关系型数据库 |
|---|---|---|
| 数据结构 | 表格形式,有严格Schema | 文档、键值、图形等,灵活Schema |
| 扩展性 | 垂直扩展为主 | 水平扩展更方便 |
| ACID支持 | 支持事务ACID特性 | 多数不完全支持ACID |
| 查询语言 | SQL | 各数据库有自己的查询方式 |
常见关系型数据库:
- MySQL、PostgreSQL、Oracle、SQL Server
常见非关系型数据库:
- MongoDB(文档型)
- Redis(键值型)
- Cassandra(列族型)
- Neo4j(图数据库)
4.4 什么是Http协议,它的格式是怎样,常用的请求与状态有哪些?
- HTTP协议:超文本传输协议,是客户端和服务器之间通信的标准协议。
HTTP请求格式:
请求行(方法 URL 协议版本)
请求头(Key: Value)
空行
请求体(可选)
常见请求方法:
- GET:获取资源
- POST:提交数据
- PUT:更新资源
- DELETE:删除资源
- PATCH:局部更新
常见状态码:
- 200 OK:成功
- 302 Found:重定向
- 400 Bad Request:请求错误
- 404 Not Found:资源不存在
- 500 Internal Server Error:服务器内部错误
4.5 JavaSE中的Servlet中常用的对象有哪些?
虽然Servlet属于Java EE范畴,但在JavaSE中也可以使用Tomcat等容器运行Servlet。
常用对象包括:
HttpServletRequest:封装客户端请求信息HttpServletResponse:封装响应信息HttpSession:表示用户会话ServletContext:代表整个Web应用上下文FilterConfig/ServletConfig:配置信息对象
4.6 什么是JDBC的基本定义,使用JDBC的流程有哪些?
JDBC(Java Database Connectivity):是Java访问数据库的标准API,提供统一接口操作各种数据库。
基本流程如下:
- 加载驱动:
Class.forName("com.mysql.cj.jdbc.Driver"); - 建立连接:
Connection conn = DriverManager.getConnection(url, user, password); - 创建Statement:
Statement stmt = conn.createStatement(); - 执行SQL语句:
ResultSet rs = stmt.executeQuery("SELECT * FROM table"); - 处理结果集(仅查询时需要)
- 关闭资源:依次关闭ResultSet、Statement、Connection
五、大题:图书管理系统分析
5.1 图书管理系统有哪些角色?
- 管理员:负责系统维护、用户管理、图书管理等
- 读者(用户):借阅、归还、查询图书
- 系统本身:处理逾期提醒、报表生成等
5.2 不同角色的用例和行为
| 角色 | 用例 | 行为描述 |
|---|---|---|
| 管理员 | 添加/修改/删除图书 | 维护图书信息 |
| 添加/修改/删除读者 | 管理用户账户 | |
| 查看借阅记录 | 监控图书流通情况 | |
| 读者 | 借阅图书 | 提交借阅申请 |
| 归还图书 | 提交归还操作 | |
| 查询图书 | 使用ISBN、书名等搜索 | |
| 查看个人借阅历史 | 查看自己借阅过的图书 | |
| 系统 | 发送逾期提醒 | 自动检测并发送邮件或短信通知 |
| 生成报表 | 输出借阅统计、热门书籍等报表 |
5.3 功能和流程分析
功能模块:
- 图书信息管理
- 读者信息管理
- 借阅/归还操作
- 图书检索
- 逾期提醒
- 报表输出
流程分析:
- 图书录入:管理员添加新书信息(ISBN、书名、作者等)
- 读者注册:管理员添加读者信息(姓名、联系方式)
- 借阅流程:
- 读者选择图书
- 系统验证是否可借
- 记录借阅日期和应还日期
- 归还流程:
- 读者归还图书
- 系统检查是否逾期
- 逾期提醒:
- 系统定时扫描未还图书
- 对逾期读者发送提醒
- 报表输出:
- 管理员查看借阅统计、热门书籍等报表
5.4 实体及其属性
| 实体 | 属性 |
|---|---|
| 图书(Book) | ISBN、书名、作者、出版社、出版日期、库存数量 |
| 读者(Reader) | 读者ID、姓名、联系方式、注册时间 |
| 借阅记录(BorrowRecord) | 借阅ID、读者ID、图书ISBN、借阅日期、应还日期、实际归还日期、是否逾期 |
5.5 实体关系图(ER图)
由于无法绘图,请根据以下描述理解:
- 图书(Book) 与 借阅记录(BorrowRecord) 是一对多关系(一本书可被多次借阅)
- 读者(Reader) 与 借阅记录(BorrowRecord) 是一对多关系(一个读者可借多本书)
- 借阅记录(BorrowRecord) 包含外键指向图书(ISBN)和读者(读者ID)
六、用户登录功能实现(Spring Boot + MyBatis + Vue + Axios)
6.1 创建数据库和用户表
CREATE DATABASE test;
USE test;
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(32) UNIQUE NOT NULL,
password VARCHAR(16) NOT NULL,
name VARCHAR(32),
sex VARCHAR(4),
detail TEXT,
role_id INT,
create_date DATETIME
);
6.2 编写 User.java 实体类
import java.util.Date;
public class Users {
private int id;
private String email;
private String password;
private String name;
private String sex;
private String detail;
private int roleId;
private Date createDate;
public Users() {}
// Getter & Setter 省略
}
6.3 编写 UserMapper.java 接口
import com.feng.qa.entity.Users;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UsersMapper {
@Insert("INSERT INTO users(email,password,name,sex,detail,role_id,create_date) VALUES(#{email},#{password},#{name},#{sex},#{detail},#{roleId},#{createDate})")
void add(Users user);
@Update("UPDATE users SET email=#{email},password=#{password},name=#{name},sex=#{sex},detail=#{detail},role_id=#{roleId},create_date=#{createDate} WHERE id=#{id}")
void update(Users user);
@Delete("DELETE FROM users WHERE id=#{id}")
void delete(int id);
@Select("SELECT * FROM users WHERE id=#{id}")
Users get(int id);
@Select("SELECT * FROM users WHERE email=#{email}")
Users findByEmail(String email);
}
6.4 编写 LoginController.java 控制器
import com.feng.qa.entity.Users;
import com.feng.qa.mapper.UsersMapper;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UsersController {
@Autowired
UsersMapper usersMapper;
@RequestMapping("/login")
@ResponseBody
public String login(HttpServletRequest request) {
String email = request.getParameter("email").trim();
String password = request.getParameter("password").trim();
if (email == null || password == null) return "请输入邮箱或密码!";
Users user = usersMapper.findByEmail(email);
if (user == null) return "邮箱不存在!";
if (!user.getPassword().equals(password)) return "密码不正确!";
request.getSession().setAttribute("user", user);
return "ok";
}
}
6.5 编写前端登录页面 login.html
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<h2>用户登录</h2>
<form action="/login" method="post">
<div>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email" required>
</div>
<div>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
</div>
<div>
<button type="submit">登录</button>
</div>
</form>
</body>
</html>
6.6 Vue + Axios 前端调用示例(补充)
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<div id="app">
<input v-model="email" placeholder="邮箱">
<input v-model="password" placeholder="密码" type="password">
<button @click="login">登录</button>
<p>{{ message }}</p>
</div>
<script>
const { createApp } = Vue;
createApp({
data() {
return {
email: '',
password: '',
message: ''
};
},
methods: {
async login() {
const res = await axios.post('/login', {
email: this.email,
password: this.password
});
this.message = res.data;
}
}
}).mount('#app');
</script>
如需进一步生成项目目录结构、POM.xml 文件、application.yml 配置文件等内容,欢迎继续提问!