📚 Java Web开发综合练习题与答案

发布于 2025年6月23日 11:11:01 (武汉时间)

📚 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,提供统一接口操作各种数据库。

基本流程如下

  1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");
  2. 建立连接Connection conn = DriverManager.getConnection(url, user, password);
  3. 创建StatementStatement stmt = conn.createStatement();
  4. 执行SQL语句ResultSet rs = stmt.executeQuery("SELECT * FROM table");
  5. 处理结果集(仅查询时需要)
  6. 关闭资源:依次关闭ResultSet、Statement、Connection

五、大题:图书管理系统分析

5.1 图书管理系统有哪些角色?

  • 管理员:负责系统维护、用户管理、图书管理等
  • 读者(用户):借阅、归还、查询图书
  • 系统本身:处理逾期提醒、报表生成等

5.2 不同角色的用例和行为

角色 用例 行为描述
管理员 添加/修改/删除图书 维护图书信息
添加/修改/删除读者 管理用户账户
查看借阅记录 监控图书流通情况
读者 借阅图书 提交借阅申请
归还图书 提交归还操作
查询图书 使用ISBN、书名等搜索
查看个人借阅历史 查看自己借阅过的图书
系统 发送逾期提醒 自动检测并发送邮件或短信通知
生成报表 输出借阅统计、热门书籍等报表

5.3 功能和流程分析

功能模块:

  • 图书信息管理
  • 读者信息管理
  • 借阅/归还操作
  • 图书检索
  • 逾期提醒
  • 报表输出

流程分析:

  1. 图书录入:管理员添加新书信息(ISBN、书名、作者等)
  2. 读者注册:管理员添加读者信息(姓名、联系方式)
  3. 借阅流程
    • 读者选择图书
    • 系统验证是否可借
    • 记录借阅日期和应还日期
  4. 归还流程
    • 读者归还图书
    • 系统检查是否逾期
  5. 逾期提醒
    • 系统定时扫描未还图书
    • 对逾期读者发送提醒
  6. 报表输出
    • 管理员查看借阅统计、热门书籍等报表

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 配置文件等内容,欢迎继续提问!

← 返回首页