JavaEE 环境与程序设计 · 交互课程

题库管理Quiz Bank

各课程页随堂测验(<Quiz items>)的题集中在此:可增 / 改 / 删并实时校验,按章节统计题量,导出 JSON 供整理回填。 编辑仅作用于当前会话(客户端内存),导出的 JSON 需教师确认后回填到对应 MDX。

题库管理器(QuizBankManager)

各课程页 <Quiz items={…} /> 里的题集中在这里: 可增 / 改 / 删(实时校验),导出 JSON 供整理回填。当前共 90 题,全部通过校验。

00-web-basics-1

判定一个网页是「动态网页」的核心依据是( )

A. 内容是否由服务器端解释执行后生成B. 页面里有没有图片C. 文件大小是否较大D. 文件后缀是 .html

解析:动态网页的内容是服务器端现算的(.jsp/.asp/.php 等),可因人而异因时而变;静态网页(.html)内容写死、人人相同。后缀只是表象,本质看「是不是服务端生成」。

00-web-basics-2

URL `http://localhost:8080/guestbook/index.jsp` 中,`8080` 表示( )

A. 端口号B. 路径C. 协议名D. 域名

解析:URL 形如 http://host:port/path——localhost 是主机、8080 是端口、/guestbook/index.jsp 是路径。Tomcat 默认监听 8080,所以端口号决定连到哪个服务。

00-web-basics-3

浏览器向服务器提交表单数据(如登录)时,最常用的 HTTP 方法是( )

A. POSTB. DELETEC. HEADD. GET

解析:POST 用于把数据提交到服务器(请求体里带参数),适合登录、留言这类「写」操作;GET 主要用于取资源,参数拼在 URL 上、不宜传敏感/大量数据。

00-web-basics-4

Tomcat 在这套技术栈里的角色是( )

A. 轻量级 Servlet 容器,运行 JSP/ServletB. 数据库管理系统C. Java 编译器D. 静态文件服务器

解析:Tomcat 实现了 Servlet API:读 WEB-INF/web.xml、实例化并管理 Servlet 生命周期、把 JSP 编译成 Servlet。Apache/Nginx 主要管静态资源与代理,分工不同。

00-web-basics-5

HTTP 是「无状态」协议,网站要记住「当前用户」应依赖( )

A. Cookie + SessionB. HTML 标签C. DNS 解析D. URL 里的路径

解析:HTTP 每次请求独立、服务器不记「上次是谁」。靠 Cookie 在客户端存会话标识、Session 在服务端存用户数据,两者配合实现跨请求的「有状态」体验(登录、购物车)。

00-web-basics-6

浏览器(客户端)在一次网页访问里不负责( )

A. 解析 URL 并发出 HTTP 请求B. 接收并渲染服务器返回的 HTMLC. 计算动态页面的业务内容(如查询数据库)D. 保存 Cookie

解析:浏览器只负责「问 + 显示」:解析 URL、发请求、渲染 HTML、存 Cookie。动态内容的计算在服务器端(Servlet/JSP),浏览器拿到的永远是算好的 HTML。

00-web-basics-7

浏览器地址栏里 `http://localhost:8080/guestbook/index.jsp`,浏览器首先做的是( )

A. 直接渲染页面B. 解析 URL 得到协议/主机/端口/路径,再发 HTTP 请求C. 连接数据库D. 编译 JSP

解析:浏览器先解析 URL(协议 http、主机 localhost、端口 8080、路径 /guestbook/index.jsp),据此向该服务器发 HTTP 请求;JSP 的编译在服务器端 Tomcat 里进行,与浏览器无关。

02-servlet-filter-listener-1

关于 Servlet 生命周期,下列说法正确的是( )

A. destroy() 在每次请求结束时被调用B. init() 每来一次客户端请求就调用一次C. 容器只调用一次 init(),每次请求都调用 service()D. service() 整个生命周期只调用一次

解析:Servlet 是单例多线程对象:容器加载类、new 出唯一实例后只调用一次 init();每次客户端请求都调用 service()(分发到 doGet/doPost);destroy() 只在卸载前调用一次。

02-servlet-filter-listener-2

Servlet 被容器实例化之后,第一个被调用的生命周期方法是( )

A. destroy()B. service()C. init()D. doGet()

解析:顺序是:加载类 → 实例化(new,不触发任何生命周期方法)→ init() → service()。实例化之后容器先调 init() 做一次性资源准备。

02-servlet-filter-listener-3

下列哪个方法属于 HttpServletRequest?

A. setContentType(...)B. getWriter()C. getParameter(name)D. sendRedirect(...)

解析:getParameter/getSession 是请求侧(取参数、取会话);setContentType/getWriter/sendRedirect 都是 HttpServletResponse 的方法(写响应)。

02-servlet-filter-listener-4

在 web.xml 中,把 Servlet 映射到 URL 的元素是( )

A. <listener>B. <servlet>C. <servlet-mapping>D. <filter-mapping>

解析:<servlet> 声明 servlet-name 与类名;<servlet-mapping> 把该名字映射到 /hello.svc 这样的 url-pattern。两者配合才完成「URL → Servlet」的路由。

02-servlet-filter-listener-5

Filter 链中,AuthFilter 判定用户未登录时应该( )

A. 调用目标 Servlet 的 destroy()B. 调用 chain.doFilter() 继续放行C. 直接写 302 跳转响应,不调用 chain.doFilter()D. 抛出异常终止 Tomcat

解析:这就是「短路」:不放行就直接写响应(如 302 跳登录页),后续 Filter 与目标 Servlet 都不会执行。

02-servlet-filter-listener-6

关于链上多个 Filter 的执行顺序,正确的是( )

A. Filter 并行执行,没有固定顺序B. 请求和响应都按声明顺序执行C. 请求按声明顺序向下,响应按相反顺序向上返回D. 响应按声明顺序向上,请求按相反顺序向下

解析:请求「下顺」:依次经过每个 Filter 的前置处理;响应「上逆」:按相反顺序经过每个 Filter 的后置处理。任一 Filter 短路后,其后的 Filter 不再执行。

02-servlet-filter-listener-7

Servlet 为什么不应该用实例变量保存每次请求的数据?

A. 实例变量会在每次请求结束后被清空B. 实例变量读写太慢C. Servlet 是单例多线程的,多个请求共享同一实例并发执行,用实例变量会串数据D. 容器禁止在 Servlet 类里声明字段

解析:所有请求共享同一个 Servlet 实例,service() 可能被多个线程并发调用——请求相关状态一律用局部变量;确需共享时加同步或用 ThreadLocal。

02-servlet-filter-listener-8

关于 Listener,下列说法正确的是( )

A. Listener 在 Filter 与 Servlet 之间拦截请求B. Listener 可以主动修改 Session 的内容C. 会话创建/销毁等事件发生时,容器自动通知已注册的 ListenerD. Listener 必须在 Servlet 里手动调用

解析:Listener 注册在 web.xml 中,HttpSession 创建/销毁、属性变更等事件发生时由容器自动通知;它只「旁听」事件,不拦截请求。

01-jsp-basics-1

JSP 页面里 `<% if(x>0){...} %>` 属于哪种元素?

A. 普通 HTMLB. 指令C. 声明D. 脚本(scriptlet)

解析:<% %> 是脚本(scriptlet),编译进 Servlet 的 service() 方法体,是 Java 语句。指令是 <%@ %>、声明是 <%! %>、表达式是 <%= %>。

01-jsp-basics-2

`<%! int i = 0; %>` 与 `<% int i = 0; %>` 的区别是( )

A. 前者是成员变量/方法(跨请求共享),后者是方法内局部语句B. 两者完全等价C. 前者编译失败,后者正常D. 前者只在本行有效

解析:<%! %> 声明的是 Servlet 的成员变量/方法,整个页面(跨请求、多线程)共享——有线程安全风险;<% %> 是 service() 内的局部语句,每次请求独立执行。

01-jsp-basics-3

要「真正隐藏」一段代码不让用户查看源码看到,应使用( )

A. JSP 注释 <%-- -->B. 普通 HTML 文本C. CSS display:noneD. HTML 注释 <!-- -->

解析:JSP 注释 <%-- --%> 在编译期就被去掉,不会进入生成的 Servlet/HTML;HTML 注释会原样发到浏览器,查看源码可见。

01-jsp-basics-4

要保存「同一用户多次访问都要保留」的数据(如登录状态),应使用哪个内置对象?

A. sessionB. applicationC. outD. request

解析:request 只活一次请求;session 活一个会话(跨请求、同一用户);application 是全局共享。登录状态是「同一用户跨请求」,用 session。

01-jsp-basics-5

实现「退出登录」(清空登录态),标准做法是调用( )

A. session.removeAttribute("user")B. session.invalidate()C. application.removeAttribute("user")D. request.setAttribute("user", null)

解析:invalidate() 销毁整个会话、清空全部属性——是「退出登录」的标准动作;removeAttribute 只删单个属性(会话里其他数据还在);登录态本来就不该存在 application 里。

01-jsp-basics-6

调用 session.invalidate() 之后,该用户下一次请求会发生什么?

A. 原会话自动恢复、属性还在B. 服务器拒绝访问(403)C. JSP 页面抛出空指针异常D. 容器为他创建一个新的 HttpSession

解析:会话销毁后属性清空;下次请求时容器会创建新会话(新的 JSESSIONID),原登录态丢失——所以退出登录后需要重新登录。

01-jsp-basics-7

下列数据最适合存放在 application(ServletContext)里的是( )

A. 当前用户的购物车商品列表B. 全站总访问次数 PVC. 同一次请求内要传递的参数D. JSP 页面渲染用的临时变量

解析:application 整个应用、所有用户共享,适合 PV / 在线人数这类全站统计和全局配置;购物车属于某个具体用户,应放 session;单次请求内的数据放 request。

01-jsp-basics-8

`<%= name %>` 在编译后会变成什么?

A. out.print(name)B. request.getParameter(name)C. session.setAttribute(name)D. 一个成员变量

解析:表达式 <%= %> 编译成 out.print(...),把表达式的值写进响应输出流。它是「往页面里塞一个值」。

01-jsp-basics-9

JSP 与 Servlet 的关系最准确的描述是( )

A. JSP 会被 Tomcat 编译成 Servlet 执行B. Servlet 会编译成 JSPC. 两者互不相关D. JSP 只能运行在 IIS 上

解析:首次请求 .jsp 时,Tomcat 把它编译成一个 Servlet(.class),之后执行该 Servlet 生成 HTML。所以 JSP 本质是「披着 HTML 外衣的 Servlet」,能复用 request/response 等容器能力。

01-jsp-basics-10

JSP 里要把「整个应用共享」的数据(如在线人数)存起来,应使用哪个内置对象?

A. requestB. sessionC. applicationD. out

解析:application(ServletContext)作用域是整个 Web 应用、全局共享;request 只活一次请求,session 只活一个会话。在线人数是「全站共享」,用 application。

01-jsp-basics-11

按 JavaBean 规范,一个标准 Bean 必须提供( )

A. 无参构造器 + 私有属性 + getter/setterB. 至少一个带参构造器C. public 字段直接访问D. 静态成员变量

解析:JavaBean 规范:public 类 + 无参构造器(框架靠它 new)+ 私有属性经 getter/setter 访问。字段不 public、不用带参构造器实例化。

03-spring-ioc-1

IoC(控制反转)的含义是( )

A. 把 Java 源码编译成字节码B. 对象自己 new 自己的依赖C. 对象的创建与依赖管理交给外部容器D. 用反射读取类信息

解析:IoC=Inversion of Control(控制反转):对象的创建、持有、装配交给容器,业务代码不再 new 依赖——依赖关系被「反转」了。

03-spring-ioc-2

Spring XML 里 <property name="title" value="第一条留言"/> 的作用是( )

A. 声明一个新 beanB. 给 bean 改 idC. 通过 setter 注入把 title 属性填成「第一条留言」D. 注册一个监听器

解析:<property> 对应 setter 注入:容器调 setTitle 把 title 填成「第一条留言」。这是 DI 的「属性注入」方式。

03-spring-ioc-3

注解配置中 @Autowired 的作用是( )

A. 让容器自动把匹配的依赖 bean 注入到该字段B. 声明这是一个 beanC. 给字段赋一个字符串字面量D. 标记方法为事务方法

解析:@Autowired 按类型自动装配(同类型多个时加 @Qualifier 指定名字),对应 XML 里的 <ref bean>。

03-spring-ioc-4

关于 @Component 四兄弟,正确的是( )

A. 它们都是 SpringMVC 专属注解B. 四个注解功能完全一样,可任意互换C. @Service 用于业务层、@Repository 用于持久层、@Controller 用于 Web 层,按分层语义区分D. 只有 @Component 能注册 bean,其余三个只是注释

解析:四者本质都是 @Component(都注册为 bean),区别是分层语义:@Service 业务层、@Repository 持久层、@Controller Web 层、@Component 通用兜底。

03-spring-ioc-5

BeanFactory 与 ApplicationContext 的区别,正确的是( )

A. 两者完全等价,可互换B. BeanFactory 功能比 ApplicationContext 多C. ApplicationContext 只能懒加载单例D. ApplicationContext 启动时即创建所有单例 bean(饿加载),并整合事件/国际化等更多功能

解析:ApplicationContext 是 BeanFactory 的超集:启动即饿加载全部单例(如 ClassPathXmlApplicationContext),并提供事件发布、国际化、资源加载等。

03-spring-ioc-6

Spring bean 生命周期的正确顺序是( )

A. 初始化 → 实例化 → 属性赋值 → 可用 → 销毁B. 属性赋值 → 实例化 → 初始化 → 销毁 → 可用C. 实例化 → 属性赋值 → 初始化 → 可用 → 销毁D. 实例化 → 初始化 → 属性赋值 → 销毁 → 可用

解析:先无参构造实例化,再填属性/依赖(DI),然后执行初始化回调(@PostConstruct),之后可用,容器关闭时销毁。

03-spring-ioc-7

XML 里 <property name="gb"><ref bean="gb1"/></property> 表示( )

A. 新建一个 id 为 gb 的 beanB. 删除 gb1 这个 beanC. 把 gb 属性设为字符串字面量 gb1D. 把已创建的 gb1 这个 bean 的引用注入到当前 bean 的 gb 属性

解析:<ref bean> 是依赖注入:把容器里已创建的 gb1 实例引用注入进来,而不是字符串。

03-spring-ioc-8

注解配置中 @Value("zhang") 的作用是( )

A. 给字段注入字面量值 zhangB. 注册一个名为 zhang 的 beanC. 注入另一个 beanD. 声明一个常量类

解析:@Value 注入字面量(基本类型/字符串),对应 XML 的 <property value>。

04-springmvc-1

DispatcherServlet 的作用是( )

A. 负责持久化数据到数据库B. 编译 Java 源码成字节码C. 负责渲染 JSP 视图D. 前端控制器:统一接收所有 *.do 请求并分发给对应的 Controller

解析:DispatcherServlet 是 SpringMVC 的前端控制器(总入口):web.xml 把所有 *.do 请求交给它,再由它调度到对应 Controller。

04-springmvc-2

SpringMVC 请求处理五步的正确顺序是( )

A. DispatcherServlet → ViewResolver → HandlerMapping → ControllerB. HandlerMapping → DispatcherServlet → Controller → ViewResolverC. 客户端请求 → DispatcherServlet → HandlerMapping 找 Controller → Controller 返回 ModelAndView → ViewResolver 渲染视图D. Controller → DispatcherServlet → HandlerMapping → 视图渲染

解析:请求先到 DispatcherServlet,HandlerMapping 找到命中的 @RequestMapping 方法,Controller 返回 ModelAndView,最后 ViewResolver 渲染视图。

04-springmvc-3

@RequestMapping 的作用是( )

A. 把请求 URL 映射到对应的 Controller 处理方法B. 声明这是一个 Service beanC. 给字段注入依赖D. 配置数据源连接池

解析:@RequestMapping 标注在方法(或类)上,把 URL 与处理方法绑定;HandlerMapping 据此找到命中的 handler。

04-springmvc-4

HandlerMapping 的职责是( )

A. 渲染 JSP 视图B. 把业务对象放进 ModelC. 管理数据库连接池D. 根据请求 URL 找到命中的 @RequestMapping 方法

解析:HandlerMapping(如 RequestMappingHandlerMapping)按 URL 匹配到对应的 Controller 方法,是「URL→handler」的映射器。

04-springmvc-5

ViewResolver(视图解析器)的作用是( )

A. 把逻辑视图名(如 hello)按 prefix/suffix 拼成实际 JSP 路径(/WEB-INF/jsp/hello.jsp)B. 接收并解析客户端请求C. 把表单参数绑定到 Java 对象D. 执行 SQL 查询返回结果集

解析:ViewResolver 把 Controller 返回的逻辑视图名(hello)结合 prefix/suffix 解析成真实 JSP 路径,交给 JSP 渲染。

04-springmvc-6

Model / ModelMap 的作用是( )

A. 存放数据库连接对象B. 配置 Spring IoC 容器C. 跨多次请求保存用户数据(会话级)D. Controller 往里放数据、JSP 用 EL 取出的本次请求数据容器

解析:Model 是请求作用域的数据容器:Controller 放、JSP 用 ${...} 取,请求结束即失效;跨请求要存就得用 HttpSession。

04-springmvc-7

JSP 里 ${message} 的取值来源是( )

A. 从数据库表读取B. 从浏览器 Cookie 读取C. 从 Model 中读取名为 message 的属性值D. 硬编码写死在 JSP 里

解析:EL ${message} 从当前请求的 Model 中读名为 message 的属性——即 Controller 放进来的那个值。

04-springmvc-8

new ModelAndView("hello", "message", msg) 的含义是( )

A. 跳转到 id 为 hello 的 ServletB. 在数据库创建一张名为 hello 的表C. 新建一个名为 hello 的 Spring beanD. 返回逻辑视图名 hello,并把属性 message 的值设为 msg

解析:第一个参数是逻辑视图名(hello),后两个是「模型属性名 → 值」(message → msg):视图去渲染,数据进 Model。

04-springmvc-9

在 MVC 三层架构里,「业务规则、事务边界」应放在哪一层?

A. 表示层(Controller/View)B. 数据访问层(DAO)C. 数据库D. 业务逻辑层(Service)

解析:Service 层封装业务规则并划定事务边界,协调各 DAO;Controller 只接请求渲染视图,DAO 只管存取,都不该写业务判断。

04-springmvc-10

数据访问层(DAO)的职责是( )

A. 封装业务规则B. 只负责和数据库打交道(增删改查)C. 渲染 JSP 视图D. 接收客户端请求

解析:DAO 层只负责存取数据(MyBatis Mapper / XML),不含业务判断、不碰视图;业务在 Service,展示在 Controller/View。

mysql-basics-1

关于 MySQL 里 emp_name 用 varchar(22)、gender 用 char(2) 的选型,正确的是( )

A. varchar 和 char 完全一样,可任意互换B. char 是定长、varchar 是变长;姓名长度可变用 varchar,性别定长用 char 更省C. char 只能存数字,varchar 才能存中文D. int 型列也要写成 varchar 才能存编号

解析:char 定长、varchar 变长。姓名长度可变(用 varchar),性别基本定长(M/F/男/女,用 char 省空间)。类型选型看数据是否定长与取值范围。

mysql-basics-2

emp_id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY(emp_id) 的含义是( )

A. emp_id 必须手工指定一个不重复的值B. emp_id 由数据库自动递增发号,作为主键,INSERT 时不能指定、UPDATE 时不能修改C. emp_id 允许为空,插入时可省略D. emp_id 是字符串编号

解析:AUTO_INCREMENT 让数据库自动为每行发递增编号;作为主键它唯一且非空。因此 INSERT 不能手工指定它、UPDATE 不能改它。

mysql-basics-3

下面哪条 SQL 是「查」语句(DML-SELECT)?

A. INSERT INTO tbl_emp(emp_name) VALUES('李四')B. CREATE TABLE tbl_dept(dept_id int PRIMARY KEY)C. SELECT * FROM tbl_emp WHERE department_id = 1D. DROP TABLE tbl_emp

解析:SELECT 是查询语句(DML)。INSERT 是增、CREATE/DROP 是 DDL(定义结构),都不是查。

mysql-basics-4

关于 UPDATE / DELETE,正确的是( )

A. 可以不带 WHERE,直接改/删整张表B. 必须带 WHERE 条件,否则会误改/误删整张表C. UPDATE 只能改主键列D. DELETE 删除后数据自动恢复

解析:不带 WHERE 的 UPDATE/DELETE 会作用于整张表(全改/全删),极危险。教学与生产都要求必须带 WHERE 条件。

mysql-basics-5

tbl_emp.department_id 指向 tbl_dept.dept_id,本课程不建物理外键,称之为( )

A. 主键B. 逻辑外键:值域对应 dept_id,但数据库不强制,一致性由应用层保证C. 自增列D. 默认值约束

解析:逻辑外键只在语义/应用层表示关联,数据库不加 FOREIGN KEY 强约束。好处是灵活(删部门不必先删员工)、校验放业务层更好测。

mysql-basics-6

为什么课程表一律加 DEFAULT CHARSET=utf8?

A. utf8 能让查询更快B. 指定字符集为 utf8,避免存中文出现乱码C. utf8 是 MySQL 唯一支持的字符集D. utf8 能自动给表加密

解析:建库建表指定 DEFAULT CHARSET=utf8,是为了正确存储/显示中文,避免默认字符集导致乱码。这是课程所有表的统一约定。

mysql-basics-7

CREATE USER 'hrm'@'localhost' ...; GRANT SELECT,INSERT,UPDATE,DELETE ON shrmssm.* TO 'hrm'@'localhost'; 体现了( )

A. DDL 建表B. 最小权限原则:应用账号只给 DML 权限,不给 DROP/CREATE 等 DDLC. 数据备份D. 事务回滚

解析:GRANT 属于 DCL(控制权限)。只授予 SELECT/INSERT/UPDATE/DELETE(DML),把建表删库(DDL)留给 DBA,是「最小权限原则」。

jdbc-basics-1

JDBC 五步的正确顺序是( )

A. 关闭 → 连接 → 语句 → 执行 → 取结果B. 加载驱动 → 建立 Connection → 造 Statement/PreparedStatement → 执行 → 读 ResultSet → 逐级关闭C. Connection → 驱动 → ResultSet → Statement → 关闭D. 执行 → 连接 → 驱动 → 关闭 → 取结果

解析:标准五步:加载驱动 → 建立 Connection → 造 Statement/PreparedStatement → 执行(executeQuery/Update)→ 用 rs.next() 读 ResultSet → 由内向外逐级关闭。

jdbc-basics-2

关于 JDBC 四大接口,正确的是( )

A. 它们都由 Java 实现,与数据库无关B. 接口声明在 java.sql/javax.sql,具体实现由数据库厂商驱动提供——这是多态落点C. ResultSet 负责建立连接D. Connection 负责逐行读取结果

解析:Driver/Connection/Statement/ResultSet 都是接口,Java 面向接口编程,实现类由 MySQL 等厂商驱动提供。换库只需换驱动,业务代码基本不动——多态的价值。

jdbc-basics-3

INSERT / UPDATE / DELETE 应使用哪个方法?返回值是( )

A. executeQuery(),返回 ResultSetB. executeUpdate(),返回受影响行数C. execute(),返回布尔值D. query(),返回 int

解析:增删改用 executeUpdate(),返回受影响的行数;SELECT 用 executeQuery(),返回 ResultSet。

jdbc-basics-4

下面哪种写法能防 SQL 注入?

A. String sql = "SELECT * FROM t WHERE name='" + userInput + "'";B. PreparedStatement ps = conn.prepareStatement("SELECT * FROM t WHERE name=?"); ps.setString(1, userInput);C. 把 userInput 直接拼进 SQL 再 executeQueryD. 用 Statement 拼接字符串

解析:? 占位符 + setString 把用户输入只当「值」绑定,数据库不会把它当 SQL 代码执行,天然防注入。字符串拼接则可能被 ' OR '1'='1 之类破坏。

jdbc-basics-5

JDBC 资源正确的关闭顺序是( )

A. Connection → Statement → ResultSetB. ResultSet → Statement → Connection(由内向外)C. Statement → Connection → ResultSetD. 随意,顺序无所谓

解析:ResultSet 依赖 Statement、Statement 依赖 Connection,须由内向外逐级关。try-with-resources 会按声明的逆序自动关闭,最省心。

jdbc-basics-6

try (Connection conn = ...; PreparedStatement ps = ...) { try (ResultSet rs = ...) {...} } 的好处是( )

A. 执行更快B. 自动按声明逆序关闭资源,省去手动判空与 finally,不易漏关C. 能自动防 SQL 注入D. 能自动提交事务

解析:try-with-resources(Java 7+)让实现了 AutoCloseable 的资源在块结束时自动按声明逆序 close(),省去手写 finally 与判空,避免资源泄漏。

jdbc-basics-7

手写 JDBC 的三大痛点中,MyBatis 用「XML/注解声明 SQL + 自动映射对象」主要解决的是( )

A. 数据库安装太慢B. 模板重复与手动把 ResultSet 映射成对象的繁琐C. 浏览器渲染慢D. MySQL 字符集乱码

解析:JDBC 痛点是:五步模板重复、rs.getXxx() 手映射、无动态 SQL。MyBatis 用声明式 SQL + 自动结果映射 + 资源管理把这些封装掉,底层仍是 JDBC。

05-mybatis-1

MyBatis 中 DAO 接口方法能直接执行 SQL,靠的是( )

A. Controller 手动 new 出数据库连接B. 浏览器直接访问数据库C. JSP 把方法名拼进 URLD. MyBatis 为 Mapper 接口生成动态代理对象,调用时执行对应 XML 里的 SQL

解析:MyBatis 用动态代理给每个 @Mapper 接口生成代理对象;调用接口方法时,代理按 namespace+方法名定位到 XML 里的 SQL 去执行。

05-mybatis-2

#{} 占位符的特点是( )

A. 只在 <foreach> 里可用B. 用于动态表名拼接C. 把参数直接拼进 SQL 字符串D. 转成预编译的 ? 并绑定进 PreparedStatement,能防 SQL 注入

解析:#{} 是安全的预编译占位符:MyBatis 把它转成 ? 并把参数绑定进 PreparedStatement,避免 SQL 注入;${} 才是字符串直接拼接。

05-mybatis-3

"${}" 占位符适合用于( )

A. 关联对象映射B. 声明事务C. 所有参数绑定D. 动态表名、列名、排序字段等无法参数化的场景(有注入风险)

解析:"${}" 是字符串直接拼接,适合动态表名/列名/ORDER BY 字段这类不能当参数绑定的场景,但要注意 SQL 注入风险。

05-mybatis-4

<where> 标签的作用是( )

A. 把结果集映射成对象B. 开启数据库事务C. 声明这是一个查询语句D. 自动处理首个 and/or 前缀,避免手写 where and ...

解析:<where> 只在其中的 <if> 条件有内容时才输出 where,并自动去掉第一个条件前的多余 and/or。

05-mybatis-5

<foreach> 标签常用于( )

A. 配置数据源B. 注册 Mapper 接口C. 声明 resultMapD. 遍历集合生成 IN (...) 或批量插入的多个 values

解析:<foreach> 遍历传入的集合/数组,拼出 IN (a,b,c) 或 insert ... values (...),(...) 这类需要重复片段的 SQL。

05-mybatis-6

resultType 与 resultMap 的区别是( )

A. resultType 用于写 SQL,resultMap 用于执行 SQLB. resultMap 只能映射单表C. 没有区别,可以互换D. resultType 在列名=属性名时自动映射;resultMap 显式声明 column→property,支持 association/collection

解析:列名与属性名一致时用 resultType 自动映射即可;需要处理列名≠属性名或关联对象(association/collection)时用 resultMap 显式声明。

05-mybatis-7

resultMap 里的 <association> 用来( )

A. 拼接动态 SQLB. 绑定 #{} 参数C. 把多行结果映射成 ListD. 把查询出的相关列映射进一个关联对象(一对一)

解析:<association> 处理一对一关联:把若干列映射进某个属性指向的对象,如 Word.user。多对一则用 <collection>。

05-mybatis-8

一次 Mapper 方法调用的正确顺序是( )

A. proxy → call → map → locate → bind → executeB. locate → call → bind → proxy → map → executeC. map → execute → bind → locate → proxy → callD. call → proxy → locate → bind → execute → map

解析:先调用接口方法(call),动态代理拦截(proxy),定位 XML 里的 SQL(locate),绑定参数(bind),执行得到结果集(execute),最后映射成对象(map)。

springboot-basics-1

SpringBoot 引入 spring-boot-starter-web 后,会自动带入什么?

A. 只带 spring-core 一个包B. Web MVC + 内嵌 Tomcat + Jackson 等一整套 Web 能力C. 需要再手工引 Tomcat 的 jarD. 只带数据库连接池

解析:starter 把「某类能力所需的一组依赖」打包:spring-boot-starter-web 一次性带入 Web MVC、内嵌 Tomcat、Jackson 等,版本由 BOM 统一托管。

springboot-basics-2

SSM 里 spring.xml 负责的「组件扫描 + 数据源 + 声明式事务」,在 Boot 中对应( )

A. WebMvcAutoConfigurationB. MybatisAutoConfigurationC. @ComponentScan + DataSourceAutoConfiguration + TransactionAutoConfigurationD. ServletWebServerFactoryAutoConfiguration

解析:spring.xml 的三项职责分别由组件扫描(@SpringBootApplication 内含)、数据源自动配置、事务自动配置接管,不再手写 <context:component-scan> 等。

springboot-basics-3

SSM 里 spring-mvc.xml 装配 DispatcherServlet 与注解驱动,Boot 中由谁完成?

A. DataSourceAutoConfigurationB. WebMvcAutoConfigurationC. MybatisAutoConfigurationD. TransactionAutoConfiguration

解析:WebMvcAutoConfiguration(spring-boot-starter-web)自动注册 DispatcherServlet、映射处理器与消息转换器,省去 spring-mvc.xml。

springboot-basics-4

SSM 里 mybatis-config.xml 配置 SqlSessionFactory,Boot 中由谁完成?

A. WebMvcAutoConfigurationB. DataSourceAutoConfigurationC. MybatisAutoConfiguration(mybatis-spring-boot-starter)D. TransactionAutoConfiguration

解析:MybatisAutoConfiguration 按 DataSource 自动建 SqlSessionFactory、扫 @Mapper,省去 mybatis-config.xml 的手工装配。

springboot-basics-5

SSM 需要 web.xml 声明 DispatcherServlet/Filter 并依赖外部 Tomcat;Boot 里 web.xml 被省掉的原因是( )

A. Boot 不支持 FilterB. 内嵌 Servlet 容器随应用一起启动,不再需要 web.xml 与外部容器C. Boot 把 web.xml 改名叫 application.xmlD. web.xml 在 Boot 里由用户手写

解析:Boot 内嵌 Tomcat(ServletWebServerFactoryAutoConfiguration),容器随应用启动,容器级组件靠注解/自动配置注册,整个 web.xml 省掉。

springboot-basics-6

相比 SSM「打 war 丢进外部 Tomcat」,Boot 的典型部署方式是( )

A. 仍需安装外部 Tomcat 并部署 warB. java -jar 单文件(内嵌 Tomcat)C. 把 class 文件拷到服务器D. 用 Applet 方式发布

解析:Boot 把 Tomcat 内嵌进 fat-jar,部署退化为 java -jar app.jar,环境一致性由 jar 自身保证。

springboot-basics-7

对 SpringBoot 最准确的定位是( )

A. 一个全新的 Web 框架,取代 Spring/SpringMVC/MyBatisB. 把 SSM 的手写装配自动化:约定大于配置的「全自动档」C. 只用于数据库访问的 ORMD. 一种前端渲染引擎

解析:Boot 不是新框架,而是把 Spring + SpringMVC + MyBatis 的手写配置交给自动配置类——M4/M5/M8 学的都还在,只是装配被自动化了。

06-ssm-integration-1

SSM 中负责「业务层」(IoC + 事务)的框架是( )

A. SpringMVCB. SpringC. MyBatisD. JDBC

解析:Spring 负责业务层:用 IoC 容器装配 Bean、@Service 封装业务、@Transactional 管理事务。SpringMVC 管 Web 层,MyBatis 管持久层。

06-ssm-integration-2

@Transactional 的作用是( )

A. 声明这是一个 ControllerB. 声明式事务:方法正常返回提交、抛异常回滚,无需手写 commit/rollbackC. 配置数据源连接池D. 把 SQL 写进 XML

解析:@Transactional 由 Spring 的事务拦截器处理:进入方法开事务,正常结束提交,抛出运行时异常则回滚。通常加在 Service 层。

06-ssm-integration-3

applicationContext.xml 与 springmvc-servlet.xml 的关系是( )

A. 两者完全独立,互相看不到对方B. 前者是 Spring 根容器,后者是它的 Web 子容器,子容器能看到根容器的 BeanC. 前者管持久层,后者管业务层D. 两者都是 MyBatis 的配置

解析:applicationContext.xml(ContextLoaderListener 加载)是根容器,springmvc-servlet.xml(DispatcherServlet 加载)是 Web 子容器;子容器能访问根容器的 Bean,所以 Controller 能注入 Service/DAO。

06-ssm-integration-4

一次「保存留言」请求的正确调用链是( )

A. Controller → Mapper → Service → 数据库B. 浏览器 → DispatcherServlet → Controller → Service → Mapper → 数据库C. DispatcherServlet → Mapper → Controller → ServiceD. Service → Controller → Mapper → 浏览器

解析:请求先到 DispatcherServlet,分发到 Controller;Controller 调 Service(业务+事务),Service 调 Mapper(持久层),Mapper 执行 SQL 写库。

06-ssm-integration-5

sqlSessionFactory 的作用是( )

A. 渲染 JSP 视图B. MyBatis 的工厂:创建 SqlSession,是 MyBatis 一切功能的入口C. 注册 @ControllerD. 管理 HTTP 会话

解析:sqlSessionFactory 由 applicationContext.xml 配置(指向 mybatis-config.xml),负责创建 SqlSession,是 MyBatis 持久层的入口。

06-ssm-integration-6

SSM 分层架构的主要好处是( )

A. 让浏览器访问更快B. 每层只依赖下一层接口,替换持久层实现不影响上层,事务只需在 Service 声明一次C. 减少数据库表数量D. 免去配置数据源

解析:分层让各层职责清晰、可独立替换(如 MyBatis↔JPA);事务集中在 Service 层声明,Controller 与持久层都不必关心事务细节。

07-ssm-hrm-1

开发一个完整的 SSM 人事系统,第一步应该做什么?

A. 直接写 Mapper XMLB. 需求分析(明确功能模块与数据表)C. 部署到 TomcatD. 配置数据源

解析:开发流程从需求分析开始——先明确三大功能模块与两张数据表,再依次做表设计、四层开发、部署测试;跳过需求直接写代码是初学者最常见的弯路。

07-ssm-hrm-2

SHrmSSM01B 中定义 tbl_dept / tbl_emp 两张表的文件是

A. shrmssm.sqlB. applicationContext.xmlC. DepartmentMapper.xmlD. web.xml

解析:shrmssm.sql 是数据库脚本(CREATE DATABASE + CREATE TABLE + 示例数据),部署前先导入 MySQL;Mapper XML 只写 SQL 语句,不负责建表。

07-ssm-hrm-3

DepartmentMapper.xml 里 resultMap 的作用是

A. 配置数据源B. 把表列显式映射到实体属性C. 定义事务管理器D. 扫描 Mapper 接口

解析:dept_id→deptId 等:列名与属性名不一致(下划线 vs 驼峰)时靠 resultMap 显式映射;若完全一致,用 resultType 即可。

07-ssm-hrm-4

SHrmSSM01B 中 MapperScannerConfigurer 扫描的 Mapper 接口包是

A. com.hrms.controllerB. com.hrms.beanC. com.hrms.mapperD. com.hrms.service

解析:MyBatis.xml 里 basePackage="com.hrms.mapper"——Mapper 接口统一放 mapper 包;controller 包由 springmvc.xml 扫描,两者互不干扰。

07-ssm-hrm-5

MyBatis.xml 中 SqlSessionTemplate 配置了 executorType=BATCH,它是

A. 简单执行模式(逐条执行)B. 批量执行模式C. 复用执行模式D. 缓存模式

解析:BATCH 把同类 SQL 命令攒成一批再执行,提升批量增删改性能;单条操作场景 SIMPLE 足够。

07-ssm-hrm-6

人事系统部署到 Tomcat 时,WEB 应用应放在哪个目录?

A. webapps/B. conf/C. bin/D. logs/

解析:Tomcat 对 webapps/ 下每个目录自动部署并解析其中的 web.xml;放 conf/bin/logs 都不会被当作 Web 应用。

08-advanced-extension-1

Spring Data JPA 中,定义一个继承 JpaRepository 的接口后,常用 CRUD 方法

A. 需要手写 SQLB. 由框架按约定自动生成 / 提供C. 必须配 XML 映射文件D. 只能查不能写

解析:Spring Data 通过 Repository 抽象 + 方法名约定(如 findByEmail)自动生成常用 CRUD 与查询,省去 MyBatis 的 Mapper+XML;复杂查询仍可下沉到 JPQL / 原生 SQL。

08-advanced-extension-2

Thymeleaf 相比 JSP 的一个显著优点是

A. 运行速度更快B. 页面是合法 HTML(自然模板),浏览器可直接预览C. 不需要任何表达式D. 只能配合 Spring Boot

解析:Thymeleaf 的 th:* 属性写在合法 HTML 里,未渲染时也是标准页面,便于预览与维护;JSP 混入 Java 代码无法直接当 HTML 打开。

08-advanced-extension-3

JSP 中 EL 表达式 ${param.name} 的作用是

A. 调用一个 Java 方法B. 从请求参数作用域取 name 的值C. 声明一个局部变量D. 引入 JSTL 标签库

解析:EL(${...})从 request / session / application 等作用域取值,param.name 即请求参数 name;它替代 <%= %>,把取值从 Java 程序片里抽出来。

08-advanced-extension-4

Spring IoC 能扫描 @Component 并按 @Autowired 注入,底层依赖

A. 线程池B. 反射 + 注解C. JSP 引擎D. 数据库连接池

解析:容器用反射在运行时读取类 / 方法上的注解(@Component、@Autowired),据此决定创建与装配哪些 Bean;没有反射,注解只是编译期标记,无法被动态读取。

08-advanced-extension-5

Java 泛型 List<String> 在运行时是

A. 仍完整保留 String 类型信息B. 被擦除成裸 List,元素按 Object 处理C. 自动转成数组D. 直接编译失败

解析:Java 泛型采用类型擦除:运行期 List<String> 就是 List,取出元素时编译器插入强转;因此不能 new T()、也不能 instanceof List<String>。