栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet入门及其基本用法(下载文件,上传文件,BaseServlet)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet入门及其基本用法(下载文件,上传文件,BaseServlet)

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。(百度百科)

目录

下载文件:

上传文件:

 baseServlet功能:

请求转发与重定向


 


下载文件:

设置好response的相应头格式

response.setContentType("application/force-download");
response.setHeader("Content-Disposition","attachment;filename=""+filename+""");

关于响应头格式csdn上有很多优秀博主有详细介绍: @大小鱼鱼鱼与鱼.

文件的读取位置没放对很头疼,我把文件放置在这个位置:

@WebServlet( "/downServlet")
public class DownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        OutputStream out;
        InputStream in;
        ServletContext servletContext = getServletContext();
      

        String filename = request.getParameter("filename");//获取请求文件名
        if(filename==null){
            out= response.getOutputStream();
            out.write("Please input filename".getBytes("utf-8"));
            out.close();
            return;
        }
        in=servletContext.getResourceAsStream("/WEB-INF/img/" +filename);//这里文件的路径要注意写对
        //设置响应正文的MIME类型
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition","attachment;filename=""+filename+""");

        out= response.getOutputStream();
        int len=0;
        byte[]bys=new byte[1024];
        while((len=in.read(bys))!=-1){
            out.write(bys,0,len);//将输入流写到页面上
        }
        in.close();
        out.close();

        in= ServletContext.class.getResourceAsStream("/img/"+filename);

    }


}

html页面很简陋




    
    down


  点击下载图片1 
点击下载图片2

效果:

上传文件:

使用fileuploadjar包配合 IO jar包,里面有工厂类.

同样要上传文件位置也要写对,这里我直接用绝对路径能省点事.

    private String filePath="E:\develop\files\store";//文件放置目录
    private String tempFilePath="E:\develop\files\store";//临时目录
@WebServlet("/upload")
public class upload extends HttpServlet {
    private String filePath="E:\develop\files\store";//文件放置目录
    private String tempFilePath="E:\develop\files\store";//临时目录
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println("被访问了...");//测试
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        PrintWriter outNet = response.getWriter();
        try {
            //创建一个基于硬盘的fileitem工厂
            DiskFileItemFactory factory=new DiskFileItemFactory();
            //设置想硬盘写数据时所用的缓冲区的大小 此处4M
            factory.setSizeThreshold(4*1024*1024);
            //设置临时目录
            factory.setRepository(new File(tempFilePath));

            //创建一个文件上传处理器
            ServletFileUpload upload=new ServletFileUpload(factory);
            //设置允许上传的文件的最大尺寸 此处4M
            upload.setSizeMax(4*1024*1024);
            List Items=null;
            //解析request对象的复合表单数据 返回一个fileItem对象的List集合
            request.setCharacterEncoding("utf-8");
            Items = upload.parseRequest(request);
            Iterator iter=Items.iterator();
            while(iter.hasNext()){
                //遍历该集合 拿到数据
                FileItem item=(FileItem) iter.next();
                if(item.isFormField()){
                    //处理普通的表单域
                    processFormField(item,outNet);
                }
                else {
                    //处理上传文件
                    processUploadFile(item,outNet);
                }
            }
            outNet.close();
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void processFormField(FileItem item, PrintWriter outNet) {
        String name = item.getFieldName();//获取表单域的名字
        String string = item.getString();//获取表单域
        outNet.println(name+":"+string+"rn");
    }
    private void processUploadFile(FileItem item, PrintWriter outNet) throws Exception {
        String Filename = item.getName();//获取包括路径在内的文件名字
        int index = Filename.lastIndexOf("\");
        Filename=Filename.substring(index+1,Filename.length());//分割得到文件名
        long size = item.getSize();

        if(Filename.equals("")&&size==0)return;//不存在就直接return
        File uploadFile=new File(filePath+"/"+Filename);//创建一个新文件
        item.write(uploadFile);//写入新文件

        outNet.println(Filename+"is saved");
        outNet.println("The size of "+Filename+" is "+size/1000+" kbrn");
    }


}

html页面也是写得比较简陋,只为实现功能

注意请求头格式:enctype="multipart/form-data"




    
    upload


    
User Name:
Upload File1:
Upload File2:

效果:

看看效果:可以看到上传成功了.

硬盘目录也出现这两个上传的文件了:

 baseServlet功能:

减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。也就是说写一个Servlet就够了,其他的servlet写成方法就可以直接访问.原理是反射-->反射的基本使用

关于baseServlet详细介绍:@阿顾同学

public class baseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String requestURI = req.getRequestURI();//获取请求的路径
//        System.out.println(requestURI);//   /userServlet/add
        //获取方法名
        String methodName = requestURI.substring(requestURI.lastIndexOf('/') + 1);
//        System.out.println(methodName);  //add
//        System.out.println(this);//web.servlet.UserServlet@38e182e5
        //可以看到这里的this是从URL过来的对象而不是这个baseServlet
        try {
            //通过反射获取方法
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this,req,resp);//这里的this是访问它的那个方法

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

}

下面的cookie测试servlet 和请求转发/重定向就是用了baseServlet.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270957.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号