## 1 简答题
### 1.1 简答题目一
ServletRequest 和 HttpServletRequest 有什么关系?
```html
答:HttpServletRequest 继承 ServletRequest
```
### 1.2 简答题目二
获取请求参数通用的方式有哪些?
```
答:getParameterMap() getParameterValues() getParameter()
```
### 1.3 简答题目三
请输出POST乱码的原因以及解决方式?
```
答:通过response对象获取的输出流的默认编码为iso-8859-1
```
### 1.4 简答题目四
请书写出请求转发的代码?描述请求转发路径是否加项目路径?
```
答:getRequestDispatcher() 不加
```
### 1.5 简答题目五
书写出重定向的代码?
```
答:sendRedirect()
```
### 1.6 简答题目六
在项目书写路径,什么时候需要加项目路径,什么时候不需要加项目路径?请举例说明?
```
答:浏览器使用的时候需要虚拟路径,例如:请求转发
服务端使用的时候不需要虚拟路径 例如:重定向 超链接 表单的提交
```
### 1.7 简答题目七
代码 `response.setContentType("text/html;charset=utf-8") ` 有哪些作用?
```
答:告诉浏览器,响应的数据是html语言写的,编码是utf-8
```
## 2 编码题
### 2.1 编码题目一
**训练目标:**
能通过request对象接收页面发送过来的数据,并解决post请求乱码
**需求描述:**
现需要做一个类似美团的后台管理系统。下图是菜品管理中的添加菜品页面,请编写servlet,并接收页面提交的数据保存到数据库表中,并给浏览器响应 `添加成功`
<img src="assets/image-20220129105757671.png" alt="image-20220129105757671" style="zoom:80%;" />
**素材:**
1. 创建菜品的sql语句如下
```sql
create table dish (
id int primary key auto_increment,
name varchar(32) comment '菜品名称',
price double comment '菜品价格',
description varchar(200) comment '描述信息'
);
```
2. 页面在 `素材\编码题目一` 中
**提示:**
1. 请求参数包含中文数据,需要解决乱码
2. 响应的数据是中文数据,需要解决响应数据乱码
**实现思路:**
1. 解决post请求乱码问题
2. 获取请求数据
3. 将获取到的浏览器提交的数据封装到实体类对象中
4. 调用mapper方法进行数据添加操作
5. 提交事务
6. 应添加数据成功标识
### 2.2 编码题目二
**训练目标:**
1. 能够使用response对象响应字节数据
2. 了解文件下载实现逻辑
**需求描述:**
我们在访问其他网站时,很多网站都有文件下载的功能。现需要做一个系统用来管理我们之前的软件包,对外提供软件包的下载功能,如下图所示是下载页面
<img src="assets/image-20220130000513436.png" alt="image-20220130000513436" style="zoom:80%;" />
请编写servlet实现文件下载功能,需要满足如下要求
1. 将素材下的 `download` 放到 `D` 盘下,下载的文件从 `D:\\download` 下读取
2. 文件下载需要设置一个响应头 `Content-Disposition` ,其值为 `attachment;filename=test.txt` 。其中的 `test.txt` 是下载时再浏览器上展示的文件名,需要将该文件名改为动态的,即下载哪个文件,展示的就是那个文件名
**素材:**
1. 初始工程已经提供好了,在 `素材\编码题目二\初始工程` 中有一个 `download-demo` 的工程。在该工程中的webapp下有一个 `download.html` 页面,此页面是文件下载页面,内容如下
![image-20220130001058566](assets/image-20220130001058566.png)
2. `素材\编码题目二\软件包` 下的 `download` 文件夹是用于下载的文件【软件包】
**提示:**
1. 从素材的图片可以看出,文件下载的servlet的资源路径是 `/download`
2. 浏览器在发送文件下载请求时会携带者 `filename` 参数,该参数值是要下载的文件名
**实现思路:**
1. 获取请求提交的要下载的文件名
2. 创建输入流指向于 `D:\\download\\` 下的指定的文件
3. 设置 `Content-Disposition` 响应头 。如: `resp.setHeader("Content-Disposition","attachment;filename=mysql-5.7.24-winx64.zip");`
4. 通过response对象获取输出流对象
5. 读写数据
6. 释放资源