7.1 Servlet响应
Servlet响应是指服务器端的Servlet处理完客户端请求后,向客户端发送HTTP响应的过程。在Servlet中,通过HttpServletResponse对象来控制和构建响应内容。
- 设置响应状态码:使用
response.setStatus()方法设置HTTP响应的状态码,如200(成功)、404(未找到)等。
response.setStatus(HttpServletResponse.SC_OK);
- 设置响应头信息:通过
setHeader()或addHeader()方法设置响应头,例如Content-Type、Cache-Control等。
response.setContentType("text/html; charset=UTF-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
- 写入响应体:可以使用
getWriter()获取PrintWriter对象,或者使用getOutputStream()获取ServletOutputStream对象,然后将要返回的内容写入响应体。
PrintWriter out = response.getWriter();
out.println("<html><body>Hello, World!</body></html>");
7.2 Servlet获取客户端参数
在Servlet中,可以通过HttpServletRequest对象从客户端请求中获取各种参数,包括URL查询参数、POST表单数据、multipart/form-data上传的数据等。
- 获取GET请求参数:
String value = request.getParameter("paramName");
-
获取POST请求参数: POST请求中的参数获取方式与GET相同,因为
getParameter()方法会自动根据请求类型读取相应参数。 -
获取多个值的参数: 当一个参数名对应多个值时,可以使用
getParameterValues()返回一个字符串数组。
String[] favColors = request.getParameterValues("favColor");
7.3 Servlet接受表单数据
当用户通过HTML表单提交POST请求到Servlet时,Servlet需要解析并处理这些数据。
- 表单示例:
<form action="processForm" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="Submit" />
</form>
- 在Servlet中处理表单数据:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 对用户名和密码进行验证或其他处理...
// 向客户端发送响应
}
如果表单包含文件上传,还需要额外处理multipart/form-data类型的请求,通常会使用Apache Commons FileUpload库或其他类似工具帮助处理上传文件。
7.4 Servlet处理文件上传
在Servlet中处理文件上传通常涉及解析multipart/form-data类型的请求。Apache Commons FileUpload库是一个常用的工具,可以帮助开发者方便地从HTTP请求中读取并处理上传的文件。
以下是一个使用Commons FileUpload处理文件上传的基本步骤:
- 引入依赖:首先需要在项目中引入Apache Commons FileUpload和IO库。
<!-- Maven配置 -->
<dependencies>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
- 创建Servlet并初始化DiskFileItemFactory(用于创建FileItem对象)和ServletFileUpload对象。
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
private final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存缓冲区大小,超过该大小则将数据临时写入磁盘
factory.setSizeThreshold(MEMORY_THRESHOLD);
// 设置临时文件存储路径
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大文件上传大小
upload.setSizeMax(MAX_FILE_SIZE);
// 设置整个请求的最大尺寸
upload.setFileSizeMax(MAX_REQUEST_SIZE);
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) { // 如果是文件字段
String fileName = item.getName();
// 进行文件保存操作,这里仅做示例,实际应用中需考虑安全性和目录结构等问题
File uploadedFile = new File(UPLOAD_DIRECTORY, fileName);
item.write(uploadedFile);
} else { // 如果是普通表单字段
String fieldName = item.getFieldName();
String fieldValue = item.getString();
// 处理普通表单字段数据...
}
}
} catch (Exception ex) {
// 处理上传过程中的异常
}
}
}
通过上述代码,Servlet能够接收并处理包含文件和其他表单字段的POST请求,并将上传的文件保存到服务器端指定的位置。同时,对上传文件的大小和整个请求的尺寸进行了限制,确保了服务端资源的有效利用和安全性。在实际开发中,还需注意处理文件重名、非法文件类型等问题。