一、getRequestDispatcher
request.getRequestDispatcher().forward(request,response);
请求转发(RequestDispatcher)的过程:
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
二、WebServlet注解
@WebServlet(name = "AdminStudentAdd", value = "/admin/student/add")
WebServlet用于映射servlet与浏览器(jsp页面表单或者地址栏)的地址请求
三、文件处理
-
表单的 enctype 属性
在 HTML 中用于定义在提交表单时发送到服务器的数据编码类型。它告诉浏览器如何将表单数据发送到服务器,特别是当涉及到文件上传时。
enctype 属性可以有以下几个值:
application/x-www-form-urlencoded(默认值):这是 HTML 表单的默认编码方式。当你不使用文件上传,并且表单数据只包含 ASCII 字符时,通常使用这个值。在提交表单时,浏览器会将表单数据编码为名称/值对,并使用 URL 编码(也称为百分比编码)对特殊字符进行转义。
multipart/form-data:这个值用于包含文件上传的表单。当表单包含 <input type="file"> 元素时,应该使用这个编码类型。浏览器会将表单数据编码为一条消息,该消息由多个部分组成,每个部分都是一条 MIME 消息,包含表单的一个字段。这使得可以发送二进制数据,如文件内容。
text/plain:这个值不常用,并且不被所有的浏览器支持。它表示数据应该作为纯文本发送,而不进行任何编码或转义。
在大多数情况下,如果你只是发送文本数据,那么 application/x-www-form-urlencoded 就足够了。但是,如果你需要上传文件,或者你的表单数据包含非 ASCII 字符(如中文字符)并且你不想在服务器端进行额外的解码,那么 multipart/form-data 可能是更好的选择。
注意:当使用 multipart/form-data 编码类型时,表单的提交方法(method 属性)必须是 POST,因为 GET 方法不支持这种类型的编码。
-
在servlet中要添加注解@MultipartConfig
你可以指定以下参数:
location:文件上传的临时存储位置。如果未指定,则使用 Servlet 容器的默认位置。
maxFileSize:允许上传的单个文件的最大大小(以字节为单位)。如果未指定,则使用 Servlet 容器的默认大小。
maxRequestSize:整个请求的最大大小(包括所有文件和表单数据)。如果未指定,则使用 Servlet 容器的默认大小。
fileSizeThreshold:一个阈值,表示何时开始将数据写入磁盘。如果文件上传的内容小于这个阈值,则整个文件都会保留在内存中。如果未指定,则使用 Servlet 容器的默认值。
- 文件处理的方法
Part filePart = request.getPart("pic"); //获得文件
String newfileName = "";
//得到上传的文件名与文件大小并做判断
if (filePart != null && filePart.getSize() > 0) {
//判断文件类型
String fileName = filePart.getSubmittedFileName(); //得到文件名
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); //得到文件后缀
if (!suffix.equals("jpg") && !suffix.equals("jpeg") && !suffix.equals("png") && !suffix.equals("gif") && !suffix.equals("bmp")) {
response.getWriter().println("<script>alert('请上传图片格式的文件');history.back();</script>");
return;
}
newfileName = UUID.randomUUID() + name + "." + suffix; //文件重命名
filePart.write(ResourceBundle.getBundle("config").getString("uploadPath") + newfileName);
String sql = "INSERT INTO `data0622`.`animal` (name, gender, type, pic, hobby, addTime, introduction) VALUES (?, ?, ?, ?, ?, ?, ?)";
DB.executeUpdate(sql, name, gender, type, newfileName, hobbyString, System.currentTimeMillis(), introduction);
response.getWriter().println("<script>alert('添加成功');location.href='/admin/animal/list';</script>");
} else {
response.getWriter().println("<script>alert('未选择图片或者文件大小为0');history.back();</script>");
}