20201110 王维

学习总结

1 文件下载

在 servlet3.0 之前,文件上传需要借助两个jar包才能完成。(分别是:Apache Commons IO和 Apache Commons FileUpload). servlet3.0 之后,在 servlet 中支持了文件上传操作,并提供了 Part 类来简化文件操作。

基于servlet3.0的文件上传:

首先,我们需要将 html/jsp 文件中添加文件选择框( input[type='file'] ),并将 form 表单的编 码方式修改为 multipart/form-data 。注意:此时表单的提交方式只能是 post

示例:

<form class="form-horizontal col-lg-6 col-lg-offset-3" action=""
method="post"
enctype="multipart/form-data">
<!-- 省略其他代码 -->
<input type="file" class="form-control" placeholder="IMG" name="img">
</form>

然后将表单提交的 servlet 中添加 @MultipartConfig 注解,表示 servlet 支持文件上传。

servlet 示例:

//跳转路径
@WebServlet("/doRegister")
//支持文件上传
@MultipartConfig(maxFileSize = 1024 * 1024, fileSizeThreshold = 1024 * 10,
location = "d://temp")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取上传文件
        Part part = req.getPart("img");
        //判断文件大小,如果大于0表示有文件存在
        if (part.getSize() > 0){
            //获取文件类型
            String contentType = part.getContentType();
            //定义一个支持文件类型
            String allowTypes = "image/png;image/jpeg;image/jpg";
            String[] types = allowTypes.split(";");
            if(Arrays.asList(types).contains(contentType)){
                System.out.println("支持此文件类型:" + contentType);
            }else{
                System.out.println("不支持此文件类型:" + contentType);
            }
            //获取文件名
            String fileName = part.getSubmittedFileName();
            /**
            * 保存路径:
            * 1. 保存到web文件夹下
            * 方法:
        part.write(req.getServletContext().getRealPath("/static/img") + File.separator + fileName);
            * 缺点:项目重新部署时,需要将这些文件手动复制到其他位置。否则有可能丢失文件
            * 2. 保存到数据库中,但一般不会保存到mysql或oracle这样的数据库。一般是MongoDB这样的数据库
            * 3. 保存到服务器磁盘(目前推荐这种方式)
            * 方法如下:
            */
            //定义服务器磁盘路径,也就是文件的保存路径
            String localPath = "D:\\temp\\upload";
            part.write(localPath + File.separator + fileName);
            resp.getWriter().print("文件上传成功");
        }
    }
}

Part :

InputStream getInputStream() 获取文件流

String getContentType() 获取文件类型

String getName() 获取Part对象名称,即提交文件的 input[name]

String getSubmittedFileName() 获取提交文件名称

long getSize() 获取文件大小

void write(String var1) 将文件输出到 var1

void delete() 删除 Collection getHeaders(String var1) 获取文件头

Collection getHeaderNames() 获取文件头名称

String getHeader(String var1) 获取文件头

2 解决全站乱码

浏览器发出的任何请求,通过过滤器统一处理中文乱码。

1.创建一个过滤器。 2.因为对所有的请求进行乱码的过滤,所以过滤器的过滤路径配置为 /* 3.针对 post 请求处理乱码

代码为:

package com.bao.demo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.WebEndpoint;
import java.io.IOException;

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 设置编码格式
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        // 将请求放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

心得体会

今天主要是对项目的三层架构进行了熟悉,然后对登录的业务和更换用户信息的业务进行了熟悉,可能一个业务在感觉上不难,但是实际动手起来就很容易出现各种问题,其中包括了对编译工具的不熟悉和各种不细心导致的代码错误和缺漏,然后才是个别的逻辑问题。

标签

评论

this is is footer