Servlet

目录

实现Servlet

Servlet方法

就绪/服务方法(处理请求数据)

销毁方法

初始化方法

HttpServletRequest对象

常用方法 

        获取请求时的完整路径(从http开始,到“?”前面结束)

        获取请求时的部分路径(从项目的站点名称开始,到“?”前面结束)

        获取请求时的参数字符串(从“?”后面开始,到最后的字符串)

         获取请求方式(GET和POST)

        获取当前协议的版本(HTTP/1.1)

        获取项目的站点名(项目对外访问路径)

        获取请求的参数

请求乱码问题

请求转发    

request作用域

        设置域对象的内容

        获取域对象内容

        删除域对象内容

HttpServletResponse对象

 响应数据

 字符流响应数据乱码

 字节流响应数据乱码

重定向

 重定向与请求转发的区别

Cookie对象

cookie的创建和发送

cookie的获取

cookie的到期时间

cookie的注意点

 cookie的路径

HttpSession对象

Session对象

        获取Session对象

        获取session的会话标识符

        获取session的创建时间

        获取最后一次访问时间

        判断是否是新的session对象

Session域对象

设置域对象

获取域对象

移除域对象

request和session的作用域

      请求转发

       重定向

Session的销毁

      1.默认到期时间

      2.手动设置到期时间

      3.立即销毁

      4.关闭浏览器失效

      5.关闭服务器失效

ServletContext对象

获取ServletContext对象

         1.通过request对象获取

         2.通过session对象获取

         3.通过ServletConfig对象获取

         4.通过Servlet直接获取

常用方法:

          1.获取当前服务器的版本信息

          2.获取项目的真实路径

文件上传

前台代码

后台代码

文件下载

前台代码

后台代码



 

实现Servlet


        1.创建普通的Java类
        2.实现Servlet的规范,继承HttpServlet
        3.重写service方法,用来处理请求
        4.设置注解,指定访问的路径(以下方式任选其一)

                @WebServlet("/ser01")        (最常用)

                @WebServlet(name = "Servlet01",value = "/ser01")

                @WebServlet(name = "Servlet01",value = {"/ser01","/ser001"})                 

                @WebServlet(name = "Servlet01",urlPatterns = {"/ser01","/ser001"})

package com.xxxx.servlet;



import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ser01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //打印内容在控制台
        System.out.println("Hello Servlet!");
        //通过流输出数据到浏览器
        resp.getWriter().write("Hello Servlet!");
    }
}


  • Servlet方法

  • 就绪/服务方法(处理请求数据)


                系统方法,服务器自动调用
                当有请求到达Servlet时,就会调用该方法,方法可以被多次调用。

@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet被调用了.....");
    }
  • 销毁方法

                系统方法,服务器自动调用
                当服务器关闭或应用程序停止时,调用该方法,方法只会执行一次。

 @Override
    public void destroy() {
        System.out.println("Servlet被销毁了.....");
    }
  • 初始化方法

                系统方法,服务器自动调用
                当请求到达Servlet容器时,Servlet容器会判断该Servlet对象是否存在,如果不存在,则创建实例并初始化,方法只会执行一次。

@Override
    public void init() throws ServletException {
        System.out.println("Servlet被创建了.....");
    }

  • HttpServletRequest对象

常用方法

        获取请求时的完整路径(从http开始,到“?”前面结束)


                    request.getRequestURL();


        获取请求时的部分路径(从项目的站点名称开始,到“?”前面结束)


                    request.getRequestURI();


        获取请求时的参数字符串(从“?”后面开始,到最后的字符串)


                     request.getQueryString();


         获取请求方式(GET和POST)


                     request.getMethod();


        获取当前协议的版本(HTTP/1.1)


                     request.getProtocol();


        获取项目的站点名(项目对外访问路径)


                     request.getContextPath();


        获取请求的参数


                  获取指定名称的参数值
                             request.getParameter("参数名");
                  获取指定名称的参数的所有参数值,返回字符串数组(用于复选框传值)
                             request.getParameterValues("参数名");

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*常用方法*/
        //获取请求时的完整路径(从http开始,到“?”前面结束)
        String url = request.getRequestURL() + "";
        System.out.println("获取请求时的完整路径:" + url);
        //获取请求时的部分路径(从项目的站点名称开始,到“?”前面结束)
        String uri = request.getRequestURI() + "";
        System.out.println("获取请求时的部分路径:" + uri);
        //获取请求时的参数字符串(从“?”后面开始,到最后的字符串)
        String queryString = request.getQueryString();
        System.out.println("获取请求时的参数字符串:" + queryString);
        //获取请求方式(GET和POST)
        String method = request.getMethod();
        System.out.println("获取请求方式:" + method);
        //获取当前协议的版本(HTTP/1.1)
        String protocol = request.getProtocol();
        System.out.println("获取当前协议的版本:" + protocol);
        //获取项目的站点名(项目对外访问路径)
        String webapp = request.getContextPath();//上下文路径
        System.out.println("获取项目的站点名:" + webapp);

        /*获取请求的参数*/
        //获取指定名称的参数值
        String uname = request.getParameter("uname");
        String upwd = request.getParameter("upwd");
        System.out.println("uname" + uname + ",upwd" + upwd);

        //获取指定名称的参数的所有参数值,返回字符串数组(用于复选框传值)
        String[] hobbys = request.getParameterValues("hobby");
        //判断数组是否为空
        if (hobbys != null && hobbys.length > 0) {
            for (String hobby : hobbys){
                System.out.println("爱好:"+hobby);
            }
        }

    }
}

请求乱码问题

请求方式Tomcat8以上版本Tomcat7及以下版本
GET请求不会乱码

会乱码

new String(req.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");

POST请求会乱码,通过设置服务器解析编码格式,req.setCharacterEncoding("UTF-8");会乱码,通过设置服务器解析编码格式,req.setCharacterEncoding("UTF-8");


POST请求:无论什么版本中文都会乱码req.setCharacterEncoding("UTF-8");

        1.req.setCharacterEncoding("UTF-8");只针对POST请求
        2.new String(req.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");针对任何形式请求,但数据本身不乱码使用会乱码


请求转发    

        request.getRequestDispatcher(url).forward(request,response);
        可以让请求从服务端跳到客户端(或跳转到指定Servlet)
特点:
         1.服务端行为
         2.地址栏不发生改变
         3.从始至终只有一个请求
         4.request数据可以共享


request作用域


      通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。(请求转发跳转时有效)


        设置域对象的内容


              request.setAttribute(String name,Object value);
     

        获取域对象内容


              request.getAttribute(String name);
     

        删除域对象内容


              request.removeAttribute(String name);


  • HttpServletResponse对象

 响应数据


              response.getWriter();                         字符输出流(输出字符串)
             
 response.getOutputStream()           字节输出流(输出一切数据)


              两种流不可同时使用,同时使用会报错

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //getWriter()         字符输出流(输出字符串)
        //获取字符输出流
       /* PrintWriter writer=response.getWriter();
        writer.write("Hello");*/

        //getOutputStream()   字节输出流(输出一切数据)
        //得到字节输出流
        ServletOutputStream out=response.getOutputStream();
        //输出
        out.write("Hi".getBytes());
    }
}

 字符流响应数据乱码


      原因:
                  响应必定乱码,服务端编码默认使用ISO-8859-1格式,该编码不支持中文
      解决:
                  1.设置服务端编码格式
                              response.setCharacterEncoding("UTF-8");
                  2.设置客户端的编码格式
                              response.setHeader("content-type","text/html;charset=UTF-8");
                  总结:设置服务端和客户端的编码都支持中文,且保持一致
                  同时设置服务端和客户端编码格式:
                   response.setContentType("text/html;charset=UTF-8");

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


@WebServlet("/s02")
public class Servlet02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*//设置服务端编码格式
        response.setCharacterEncoding("UTF-8");
        //设置客户端的编码格式
        response.setHeader("content-type","text/html;charset=UTF-8");*/

        //同时设置服务端和客户端编码格式
        response.setContentType("text/html;charset=UTF-8");

        //getWriter()         字符输出流(输出字符串)
        //获取字符输出流
        PrintWriter writer=response.getWriter();
        writer.write("<h2>你好</h2>");

    }
}

 字节流响应数据乱码


     原因:
                    服务端与客户端编码不一致

     解决:

                同时设置服务端和客户端编码格式:
                 response.setContentType("text/html;charset=UTF-8");

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/s03")
public class Servlet03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //同时设置服务端和客户端编码格式
        response.setContentType("text/html;charset=UTF-8");

        //getOutputStream()   字节输出流(输出一切数据)
        //得到字节输出流
        ServletOutputStream out=response.getOutputStream();
        //输出
        out.write("<h2>你好</h2>".getBytes("UTF-8"));
    }
}

重定向

        response.sendRedirect("重定向地址");
  特点:
          1.服务端指导,客户端行为
          2.存在两次请求
          3.地址栏会发生改变
          4.request对象不共享


 重定向与请求转发的区别


      1.请求转发的地址啦不会发生改变,重定向的地址栏会发生改变
      2.请求转发只有一次请求,重定向有两次请求
      3.请求转发时request对象可共享,重定向时request对象不共享
      4.请求转发是服务端行为,重定向是客户端行为
      5.请求转发时的地址只能是当前站点(项目)下的资源,重定向可以是任何地址


  • Cookie对象

cookie的创建和发送

                cookie的创建

                                Cookie cookie=new Cookie("参数名","参数值");

                cookie的发送

                                response.addCookie(cookie);

package com.xxxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/cook01")
public class Cookie01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Cookie的创建
        Cookie cookie=new Cookie("name","admin");
        //发送Cookie对象
        response.addCookie(cookie);
    }
}

cookie的获取

                        Cookie[] cookies=request.getCookies();
                                返回的是cookie数组。

package com.xxxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/cook02")
public class Cookie02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Cookie的获取
        Cookie[] cookies=request.getCookies();
        //判断cookie是否为空
        if(cookies!=null&&cookies.length>0){
            //遍历cookie数组
            for (Cookie cookie : cookies) {
                //获取cookie的名称和值
                String name=cookie.getName();
                String value=cookie.getValue();
                System.out.println("名称:"+name+"值:"+value);
            }
        }

    }
}

cookie的到期时间

        负整数
                  默认值-1,表示只在浏览器中存活,关闭浏览器失效
        正整数
                  表示存活指定秒数,会将数据存在硬盘中
        零
                 表示删除cookie

package com.xxxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/cook03")
public class Cookie03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*到期时间:负整数(默认值-1,表示只在浏览器中存活,关闭浏览器失效)*/
        Cookie cookie=new Cookie("uname1","zhangsan");
        cookie.setMaxAge(-1);//关闭浏览器失效
        response.addCookie(cookie);

        /*到期时间:正整数(表示存活指定秒数,会将数据存在硬盘中)*/
        Cookie cookie2=new Cookie("uname2","lisi");
        cookie2.setMaxAge(30);//存活30秒
        response.addCookie(cookie2);

        /*到期时间:零(表示删除cookie)*/
        Cookie cookie3=new Cookie("uname3","wangwu");
        cookie3.setMaxAge(0);//删除cookie
        response.addCookie(cookie3);

    }
}

cookie的注意点


1.cookie只在当前浏览器中有效(不跨浏览器和电脑)
2.cookie不能存中文
     如果一定要存中文,则需要通过URLEncoder.encode()方法进行编码,获取时通过URLDecoder.decode()方法进行解码
3.如果出现同名的cookie对象则会覆盖
4.cookie的存储数量是有上限的,不同浏览器上限不同。cookie的大小也是有限制的,在4KB左右

package com.xxxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;


@WebServlet("/cook04")
public class Cookie04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //Cookie存中文
        String name = "姓名";
        String value = "张三";

        //将中文通过URLEncoder.encode()进行编码
        name = URLEncoder.encode(name);
        value = URLEncoder.encode(value);

        //创建cookie
        Cookie cookie = new Cookie(name, value);
        //响应cookie
        response.addCookie(cookie);

        //获取cookie时,通过URLEncoder.encode()进行解码
        Cookie[] cookies = request.getCookies();
        //判断非空
        if (cookies != null&&cookies.length>0) {
            //遍历
            for (Cookie cookie1 : cookies) {
                //解码
                System.out.println(URLDecoder.decode(cookie1.getName()));
                System.out.println(URLDecoder.decode(cookie1.getValue()));
            }
        }

        //将原来已有的cookie对象重新设置
        Cookie cookie2=new Cookie("name","zhangsan");
        response.addCookie(cookie2);


    }
}

 cookie的路径


      1.当前服务器下任何项目的任意资源都可获取cookie对象
          设置路径为“/”,表示当前服务器下任何项目都可访问cookie对象
      2.当前项目下的资源可获取cookie对象(默认不设置cookie的path)
          默认不设置cookie的path,或设置为当前站点名
      3.指定项目下的资源可获取cookie对象
          设置为指定项目的站点名
      4.指定目录下的资源可获取cookie对象
          设置为指定项目目录下的资源

      总结:只有访问的路径中包含cookie对象的path值,才可以获取到该cookie对象

package com.xxxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;


@WebServlet("/cook05")
public class Cookie05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*当前服务器下任何项目的任意资源都可获取cookie对象*/
        Cookie cookie01=new Cookie("cookie01","cookie01");
        //设置路径为“/”,表示当前服务器下任何项目都可访问cookie对象
        cookie01.setPath("/");
        response.addCookie(cookie01);


        /*当前项目下的资源可获取cookie对象(默认不设置cookie的path)*/
        Cookie cookie02=new Cookie("cookie02","cookie02");
        //默认不设置cookie的path,或设置为当前站点名
        cookie02.setPath("/cookie04");
        response.addCookie(cookie02);


        /*指定项目下的资源可获取cookie对象*/
        Cookie cookie03=new Cookie("cookie03","cookie03");
        //设置为指定项目的站点名
        cookie03.setPath("/servlet03");
        response.addCookie(cookie03);


        /*指定目录下的资源可获取cookie对象*/
        Cookie cookie04=new Cookie("cookie04","cookie04");
        //设置为指定项目目录下的资源
        cookie04.setPath("/cookie04/cook02");
        response.addCookie(cookie04);

    }
}


  • HttpSession对象

Session对象

        获取Session对象

          当获取session对象时会判断session对象是否存在,如果存在,则获取session对象;如果不存在,则创建session对象。
                    HttpSession session=request.getSession();


        获取session的会话标识符


                    session.getId();


        获取session的创建时间


                    session.getCreationTime();


        获取最后一次访问时间


                    session.getLastAccessedTime();


        判断是否是新的session对象


                    session.isNew();

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;


@WebServlet("/ses01")
public class Session01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Session对象
        HttpSession session=request.getSession();

        //获取session的会话标识符
        String id=session.getId();
        System.out.println(id);
        //获取session的创建时间
        System.out.println(session.getCreationTime());
        //获取最后一次访问时间
        System.out.println(session.getLastAccessedTime());
        //判断是否是新的session对象
        System.out.println(session.isNew());

    }
}

Session域对象

设置域对象


      session.setAttribute("属性名","属性值");

获取域对象


      session.getAttribute("属性名");

移除域对象


      session.removeAttribute("属性名");


request和session的作用域

      请求转发


                  一次请求
                                request作用域有效
                                session作用域有效


       重定向


                  两次请求
                                request作用域无效
                                session作用域有效


Session的销毁


      1.默认到期时间


                  tomcat默认30分钟无操作销毁


      2.手动设置到期时间


                  通过session.setMaxInactiveInterval(int);设置最大不活动时间,单位为秒
                  通过session.getMaxInactiveInterval();方法来查看最大不活动时间


      3.立即销毁


                  session.invalidate();让session立即失效


      4.关闭浏览器失效


                  session底层依赖cookie,cookie默认只在浏览器内存中存活,关闭浏览器即失效


      5.关闭服务器失效


                  session销毁


  • ServletContext对象

获取ServletContext对象


         1.通过request对象获取


                         request.getServletContext();


         2.通过session对象获取


                         request.getSession().getServletContext();


         3.通过ServletConfig对象获取


                         getServletConfig().getServletContext();


         4.通过Servlet直接获取


                         getServletContext();


常用方法:


          1.获取当前服务器的版本信息


                              request.getServletContext().getServerInfo();


          2.获取项目的真实路径


                              request.getServletContext().getRealPath("/");

package com.xxxx.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //通过request对象获取
        ServletContext servletContext1=request.getServletContext();

        //通过session对象获取
        ServletContext servletContext2=request.getSession().getServletContext();

        //通过ServletConfig对象获取
        ServletContext servletContext3= getServletConfig().getServletContext();

        //直接获取
        ServletContext servletContext4=getServletContext();

        //常用方法
        //1.获取当前服务器的版本信息
        String serverInfo=request.getServletContext().getServerInfo();
        System.out.println("当前服务器的版本信息:"+serverInfo);
        //2.获取项目的真实路径
        String realPath=request.getServletContext().getRealPath("/");
        System.out.println("项目的真实路径:"+realPath);

    }
}


  • 文件上传

前台代码

文件上传
        1.准备表单
        2.设置表单的提交类型为POST请求    method="POST"
        3.设置表单类型为文件上传表单     enctype="multipart/form-data"
        4.设置文件提交的地址
        5.准备表单元素
            1.普通的表单项    type="text"
            2.文件项         type="file"
        6.设置表单元素的name属性值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="uploadServlet">
    姓名:<input type="text" name="uname"><br>
    文件:<input type="file" name="myfile"><br>
    <button>提交</button>
</form>

</body>
</html>

后台代码

文件上传需要添加注解@MultipartConfig
 (需要JDK1.8、Dynamic Web Module 3.0才可以使用。
 如果版本较低那么只能使用Apache的jar包,也就是现在SpringMVC中支持的文件上传。)
 将POST请求封装成Part对象。

package com.xxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;


@WebServlet("/uploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件上传....");
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");

        //设置普通表单项(获取参数)
        String uname=request.getParameter("uname");
        System.out.println("uname:"+uname);

        //获取Part对象
        Part part=request.getPart("myfile");
        //通过Part对象得到上传的文件名
        String fileName=part.getSubmittedFileName();
        System.out.println("上传的文件名:"+fileName);
        //得到文件存放的路径
        String filePath=request.getServletContext().getRealPath("/");
        System.out.println("文件存放的路径"+filePath);
        //上传文件到指定目录
        part.write(filePath+"/"+fileName);

    }
}


  • 文件下载

前台代码

超链接下载
            当使用超链接(a标签)时,如果遇到浏览器能识别的资源,会显示内容,否则会进行下载。
        download属性
            通过download属性规定浏览器进行下载,设置download的属性值可以作为文件名

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <!--浏览器能识别的资源-->
    <a href="download/test.txt">文本文件</a>
    <a href="download/1.jpg">图片文件</a>
    <!--浏览器不能识别的资源-->
    <a href="download/test.zip">压缩文件</a>
    <hr>
    <a href="download/test.txt" download>文本文件</a>
    <a href="download/1.jpg" download="图片.jpg">图片文件</a>

    <hr>
    <form action="downloadServlet">
      文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
      <button>下载</button>
    </form>

</body>
</html>

后台代码

1.需要通过response.setContentType方法设置Content-type头字段的值为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,
                  例如"application/octet-stream""application/x-msdownload"等。
 2.需要通过response.setHeader方法设置Content-Disposition头的值为"attachment;filename=文件名"
 3.读取下载文件,调用response.getOutputStream方法向客户端写入附件内容。

package com.xxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;


@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件下载....");


        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //获取参数(得到要下载的文件名)
        String fileName=request.getParameter("fileName");
        //参数的非空判断       trim()去除字符串前后空格
        if (fileName == null||"".equals(fileName.trim())) {
            response.getWriter().write("请输入要下载的文件名");
            response.getWriter().close();
            return;
        }
        //得到图片存放的路径
        String path=request.getServletContext().getRealPath("/download/");
        //通过路径得到file对象
        File file=new File(path+fileName);
        //判断文件对象是否存在,并且是标准文件
        if(file.exists()&&file.isFile()){
            //设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的MIME类型)
            response.setContentType("application/x-msdownload");
            //设置响应头
            response.setHeader("Content-Disposition","attachment;filename=" + fileName);
            //得到fil文件的输入流
            InputStream inputStream=new FileInputStream(file);
            //得到字节输出流
            ServletOutputStream outputStream=response.getOutputStream();
            //定义byte数组
            byte[] bytes=new byte[1024];
            //定义长度
            int len=0;
            //循环输出
            while ((len=inputStream.read(bytes))!=-1){
                //输出内容
                outputStream.write(bytes,0,len);
            }
            //关闭资源
            outputStream.close();
            inputStream.close();
        }else{
            response.getWriter().write("文件不存在,请重试!");
            response.getWriter().close();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟火9092

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值