2024-06-10
大学课程
00

目录

1 网页开发基础
1.1 填空题
1.2 简答题
1.3 编程题
2 Java Web概述
2.1 填空题
2.2 简答题
3 Servlet基础
3.1 填空题
3.2 简答题
4 请求和响应
4.1 填空题
4.2 简答题
5 Servlet高级
5.1 填空题
5.2 简答题
6 JDBC
6.1 填空题
6.2 简答题
7 数据库连接池和DBUtils工具
7.1 填空题
7.2 简答题
8 文件上传与下载
8.1 填空题
8.2 简答题

2024年6月10日,Web体系结构与程序设计课程期末复习。

题型:

  1. 填空题(每空2分,共50分)
  2. 简答题(每题5分,共20分)
  3. 编程题(每题10分,共30分)

1 网页开发基础

1.1 填空题

  1. HTML是英文(Hyper Text Markup Language)的缩写。
  2. <body>标记用于定义HTML文档所要显示的内容,也称为(主体标记)。
  3. 在表格标记中用于设置是否显示边框的属性是(boarder)。
  4. 引入CSS的方式有4种,分别为(嵌入式)、行内式(也称为内联样式)、(链接式)和导入式。
  5. W3C中将DOM标准分为3个不同的部分:(核心DOM)、(XMLDOM)和(HTMLDOM)。
  6. 在input控件中,当type值为(text)时,表示的是单行文本输入框。
  7. 用来定义下拉列表的是(select)控件 。
  8. 在CSS中,用于设置行间距的属性是(line-height)。
  9. 在CSS中,用于定义字体风格,如设置斜体、倾斜或正常字体的属性是(font-style)。
  10. 内嵌式是将CSS代码集中写在HTML文档的(head)标记中,并且用(css)标记定义。
  11. <input />标记有多个属性,其中(type)属性为其最基本的属性,用于指定不同的控件类型。
  12. (DOM)是一个表示和处理文档的应用程序接口(API),可用于动态访问、更新文档的内容、结构和样式。
  13. CSS基础选择器有三种,分别是标记选择器、类选择器、id选择器。
  14. 下列JavaScript语句中,能实现单击一个按钮时弹出一个消息框的是【 】。
  15. CSS用于设置HTML页面中的文本内容、图片的外形以及版面的布局等外观显示样式。
  16. var x=11; var y="number"; var m=x+y;,此时m的值为(11number)。

1.2 简答题

  1. 简述什么是CSS以及CSS的作用。

CSS(层叠样式表,Cascading Style Sheets)是一种用于描述HTML或XML等标记语言中元素如何呈现的样式语言。它通过选择器和属性来控制网页的布局、外观和交互效果。

  • 样式控制:CSS用于控制网页的样式,包括字体、颜色、背景、边框、布局等。通过定义样式规则,可以统一管理网页中的元素,使其呈现一致的外观。
  • 分离样式和内容:CSS可以将网页的样式与内容分离开来。通过将样式定义在CSS文件中,与HTML文档分离,使得网页结构更加清晰,易于维护和修改。
  • 响应式设计:CSS的强大之处在于其支持响应式设计。通过媒体查询、弹性布局和网格系统等功能,可以根据设备的不同特性(如屏幕大小、分辨率)为不同的设备提供适配的布局和样式,以实现响应式的网页设计。
  • 动画和过渡效果:CSS提供了丰富的动画和过渡效果的功能,可以通过定义关键帧动画、过渡效果和动画属性等,为网页添加生动、交互性的效果,提升用户体验。
  • 扩展性和继承性:CSS具有层叠和继承的特性,可以方便地扩展和继承样式规则。通过选择器的层叠机制,可以根据需要覆盖或继承已有的样式规则,实现灵活的样式控制和样式复用。
  1. 简述如何将单独的CSS文件引入到HTML页面中。
html
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="styles.css"> </head> <body> <!-- 页面内容 --> </body> </html>
  1. 请描述HTML、CSS、DOM、JavaScript分别表示的含义。

HTML(HyperText Markup Language)是一种标记语言,用于描述网页的结构和内容。它使用标签(例如<h1><p><div>等)来定义网页中的不同元素,如标题、段落、图像、链接等。HTML提供了一种结构化的方式来组织和呈现文本、图像和其他媒体内容。

CSS(Cascading Style Sheets)是一种样式表语言,用于描述HTML或XML等标记语言中元素的外观和布局。它通过选择器和属性来控制网页的样式,包括字体、颜色、背景、边框、布局等。CSS使得开发者可以将样式与内容分离,提供一种灵活、可重用的方式来美化和布局网页。

DOM(Document Object Model)是一种将HTML或XML文档表示为树状结构的API(应用程序编程接口)。它提供了一种访问和操作网页文档的方式。通过DOM,开发者可以使用JavaScript等编程语言来动态地创建、修改、删除和交互网页中的元素和内容。DOM将网页文档表示为一个节点树,每个节点都代表着文档中的一个元素、属性或文本等。

JavaScript是一种高级的、解释型的编程语言,用于为网页添加动态交互和功能。它可以直接嵌入到HTML文档中,通过与DOM和CSS配合使用,对网页进行动态操作和修改。JavaScript可以响应用户的事件(如点击、鼠标移动等),执行特定的代码逻辑,改变网页的状态、更新内容、处理表单数据、发送请求等。JavaScript也可以与服务器进行通信,实现与后端交互和数据处理。

1.3 编程题

  1. 请编写出一个HTML页面,令其输出hello world!~~,使用css将其字体设置为宋体红色。
html
<!DOCTYPE html> <html> <head> <style> /* CSS样式 */ body { font-family: "宋体", SimSun, sans-serif; /* 设置字体为宋体 */ color: red; /* 设置字体颜色为红色 */ } </style> </head> <body> <h1>hello world!~~</h1> </body> </html>
  1. 编写一个HTML页面,页面包含数字和按钮两部分,每次单击按钮可以使数字加一。
html
<!DOCTYPE html> <html> <head> <script> // 定义全局变量,用于存储数字 var count = 0; // 自增函数,每次点击按钮数字加一 function increment() { count++; document.getElementById("number").innerText = count; } </script> </head> <body> <h1>数字:<span id="number">0</span></h1> <button onclick="increment()">点击加一</button> </body> </html>

2 Java Web概述

2.1 填空题

  1. XML称为可扩展的标记性语言,格式良好的XML有且只能有(1)个根元素。
  2. Tomcat服务器的默认端口号是(8080)。
  3. 在XML文档中,元素一般是由开始标记,属性,(元素内容)和结束标记构成。
  4. 在HTTP的8种请求方式中,最常用的是(Get)和(Post)。
  5. 当访问一个Web应用程序时,如果没有指定资源名称,则会访问默认的页面(index.html)。
  6. 在HTTP协议中,(Refresh)头字段用于告诉浏览器自动刷新页面的时间。
  7. 服务器返回状态码是500,表示(Server Internal Error)。
  8. 在HTTP协议中,(Accept-Charset)头字段用于告知服务器,客户端所使用的字符集。
  9. 在HTTP协议中,一个完整的请求消息是由请求行、(消息头)和实体内容三部分组成。
  10. 在XML声明中,可以通过standalone属性来声明这个文档是否为独立的文档。默认情况下,standalone属性的值为(no)。
  11. 修改Tomcat端口号的文件server.xml位于($CATALINA_HOME/conf)目录中。
  12. 在HTTP协议中,请求头中(Referer)字段可以实现防盗链。

2.2 简答题

  1. 简述HTTP1.1协议的通信过程?

客户端向服务端发起请求,服务端处理请求并且返回给客户端,客户端视情况继续发送请求或关闭连接

  1. 简述5种Web开发的常见状态码及含义?
  • 200,请求成功
  • 202,Accept,服务器收到请求,但是并没有立即处理请求内容
  • 500,Internal Server Error,服务器发生内部错误
  • 403,Forbidden,请求资源被禁止
  • 404,Not Found,找不到请求资源
  • 204,No Content,服务器已经处理完请求内容,但是客户端不需要离开当前页面
  • 206,Partial Content,请求成功,且主体包含了客户端所请求的内容区间
  1. 请列举出Tomcat安装目录下的子目录,并对其进行简要说明?(至少列出5个)
  • bin,可执行文件
  • conf,配置文件
  • lib,库文件,jar包
  • logs,Tomcat服务器运行所产生的log
  • temp,Tomcat服务器运行所产生的临时文件
  • webapps,Tomcat要加载的应用程序
  • work,Tomcat服务器运行所产生的编译后文件,如jsp编译后的文件

3 Servlet基础

3.1 填空题

  1. 在Servlet开发中,实现了多个Servlet之间数据共享的对象是(ServletContext)。
  2. 在Servlet容器启动每一个web应用时,就会创建一个唯一的ServletContext对象,该对象和web应用具有相同的(生命周期)。
  3. ServletConfig对象是由(服务器)创建出来的。
  4. 在HttpServletResponse接口中,实现请求重定向的方法是(sendRedirect方法)。
  5. 用于监听ServletRequest对象生命周期的接口是(ServletRequestListener接口)。
  6. 一个<servlet-mapping>元素下配置多个<url-pattern>子元素能实现Servlet的多重映射。
  7. 一个Servlet可以映射多个虚拟路径。

注解映射的话要使用urlPatterns属性,传入字符串数组。

  1. getResource)方法用于返回映射到某个资源文件的URL对象。
String resourcePath = "/path/to/resource.txt"; URL resourceURL = context.getResource(resourcePath);```
  1. 用于根据虚拟路径得到文件的真实路径的方法是(getRealPath)。
  2. 用于设置ServletContext的域属性的方法是(setAttribute)。
  3. (context-param)是web.xml中配置初始化参数的标签。
  4. Servlet容器启动时,会为每个Web应用创建一个唯一的(ServletContext)对象代表当前Web应用。
  5. 在配置整个Web应用的初始化参数时,可在web.xml中配置(context-param)元素来实现。
  6. 当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到(SetvletConfig)对象中。
  7. 在web.xml文件中,一个<servlert-mapping>元素用于映射一个Servlet的对外访问路径,该路径也称为(URL pattern)。
  8. 在RequestDispatcher接口中,实现请求转发的方法是(forward)。
  9. 当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象。
  10. <session-timeout>标签指定的超时必须为一个整数,如果这个整数是为0或负整数,则session永远不会超时。
  11. 用于获取web.xml中<servlet-name>元素的值的方法是(getServletName)。

3.2 简答题

  1. 请简述什么是缺省Servlet,以及缺省Servlet的作用。

映射url为“/”的servlet,它的作用在于没有servlet可以和请求url匹配时提供服务。

  1. 简述ServletContext接口的三个主要作用。

充当servlet之间的共享内存;获取共享配置信息和初始化参数;通过该接口访问web应用程序级别的资源。

  1. 简述请求转发与重定向的异同?(至少写3点)
  • 相同:功能都是将当前请求跳转到另一个目标资源
  • 不同:重定向是客户端行为,转发是服务器行为;转发只能访问该web应用下的任意资源,重定向无限制。
  1. 编写一个servlet,实现统计网站被访问次数的功能。
  • 新建一个类ShowTimesServlet继承HttpServlet,重写doGet和doPost方法。
  • 在doPost方法中调用doGet方法,在doGet方法中实现统计网站被访问次数的功能,用户每请求一次Servlet,使访问次数times加1。
  • 获取ServletContext,通过它的功能记住上一次访问后的次数。
java
public class ShowTimesServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取ServletContext对象 ServletContext servletContext = getServletContext(); // 从ServletContext中获取访问次数 Integer times = (Integer) servletContext.getAttribute("visitTimes"); // 判断访问次数是否存在 if (times == null) { times = 1; // 若不存在,则初始化为1 } else { times += 1; // 若存在,则加1 } // 将访问次数存储到ServletContext中 servletContext.setAttribute("visitTimes", times); // 设置响应内容 response.setContentType("text/html"); response.getWriter().println("<h1>网站访问次数:" + times + "</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
  1. 请编写一段程序,使程序能读取该servlet的配置信息,从中获得参数名为encoding对应的参数值,并输出到页面上。
java
public class ConfigInfoServlet extends HttpServlet { private String encoding; public void init(ServletConfig config) throws ServletException { super.init(config); // 从配置文件中获取参数值 encoding = config.getInitParameter("encoding"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容 response.setContentType("text/html"); response.setCharacterEncoding(encoding); response.getWriter().println("<h1>Encoding: " + encoding + "</h1>"); } }

4 请求和响应

4.1 填空题

  1. HttpServletResponse接口的sendRedirect()方法,该方法的实质是生成(302)响应码和Location响应头,并发送给客户端。
  2. 所谓请求重定向,指的是Web服务器接受到客户端的请求后,又再次引导(客户端)重新发送请求,指定了一个新的资源路径。
  3. 当传输文本时,如果编码和解码使用的码表不一致,就会导致(乱码)问题。
  4. response对象的getOutputStream()和getWriter()方法都可以发送响应消息体,但两者是(互斥)的,同时使用将产生IllegalStateException异常。
  5. RequestDispatcher接口中,用于将请求从一个Servlet传递给另外的一个Web资源的方法是(forward)。
  6. 在HttpServletRequest接口中,用于返回请求消息的实体部分的字符集编码的方法是(getCharacterEncoding)。
  7. 请求包含指的是使用(include)方法将Servlet请求转发给其它Web资源进行处理,响应消息中既包含了当前Servlet又包含了其它Web资源的响应消息。
  8. 在HttpServletResponse接口中,定义了一个(sendRedirect)方法,用于实现请求重定向。
  9. 我们可以通过response.setHeader("(Refresh)","3")语句,使当前页面定时每3秒刷新一次。
  10. HttpServletResponse接口中,提供了一个(setCharacterEncoding)方法,该方法用于设置字符的编码方式。
  11. 当Servlet向客户端回送响应消息时,需要在响应消息中设置(响应体)。
  12. 通过请求转发来实现目标资源的访问是服务器内部的行为,对于客户端来说是(不可见的)请求过程。
  13. 在HttpServletRequest接口中,getParameterMap()方法的返回值是Map对象,该对象包含了(所有请求参数名称和对应的值)。
  14. 如果请求消息中包含有多个该指定名称的参数,getParameter()方法的返回值是(最后一)次服务器请求。
  15. 如果不能下载,则进入(web.xml)文件中设置,默认会话过期时间为30分钟。
  16. 使用Session技术时,实质上是服务器与客户端,通过set-cookie响应头及cookie请求头,传递(Session ID)属性来识别不同的客户端。
  17. Web应用中的会话指的是一个客户端与(服务端)之间连续发生的一系列请求和响应过程。
  18. Session是借助(Cookie)来传递ID属性的。
  19. 使用Cookie类中的(setMaxAge)方法会通知浏览器立即删除这个Cookie信息。

cookie.setMaxAge(0);

  1. Tomcat容器中如果将<session-timeout>元素中的时间值设置成0或一个负数,则表示会话永不超时。
  2. URL重写可以使用(HttpServletResponse)接口中,所提供的方法encodeURL(String url)和encodeRedirectURL(String url)来实现。
  3. Cookie技术用于将会话过程中的数据保存到(客户端)中,从而使浏览器和服务器可以更好地进行数据交互。
  4. Session的默认有效时长是(30分钟)。
  5. Session是一种将会话数据保存到(服务)端的技术。
  6. 当服务器向客户端发送Cookie时,其实质是在HTTP响应头字段中增加(Set-Cookie)响应头字段信息。
  7. Servlet API中提供了一个javax.servlet.http.Cookie类,该类提供了操作Cookie的属性与方法,Cookie类有且仅有一个构造方法,public Cookie(String name, String value)
  8. 若想修改Tomcat服务器的默认会话时间,则需要进入(web.xml)文件中修改。
  9. 用于强制使Session对象无效的方法是(invalidate)。
  10. 当存在Session对象直接返回,否则返回null的方法是(getSession)。
  11. 能够用于获取客户端所有cookie对象的方法是(getCookies)。

4.2 简答题

  1. 简述Cookie与Session的区别。
  • cookie在客户端,session在服务端。
  • cookie只能存字符串,session不限制存储类型
  • 安全策略不同,cookie在客户端明文存储,比session更不安全
  • 可存储的大小不同,cookie只能存储4K大小
  1. 简述什么是会话技术?

会话技术由session和cookie共同支撑,它的作用在于在http无状态的基础上,使服务端能够获知发起请求的客户端的身份,从而维持服务端与该客户端的会话。

  1. 请设计一个类,使用Cookie技术实现显示用户上次访问时间的功能,要求如下:
  • 创建一个LastAccessServlet类,使其继承HttpServlet类并重写该类的doGet()方法。
  • 在doGet()方法中,使用request.getCookies()得到所有cookie形成的cookie数组,并进行遍历。
  • 如果遍历过程中找到cookie信息中存在lastAccess属性则输出,否则创建cookie对象设置值为当前时间并发送给客户端。
  • cookie的存活时间为1小时,访问当前应用中的所有资源客户端都回送cookie信息。
java
public class LastAccessServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Cookie[] cookies = request.getCookies(); Cookie lastAccessCookie = null; if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("lastAccess")) { lastAccessCookie = cookie; break; } } } if (lastAccessCookie != null) { String lastAccessTime = lastAccessCookie.getValue(); out.println("Last Access Time: " + lastAccessTime); } else { Cookie newCookie = new Cookie("lastAccess", new Date().toString()); newCookie.setMaxAge(3600); // 设置存活时间为1小时 response.addCookie(newCookie); out.println("Cookie has been set for the first time."); } } }
  1. 请编写一个类,该类使用HttpServletRequest对象的getHeader("referer")方法实现下载资源防盗链的功能。
  • 创建一个DownManagerServlet类,使其继承HttpServlet类并重写该类的doGet()方法。
  • 在doGet()方法中,使用HttpServletRequest对象的getHeader("referer")方法得到字段referer的值,并判断是否可以进行资源下载。
java
public class DownManagerServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String referer = request.getHeader("referer"); // 判断referer是否存在且符合条件 if (referer != null && referer.startsWith("http://www.example.com")) { // 可以进行资源下载 // 下载逻辑代码... response.getWriter().println("Downloading resource..."); } else { // 防盗链,禁止资源下载 response.getWriter().println("Access denied. Resource cannot be downloaded."); } } }

5 Servlet高级

5.1 填空题

  1. 为了实现统计网站当前在线人数,当用户登录成功将信息保存到session域中时,可以使用(HttpSessionListener)监听器在后台工作,以计算当前在线人数。
  2. 一个web.xml中可以配置(最少0个)个监听器。
  3. 用于监听HttpSession对象生命周期的接口是(HttpSessionListener)。
  4. 元素<dispatcher>的默认取值是(REQUEST)。
  5. 关于统计网站当前在线人数的计数器count变量应该保存的域范围是(监听器实例内部)。
  6. 能够返回Filter设置的所有初始化参数名称的方法是(getInitParameterNames)。
  7. 关于Filter链的执行顺序,是由web.xml文件中的哪个元素决定的(<filter-mapping>)。
xml
<filter-mapping> <filter-name>Filter1</filter-name> <url-pattern>/servlet1</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter2</filter-name> <url-pattern>/servlet1</url-pattern> </filter-mapping>
  1. <dispatcher>元素可以指定 Filter 拦截的资源被容器调用的方式。
  2. 新添加一个属性到(ServletRequest)域中,则所对应的监听器类要获得该值,可以使用ServletRequestAttributeEvent对象的方法。
  3. 当删除被监听对象中的一个属性时,Web容器调用事件监听器的(attributeRemoved)方法进行响应。
  4. 实现ServletContextAttributeListener接口的监听器类,可以用于监听(ServletContext)对象中的属性变更。
  5. 用于监听ServletRequest对象生命周期的接口是(ServletRequestListener)。
  6. 用于在web.xml中配置监听器的元素是(<listener>)。
  7. 一个Web应用程序中,Filter可以注册的次数是(多次)。
  8. 用于匹配拦截器所过滤的URL的元素是( <url-pattern>)。

5.2 简答题

  1. 简述Servlet事件监听器的作用(写出三点)
  • 对Servlet生命周期进行监听。
  • 对Servlet请求和响应进行监听。
  • 对Session实例进行监听。
  1. 简述过滤器的作用
  • 对请求进行预处理和过滤。
  • 对响应进行预处理和过滤。
  • 不修改目标资源的情况下,通过添加、配置和组合过滤器来实现功能和需求。
  1. 简述Filter的生命周期的过程

过滤器的生命周期和Web应用生命周期一致。包括init -> doFilter -> destroy三个阶段。

  1. 已知有一个名为MyServlet的程序,程序可向浏览器输出“Hello MyServlet”。请编写一个用于拦截MyServlet程序的MyFilter拦截器,要求如下:
  • 编写名为MyFilter的过滤器,过滤器可向浏览器输出“Hello MyFilter”。
  • 编写web.xml文件,配置MyFilter对MyServlet的拦截。
java
public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作(可选) } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在请求处理之前执行的逻辑 PrintWriter out = response.getWriter(); out.println("Hello MyFilter"); // 将请求传递给下一个过滤器或目标资源 chain.doFilter(request, response); // 在请求处理之后执行的逻辑(可选) } @Override public void destroy() { // 清理操作(可选) } }
xml
<filter> <filter-name>MyFilter</filter-name> <filter-class>MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/MyServlet</url-pattern> </filter-mapping>

6 JDBC

6.1 填空题

  1. ResultSet接口中的常量CONCUR_READ_ONLY,所代表的含义是(结果集是只读的,不可修改或更新)。
  2. ResultSet接口中,能将游标移动到此 ResultSet 对象的最后一行的方法是(last)。
  3. PreparedStatement是Statement的子接口,用于执行(预编译的参数化的)的SQL语句。
  4. Statement接口的executeUpdate(String sql)方法用于执行SQL中的insert、(update)和delete语句。
  5. JDBC常用API 中,(DriverManager)类用于加载JDBC驱动并且创建与数据库的连接。
  6. 可用于存储结果集的对象是(ResultSet)。
  7. 能够将游标从当前位置向下移一行的方法是(next)。
  8. Statement接口的方法中,用于执行各种SQL语句的是(execute)。
  9. 用于将参数化的SQL语句发送到数据库的方法是(execute,executeQuery,executeUpdate)。
  10. ResultSet接口中的常量TYPE_SCROLL_INSENITIVE,所代表的含义是(结果集可以通过游标滚动,并且对数据修改不敏感)。
  11. Statement提供了一个子接口(PreparedStatement),它可以实现SQL的预编译。
  12. ResultSet接口中定义了大量的getXXX()方法,如果使用字段的索引来获取指定的数据,字段的索引是从(1)开始的。
  13. Connection接口的(preparedStatement)方法用于创建一个PreparedStatement对象来将参数化的SQL语句发送到数据库。
  14. Statement接口中executeQuery()方法的返回值是(一个结果集)。
  15. ResultSet对象初始化时,游标在表格的第一行之前,需要调用(next)来开始遍历数据。

6.2 简答题

  1. 简述JDBC编程的6个开发步骤。
  • 注册驱动。
  • 连接数据库。
  • 创建Statement对象。
  • 执行SQL语句。
  • 处理结果集。
  • 关闭连接,释放资源。
  1. 请简述什么是JDBC。

Java Database Connectivity,是Java程序访问数据库的规范。它提供了一种统一的方式来访问不同数据库系统,使得开发者可以使用相同的编程接口与不同的数据库进行交互。通过JDBC规范,开发者可以编写与数据库无关的代码,从而实现数据库的连接、查询、更新等操作,并能够在不同数据库之间进行切换,而无需修改大部分的应用程序代码。

  1. 请编写一个用于读取数据库中users表信息的JDBC程序,要求分别获取字段id、name、password和email字段的值。
java
import java.sql.*; public class ReadUsersTable { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/db_name"; String username = "username"; String password = "password"; try { // 建立数据库连接 Connection connection = DriverManager.getConnection(url, username, password); // 创建查询语句 String query = "SELECT id, name, password, email FROM users"; Statement statement = connection.createStatement(); // 执行查询语句并获取结果集 ResultSet resultSet = statement.executeQuery(query); // 遍历结果集并获取字段值 while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); String password = resultSet.getString("password"); String email = resultSet.getString("email"); // 处理获取到的字段值 System.out.println("ID: " + id); System.out.println("Name: " + name); System.out.println("Password: " + password); System.out.println("Email: " + email); System.out.println("-------------------"); } // 关闭连接和资源 resultSet.close(); statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
  1. 请按照以下要求设计实现PreparedStatement对象的相关批处理操作。要求如下:
  • 指定所要执行的SQL语句如下:String sql = "INSERT INTO users(name,password) VALUES(?,?)";
  • 编写JDBCUtils工具类,类中要包含获取连接和释放资源的方法。
  • 编写Example02类,要求在类中使用JDBCUtils工具类获取连接和释放资源,并使用PreparedStatement对象批量添加5条记录。
java
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class JDBCUtils { private static final String url = "jdbc:mysql://localhost:3306/db_name"; // 替换成实际的数据库连接URL private static final String username = "username"; // 替换成实际的数据库用户名 private static final String password = "password"; // 替换成实际的数据库密码 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } public static void closeConnection(Connection connection) { if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
java
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class Example02 { public static void main(String[] args) { String sql = "INSERT INTO users(name, password) VALUES (?, ?)"; Connection connection = null; PreparedStatement preparedStatement = null; try { connection = JDBCUtils.getConnection(); preparedStatement = connection.prepareStatement(sql); // 设置参数并添加批处理 for (int i = 1; i <= 5; i++) { preparedStatement.setString(1, "User " + i); preparedStatement.setString(2, "password" + i); preparedStatement.addBatch(); } // 执行批处理 int[] result = preparedStatement.executeBatch(); // 输出批处理执行结果 for (int i : result) { System.out.println("Rows affected: " + i); } } catch (SQLException e) { e.printStackTrace(); } finally { // 释放资源 if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } JDBCUtils.closeConnection(connection); } } }

7 数据库连接池和DBUtils工具

7.1 填空题

  1. DBCP的全称是(DatabaseConnection Pool)。
  2. JDBC提供了(DataSource)接口,它负责与数据库建立连接,提供统一的标准数据源。
  3. 单独使用DBCP数据源时,需要在应用程序中导入(commons-dbcp2.jar)和(commons-pool2.jar)两个JAR包。
  4. 数据源对象的创建方式有两种,一种是通过(数据源实现类)直接创建数据源对象,另一种是通过(JNDI)创建数据源对象。
  5. C3P0的核心类是(ComboPooledDataSource)。
  6. 在ResultSetHandler接口中,提供了一个方法(handle),可以通过自定义一个实现ResultSetHandler接口的类,然后通过重写handle方法,实现结果集的处理。
  7. C3P0配置文件中(<named-config>)结点代表自定义配置,一个配置文件中可以有零个或多个的自定义配置。
  8. 我们可以使用(BasicDataSourceFactory)工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。
  9. 已知,存在QueryRunner对象runner, SQL语句:String sql = "select * from user where id = ?";下面操作中,能实现查询指定记录的语句是(User user = (User)runner.query(sql, new BeanHandler(User.class), new Object[]{id});)。

后面那个id是那个sql语句里面的占位符。

  1. DBUtils类中用于装载并注册JDBC驱动程序的方法是(Class.forName)。
  2. 将结果集中的第一行数据封装到一个对应的JavaBean实例中,可选择ResultSetHandler接口的(BeanHandler)子类。
  3. DBUtils类为了方便方法的调用 ,所提供的方法都是(静态)方法。
  4. C3P0的配置文件c3p0-config.xml必须放在工程的(classpath)目录下。
  5. ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。
  6. commons-dbutils类库封装了JDBC,由Apache组织提供,用于简化JDBC的编码工作量。
  7. 数据库连接池,可有效的解决频繁创建和断开Connection对象的操作,从而提高数据库的访问效率。
  8. 关于C3P0配置文件中<named-config>结点可出现多次。
  9. 用于设置dbcp连接池初始化连接数目的方法是(setInitialSize)。

7.2 简答题

  1. 简述数据库连接池的优点。

避免开发者忘记释放资源;加速对数据库的访问,,提高并发能力的同时,避免数据库因维持连接过多而崩溃。

  1. 请思考数据库连接池的工作机制是什么?

数据库连接池会维持一定数量的数据库连接,当应用程序需要连接来访问数据库时,就可以从连接池中获取连接。数据库连接池会对这些连接进行管理,确保每次给应用返回的都是可用的连接。当应用使用连接结束后,数据库连接池会重新将其分配给其他请求方。除此之外,数据库连接池还会对连接进行验证,超时处理,动态调整连接数,并且在最后关闭应用时自动销毁所有连接。

  1. 简述DriverManager和DataSource中的getConnection()方法的区别。

DriverManager每次需要手动进行配置,DataSource获取连接时,连接的配置和管理通常由连接池实现类来处理。并且DataSource相较于DriverManager,扩展性更好。

  1. 请按照以下要求设计一个程序,用于将表中的第一条记录相关数据封装到对象数组中。要求如下:
  • 首先向user表中插入一条记录:INSERT INTO user (id,name,password) VALUES (1,'zhangsan','123456');
  • 已知存在BaseDao类,且类中存在查询的query(String sql, ResultSetHandler<?> rsh, Object... params)方法。
  • 编写ResultSetTest类,使用ResultSetHandler的相关实现类将查询结果封装到对象数组,并在控制台输出结果。
java
public class ResultSetTest { public static void main(String[] args) { // 插入记录的SQL语句 String insertSql = "INSERT INTO user (id, name, password) VALUES (1, 'zhangsan', '123456')"; // 查询记录的SQL语句 String querySql = "SELECT * FROM user LIMIT 1"; // 执行插入记录操作 BaseDao.execute(insertSql); // 使用BeanListHandler来将结果封装为List<User>对象 ResultSetHandler<List<User>> handler = new BeanListHandler<>(User.class); // 执行查询操作并获取结果 List<User> userList = BaseDao.query(querySql, handler); // 输出结果 for (User user : userList) { System.out.println(user); } } }
  1. 请按照以下要求设计一个程序,用于将表中的所有数据封装到对象数组中。要求如下:
  • 已知表中的相关记录
mysql> SELECT * FROM user; | id | name | password | | 1 | zhangsan | 123456 | | 2 | lisi | 123456 | | 3 | wangwu | 123456 |
  • 已知BaseDao 类中存在查询的query(String sql, ResultSetHandler<?> rsh, Object... params)方法。
  • 编写ResultSetTest2类,使用ResultSetHandler的相关实现类将表中的所有记录封装到对象数组,并在控制台输出结果。
java
import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import java.util.List; public class ResultSetTest2 { public static void main(String[] args) { // 查询记录的SQL语句 String querySql = "SELECT * FROM user"; // 使用BeanListHandler来将结果封装为List<User>对象 ResultSetHandler<List<User>> handler = new BeanListHandler<>(User.class); // 执行查询操作并获取结果 List<User> userList = BaseDao.query(querySql, handler); // 输出结果 for (User user : userList) { System.out.println(user); } } }

8 文件上传与下载

8.1 填空题

  1. 如果下载的资源文件名为中文时,可以使用(URLEncoder)类来解决下载文件所产生乱码问题。
  2. 文件下载时,需指定的两个响应消息头是(Content-Disposition)和Content-Type。
  3. ServletFileUpload类的parseRequest()方法用于解析出FORM表单中的每个字段的数据,并且返回值是(FileItemIterator)类型。
  4. DiskFileItemFactory类用于将请求消息实体中的每一个文件封装成单独的(FileItem)对象。
  5. 文件上传时form表单的enctype属性取值是(multipart/form-data)。
  6. 设置所有上传文件的总大小的方法是(setSizeMax)。
  7. 用于判断请求消息中的内容是否是“multipart/form-data”类型的是(getContentType)。
  8. 用于读取上传文件类型的方法是(getContentType)。
  9. ServletFileUpload类的(isMultipartContent)方法,用于判断请求消息中的内容是否是“multipart/form-data”类型。
  10. 在文件上传过程中,(getInputStream)方法以流的形式返回上传文件的数据内容。
  11. ServletFileUpload类的parseRequest方法的返回值类型是(List<FileItem>)。
  12. 用于设置上传文件所保存的临时文件目录的方法是(setRepository)。
  13. 用于返回List<FileItem>类型集合的方法是(parseRequest)。
  14. 用于判断FileItem类对象封装的数据是否为普通文本表单字段的方法是(isFormField)。

8.2 简答题

  1. 请编写一个用于实现文件下载的程序,并且保证下载文件的文件名不能出现中文乱码问题。
java
import java.io.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FileDownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取要下载的文件路径和文件名(假设为filePath和fileName) String filePath = "/path/to/file"; // 文件路径 String fileName = "example.txt"; // 文件名 // 设置响应头 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + getEncodedFileName(request, fileName)); // 读取文件并写入响应输出流 try (InputStream inputStream = new FileInputStream(new File(filePath)); OutputStream outputStream = response.getOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } } // 获取编码后的文件名 private String getEncodedFileName(HttpServletRequest request, String fileName) throws UnsupportedEncodingException { String userAgent = request.getHeader("User-Agent"); boolean isIE = userAgent != null && userAgent.contains("MSIE"); if (isIE) { // IE浏览器使用URL编码 return java.net.URLEncoder.encode(fileName, "UTF-8"); } else { // 其他浏览器使用Base64编码 return new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); } } }
  1. 请按照以下要求设计一个实现文件上传的类UploadServlet。要求如下:
  • 已知form.html文件中form表单内定义了一个名为name的文本框及名为myfile的文件域,具备文件上传的前提条件。
  • 在doPost()方法中,写出文件上传的相关代码。
  • 上传的文件保存在当前应用程序的upload文件夹下。
java
import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.disk.DiskFileItemFactory; public class UploadServlet extends HttpServlet { private static final String UPLOAD_DIRECTORY = "/upload"; // 上传文件保存的目录 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (ServletFileUpload.isMultipartContent(request)) { // 创建文件项工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置临时文件存储目录 File tempDirectory = (File) getServletContext().getAttribute("javax.servlet.context.tempdir"); factory.setRepository(tempDirectory); // 创建文件上传处理器 ServletFileUpload fileUpload = new ServletFileUpload(factory); try { // 解析请求,获取文件项列表 java.util.List<FileItem> fileItems = fileUpload.parseRequest(request); for (FileItem item : fileItems) { if (!item.isFormField() && "myfile".equals(item.getFieldName())) { String fileName = new File(item.getName()).getName(); String filePath = getServletContext().getRealPath(UPLOAD_DIRECTORY) + File.separator + fileName; // 保存文件到指定目录 try (InputStream inputStream = item.getInputStream()) { Files.copy(inputStream, new File(filePath).toPath(), StandardCopyOption.REPLACE_EXISTING); } // 文件上传成功 response.getWriter().println("文件上传成功!"); } } } catch (FileUploadException e) { e.printStackTrace(); response.getWriter().println("文件上传失败!"); } } else { response.getWriter().println("无法处理该请求!"); } } }
  1. 实现文件上传的表单页面都需要哪些配置?
html
<form action="uploadServlet" method="post" enctype="multipart/form-data"> <!-- 文件上传表单项 --> <input type="file" name="myfile"> <!-- 其他表单项 --> <input type="text" name="name"> <!-- 提交按钮 --> <input type="submit" value="上传"> </form>
xml
<servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.example.UploadServlet</servlet-class> <multipart-config> <!-- 设置文件上传的最大大小,单位为字节 --> <max-file-size>1048576</max-file-size> <!-- 设置整个请求的最大大小,包括文件和其他表单项,单位为字节 --> <max-request-size>1048576</max-request-size> <!-- 设置临时文件存储路径 --> <location>/path/to/temp/directory</location> </multipart-config> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/uploadServlet</url-pattern> </servlet-mapping>

本文作者:御坂19327号

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!