过滤器、监听器、批量操作、文件上传下载

主要内容:
1、过滤器、监听器
2、批量修改、批量删除
3、DBUTILS的引入
4、JSTL和EL初识
5、文件的上传、下载

过程记录:
1、过滤器、监听器
(1)测试(15分钟),测试内容为:
2016-2017-1过滤器、监听器章节测试
考试说明:课前预习测试
一、单项选择题
1 通常情况下,过滤器、监听器、Servlet启动时间在于( )。
容器启动时 容器启动之后 需要使用这些WEB组件时
2 在一个WEB应用中,同时有Servlet、过滤器、监听器组件,它们的启动顺序如何?
Servlet–>过滤器–>监听器 Servlet–>监听器–>过滤器 监听器–>过滤器–>Servlet
3 若要对WebRoot/index.jsp页面进行过滤,则小节中的 ? 应该填写:( )
index.jsp /index.jsp WebRoot/index.jsp
4 过滤器的生命周期是:
实例化–>初始化–>过滤–>销毁 初始化–>实例化–>过滤–>销毁 初始化–>>过滤–>实例化–销毁
5 Web过滤器若不指定其类型,则它的类型为:
REQUEST FORWARD INCLUDE ERROR ASYNC
6 监听器监听ServletContext对象作用域的属性变化需要定义类实现( )接口?
ServletContextAttributeListener ServletRequestAttributeListener HttpSessionAttributeListener
7
监听器监听HttpSession对象作用域的属性变化需要定义类实现( )接口?
ServletContextAttributeListener ServletRequestAttributeListener HttpSessionAttributeListener
8 监听器监听ServletRequest对象作用域的属性变化需要定义类实现( )接口?
ServletContextAttributeListener ServletRequestAttributeListener HttpSessionAttributeListener
9 监听器监听ServletContext对象的生命周期需要定义类实现( )接口?
ServletContextListener ServletRequestListener HttpSessionListener
10 监听器监听HttpSession对象的生命周期需要定义类实现( )接口?
ServletContextListener ServletRequestListener HttpSessionListener
11 监听器监听ServletRequest对象的生命周期需要定义类实现( )接口?
ServletContextListener ServletRequestListener HttpSessionListener
12 若用监听器实现统计WEB网站在线人数,选择哪种对象作为被监听的对象?
session的创建和销毁 session作用域的属性增加与删除 session作域域存放数据的绑定与解绑 session对象的钝化与活化
13
专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时,立即采取相应的的行动,适用的WEB组件是:
过滤器 监听器 Servlet JSP页面
二、不定项选择题
14 J2EE6.0中,过滤器的分类有:
REQUEST FORWARD INCLUDE ERROR ASYNC
15 WEB监听器监听的对象有:
ServletContext(application) HttpSession(session) SevletRequest(request) PageContext(pageContext)
三、判断题
16 多个过滤器配置的所表示的资源范围没有交集时,能否形成过滤器链?
正确 错误
17 过滤器能否直接处理用户请求,给用户返回数据?
正确 错误
18 过滤器是否能改变用户请求的WEB资源,能否改变用户请求的路径?
正确 错误
19
当设置了Web过滤器时,用户请求经过过滤器处理后,若能到达服务器则进行处理,处理得到的响应不再经过过滤器直接传回达客户端。
正确 错误
20 Web过滤器通常过滤的是用户请求。
正确 错误

(2)在项目中应用过滤器和监听器:

● 给SERVLET统一设置字符集编码——过滤器
实现方法:定义过滤器类,在配置时设置初始参数encoding,值设为utf-8;在init()方法澡通过参数.getInitParameter(“encoding”)的值à字符集变量(过滤类成员变量)encode;在doFilter方法中将request,response变量强转为HttpXxxXxxxx类型的变量后,调用其setCharacterEncoding(encode),设置字符集。过滤器类配置时映射路径可设置为:/servlet/,注意在配置servlet时,要将其映射路径设置为:/serlet/**,这样才能被过滤器拦截URL。

●用户登录后才能进行购物车中商品的操作(增加商品、删除商品)——过滤器

package cn.sdut.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/** * Servlet Filter implementation class CartFilter */
@WebFilter(filterName="cartFilter",urlPatterns={"/servlet/CartServlet","/procart/*"})
public class CartFilter implements Filter {
//Default constructor.
    public CartFilter() {          }
         // @see Filter#destroy()
         public void destroy() {  }
         //@see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
         public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                   HttpServletRequest req=(HttpServletRequest)request;
                   HttpServletResponse resp=(HttpServletResponse)response;
                   if(req.getSession().getAttribute("user")!=null)
                   {
                            chain.doFilter(request, response);
                   }
                   else
                   {
                            resp.sendRedirect(req.getContextPath()+"/prouser/u_userLogin.jsp");
                   }                
         }
         /**   * @see Filter#init(FilterConfig)     */
         public void init(FilterConfig fConfig) throws ServletException {
                   // TODO Auto-generated method stub
         }
}

●统计网站在线人数——监听器(监听session)

对session对象的创建和销毁进行处理;有新的Session对象创建时,在线人数增1,有Session对象销毁时,在线人数减1.

2、批量修改、批量删除

功能:批量修改密码和批量删除用户的实现
所需要的操作如下:

(1)数据操作层:在UserDao类中提供在users表中批量修改密码和批量删除用户的方法:

//批量修改密码
         public boolean batchPwdReset(String newPwd,Object[] ids)
                   {
                            String sql="update users set password=? where id=?";
                            Object[][] param=new Object[ids.length][2];
                            for(int i=0;i<ids.length;i++)
                            {
                                     param[i][0]=newPwd;
                                     param[i][1]=ids[i];
                            }
                            return bactchUpdate(sql, param);                 
                   }
         //批量删除用户
         public boolean batchDelUser(Object[] ids)
         {
                   String sql="delete from users where id=?";
                   Object[][] param=new Object[ids.length][1];
                   for(int i=0;i<ids.length;i++)
                   {
                            param[i][0]=ids[i];
                   }
                   return bactchUpdate(sql, param);                 
         }

(2)在VIEW视图(JSP页面)上,提供名称为“id”的复选框控件,将其值预先设定为用户的id(主键值),并为几个按钮(type=”button”)增加onclick事件,进行不同的服务器提交转向分支。

m_userMain.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   <base href="<%=basePath%>">
    <title>My JSP ’userMain.jsp’ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
         <meta http-equiv="cache-control" content="no-cache">
         <meta http-equiv="expires" content="0">   
         <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
         <meta http-equiv="description" content="This is my page">
         <!--
         <link rel="stylesheet" type="text/css" href="styles.css">
         -->

  <style type="text/css">
  body {
         text-align: center;
         font-size: 24px;
}
  </style>

  <script type="text/javascript">
    function addUser()
    {
       window.location.href="<%=path%>/prouser/m_addUser.jsp";
    }
    function batchDelete1()
    {
       if(confirm("确定要删除用户吗?")==true)
       {
         form1.action="<%=path%>/UserServlet?method=batchDel";
         form1.submit();
       }
    }
    function batchPasswordReset()
    {

      form1.action="<%=path%>/UserServlet?method=batchPwdReset";
      form1.submit();
    }
  </script>

  </head>

  <body>
  <form name="form1" method="post" action="">
   <br>
    <table width="721" border="1">
    <caption> 用户管理</caption>
      <tr>
        <td width="35" height="44" align="center">选择</td>
        <td width="40" align="center">序号</td>
        <td width="84" align="center">用户名</td>
        <td width="40" align="center">性别</td>
        <td width="138" align="center">爱好</td>
        <td width="106" align="center">联系电话</td>
        <td width="104" align="center">地址</td>
        <td width="55" align="center">删除</td>
        <td width="55" align="center">修改</td>
      </tr>
      <c:forEach items="${userList }" var="user" varStatus="status">
      <tr>
        <td height="43" align="center">
        <input type="checkbox" name="id" value="${user.id}"></td>
        <td align="center">${status.count }</td>
        <td align="center">${user.name }</td>
        <td>${user.sex }</td>
        <td>${user.hobby }</td>
        <td>${user.telephone }</td>
         <td>${user.address }</td>
        <td align="center">
<a href="<%=path%>/UserServlet?method=del&userid=${user.id}">删除 </a> </td>
        <td align="center">
<a href="<%=path%>/UserServlet?method=byid&userid=${user.id}">修改 </a></td>
      </tr>
      </c:forEach>
      <tr>
        <td height="40" colspan="9" align="center">
        <input type="button" name="add" id="add" value=" 添  加 " onclick="addUser()">
         &nbsp;&nbsp; &nbsp; &nbsp;
        <input type="button" name="batchDelete" id="batchDelete" value="批量删除" onclick="batchDelete1()">
          &nbsp;&nbsp;&nbsp; &nbsp;
        <input type="button" name="batchUpdatePassword" id="batchUpdatePassword" value="批量密码复位" onclick="batchPasswordReset()"></td>
      </tr>
    </table>
    ${msg}
  </form>
  </body>
</html>

(3)在Servlet上进行处理时,根据method的值做不同的处理,首先得到id数组,然后组织数据,调用MODEL所准备好的处理方法,对数据库进行操作,将操作成功与否的信息返回到客户端。

UserServlet.java

package cn.sdut.servlet;

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
         private static final long serialVersionUID = 1L;
         UserDao userDao = new UserDao();

         protected void doGet(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   request.setCharacterEncoding("utf-8");
                   response.setCharacterEncoding("utf-8");
                   String method = request.getParameter("method");
                   switch (method) {
                   case "batchDel":
                            batchDelStudent(request, response);
                            break;
                   case "batchPwdReset":
                            batchPwdReset(request, response);
                            break;
                   }
         }

         private void batchPwdReset(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   String msg = "批量修改密码失败!";
                   String[] ids = request.getParameterValues("id");
                   boolean flag = userDao.batchPwdReset("111111", ids);
                   if (flag) {
                            msg = "批量修改密码成功!";
                   }
                   request.setAttribute("msg", msg);
                   request.getRequestDispatcher("/UserServlet?method=all").forward(
                                     request, response);
         }

         private void batchDelStudent(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   String msg = "批量删除用户失败!";
                   String[] ids = request.getParameterValues("id");
                   boolean flag = userDao.batchDelUser(ids);
                   if (flag) {
                            msg = "批量删除用户成功!";
                   }
                   request.setAttribute("msg", msg);
                   request.getRequestDispatcher("/UserServlet?method=all").forward(
                                     request, response);
         }
         protected void doPost(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   doGet(request, response);
         }
}

3、DBUTILS的引入

(1)需要支持的JAR包 commons-dbutils-1.6.jar(可在开发工具中下载)
数据库支持JAR包(mysql-connector-java-5.1.18-bin.jar)也需要。
(2)DBUtilsBaseDao使用举例:

package cn.sdut.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class DBUtilsBaseDao {
         //得到数据库连接
         public  Connection getConn()
         {
                   Connection conn=null;
                   DbUtils.loadDriver("com.mysql.jdbc.Driver");
                   try {
                            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=utf-8","root","usbw");
                   } catch (SQLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                   }
                   return conn;
         }

         //增、删、改数据库的方法
         public int update(String sql,Object... param)
         {
                   int result=0;
                   Connection conn=getConn(); //得到连接
                   QueryRunner runner=new QueryRunner();  //得到运行对象
                   try {
                            result=runner.update(conn, sql, param); //进行数据库操作
                   } catch (SQLException e) {
                            e.printStackTrace();
                   }
                   finally
                   {
                            DbUtils.closeQuietly(conn);  //关闭数据库连接
                   }
                   return result;
         }

         //数据库查询
         public List query(String sql,Class clazz,Object... param)
         {
                   List list=null;
                   Connection conn=getConn(); //得到连接
                   QueryRunner runner=new QueryRunner();  //得到运行对象
                   try {
                            list=runner.query(conn,sql,new BeanListHandler(clazz),param); //进行数据库操作
                   } catch (SQLException e) {
                            e.printStackTrace();
                   }
                   finally
                   {
                            DbUtils.closeQuietly(conn);  //关闭数据库连接
                   }
                   return list;
         }
          //批量操作数据库的方法
                   public boolean bactchUpdate(String sql,Object[][] param)
                   {
                            int[] result=new int[param.length];
                            int r=1;                       
                            Connection conn=getConn(); //得到连接                         
                            QueryRunner runner=new QueryRunner();  //得到运行对象
                            try {
                                     result=runner.batch(conn,sql,param);// 批量进行数据库操作
                            } catch (SQLException e) {
                                     e.printStackTrace();
                            }
                            finally
                            {
                                     DbUtils.closeQuietly(conn);  //关闭数据库连接
                            }
                            //对返回数据进行加工,将整型数组转化为布尔类型
                            for(int i=0;i<result.length;i++)
                            {
                                     r*=result[i];
                            }
                            return r>0?true:false;
                   }
}

(3)UserDao应用举例:

package cn.sdut.dao;
import java.util.List;
import cn.sdut.po.User;
public class UserDao extends DBUtilsBaseDao {
         // 增加用户
         public int addUser(User user) {
                   int result = 0;
                   String sql = "insert into users(name,password,sex,birthday,hobby,telephone,address,type) values(?,?,?,?,?,?,?,?)";
                   Object[] params = { user.getName(), user.getPassword(), user.getSex(),
                                     user.getBirthday(), user.getHobby(), user.getTelephone(),
                                     user.getAddress(), user.getType() };
                   return update(sql, params);
         }

         // 删除用户
         public int delUser(int id) {
                   int result = 0;
                   String sql = "delete from users where id=?";
                   return update(sql, id);
         }

         // 修改用户
         public int updateUser(User user) {
                   int result = 0;
                   String sql = "update users set name=?,sex=?,birthday=?,hobby=?,telephone=?,address=? where id=?";
                   Object[] params = { user.getName(), user.getSex(), user.getBirthday(),
                                     user.getHobby(), user.getTelephone(), user.getAddress(),user.getId() };
                   return update(sql, params);
         }
         //查询符合条件的用户(从姓名、性别、等非空字段模糊查询数据)
         public List<User> queryUserByCondition(String condition)
         {
                   String sql=null;
                   if(condition!=null&&!"".equals(condition))
                   {
                      sql="select * from users where concat(name,sex) like ’%"+condition+"%’";
                   }
                   else
                   {
                            sql="select * from users";
                   }
                    return query(sql, User.class, null);
         }
         //根据id查询用户
         public User queryUserById(int id)
         {
                   User user=null;
                   String sql="select * from users where id=?";
                   List<User> list=query(sql, User.class, id);
                   if(list!=null&&list.size()>0)
                   {
                            user=list.get(0);
                   }
                   return user;
         }
         //批量修改密码
         public boolean batchPwdReset(String newPwd,Object[] ids)
                   {
                            String sql="update users set password=? where id=?";
                            Object[][] param=new Object[ids.length][2];
                            for(int i=0;i<ids.length;i++)
                            {
                                     param[i][0]=newPwd;
                                     param[i][1]=ids[i];
                            }
                            return bactchUpdate(sql, param);          
                   }
         //批量删除用户
         public boolean batchDelUser(Object[] ids)
         {
                   String sql="delete from users where id=?";
                   Object[][] param=new Object[ids.length][1];
                   for(int i=0;i<ids.length;i++)
                   {
                            param[i][0]=ids[i];
                   }
                   return bactchUpdate(sql, param);          
         }

         //用户登录
         public User login(String name,String password)
         {
                   User user=null;
                   String sql="select * from users where name=? and password=?";
                   Object[] param=new Object[]{name,password};
                   List<User> users=query(sql, User.class, param);
                   if(users!=null&&users.size()>0)
                   {
                            user=users.get(0);
                   }
                   return user;
         }
}

4、JSTL和EL初识

功能:展示request作用域中的用户信息:
m_userMain.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   <base href="<%=basePath%>">
    <title>My JSP ’userMain.jsp’ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
         <meta http-equiv="cache-control" content="no-cache">
         <meta http-equiv="expires" content="0">   
         <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
         <meta http-equiv="description" content="This is my page">
         <!--
         <link rel="stylesheet" type="text/css" href="styles.css">
         -->

  <style type="text/css">
  body {
         text-align: center;
         font-size: 24px;
}
  </style>

  <script type="text/javascript">
    function addUser()
    {
       window.location.href="<%=path%>/prouser/m_addUser.jsp";
    }
    function batchDelete1()
    {
       if(confirm("确定要删除用户吗?")==true)
       {
         form1.action="<%=path%>/UserServlet?method=batchDel";
         form1.submit();
       }
    }
    function batchPasswordReset()
    {

      form1.action="<%=path%>/UserServlet?method=batchPwdReset";
      form1.submit();
    }
  </script>

  </head>

  <body>
  <form name="form1" method="post" action="">
   <br>
    <table width="721" border="1">
    <caption> 用户管理</caption>
      <tr>
        <td width="35" height="44" align="center">选择</td>
        <td width="40" align="center">序号</td>
        <td width="84" align="center">用户名</td>
        <td width="40" align="center">性别</td>
        <td width="138" align="center">爱好</td>
        <td width="106" align="center">联系电话</td>
        <td width="104" align="center">地址</td>
        <td width="55" align="center">删除</td>
        <td width="55" align="center">修改</td>
      </tr>
      <c:forEach items="${userList }" var="user" varStatus="status">
      <tr>
        <td height="43" align="center">
        <input type="checkbox" name="id" value="${user.id}"></td>
        <td align="center">${status.count }</td>
        <td align="center">${user.name }</td>
        <td>${user.sex }</td>
        <td>${user.hobby }</td>
        <td>${user.telephone }</td>
         <td>${user.address }</td>
        <td align="center">
<a href="<%=path%>/UserServlet?method=del&userid=${user.id}">删除 </a> </td>
        <td align="center">
<a href="<%=path%>/UserServlet?method=byid&userid=${user.id}">修改 </a></td>
      </tr>
      </c:forEach>
      <tr>
        <td height="40" colspan="9" align="center">
        <input type="button" name="add" id="add" value=" 添  加 " onclick="addUser()">
         &nbsp;&nbsp; &nbsp; &nbsp;
        <input type="button" name="batchDelete" id="batchDelete" value="批量删除" onclick="batchDelete1()">
          &nbsp;&nbsp;&nbsp; &nbsp;
        <input type="button" name="batchUpdatePassword" id="batchUpdatePassword" value="批量密码复位" onclick="batchPasswordReset()"></td>
      </tr>
    </table>
    ${msg}
  </form>
  </body>
</html>

5、文件的上传、下载

(1)文件上传
●需要的JAR包:commons-fileupload-1.2.2.jar、 commons-io-2.1.jar

●客户端的准备:

用户名
密 码
上传文件


●Servlet的处理:

将文件上传至服务器本应用程序发布路径的docs文件夹下,若要传到其他文件夹下,在程序中进行修改即可。

package cn.sdut.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/LoadServlet")
public class LoadServlet extends HttpServlet {
         private static final long serialVersionUID = 1L;
         protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                   String method=request.getParameter("method");
                   switch(method)
                   {
                   case "upload":
                            upload(request,response);
                            break;
                   case "download":
                            download(request,response);
                            break;
                   }
         }
         public void upload(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
         {       
                            request.setCharacterEncoding("utf-8");
                            response.setContentType("text/html;charset=utf-8");
                            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
                            boolean isuploadSuccess = false;
                            File imageFile = null;
                            try {
                                     // 设置上传路径,将文件上传至服务器上本应用发布位置的docs文件夹
                                     String uploaddir = request.getServletContext().getRealPath("/docs");
                                     File upFile = new File(uploaddir);
                                     if (!upFile.exists()) {
                                               upFile.mkdirs();
                                     }
                                     if (isMultipart == true) {
                                               FileItemFactory factory = new DiskFileItemFactory();
//创建文件项目工厂类
                                               ServletFileUpload upload = new ServletFileUpload(factory);
//创建文件上传对象
                                               List<FileItem> items;
                                               items = upload.parseRequest(request);     //解析请求对象
                                               Iterator<FileItem> it = items.iterator();
                                               while (it.hasNext()) {       // 通过循环处理多文件上传
                                                        FileItem item = (FileItem) it.next();
                                                        if (!item.isFormField()) {  //文件,不包含普通表单内容
                                                                 File uploadFile = new File(item.getName());
                                                                 imageFile = new File(uploaddir, uploadFile.getName());
                                                                 try {
                                                                           item.write(imageFile);    //写数据
                                                                           isuploadSuccess = true;   //设置文件上传成功标志
                                                                 } catch (Exception e) {
                                                                           e.printStackTrace();
                                                                           isuploadSuccess = false;
                                                                           System.out.println("上传失败!!");
                                                                 }
                                                        } else {
                                                                 // 普通表单内容 不处理
                                                                 System.out.println(item.toString());
                                                        }
                                               }

                                     } else {
                                               System.out.print("the enctype must be multipart/form-data");
                                     }
                            } catch (FileUploadException e) {
                                     e.printStackTrace();
                            }
         }

         protected void doPost(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   doGet(request, response);
         }
}

(2)文件的下载:

文件的下载与文件的上传要容易的多。实现有两种方式。

● 页面(download.jsp)的支持:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
         String path = request.getContextPath();
         String basePath = request.getScheme() + "://"
                            + request.getServerName() + ":" + request.getServerPort()
                            + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP ’download.jsp’ starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
         <link rel="stylesheet" type="text/css" href="styles.css">
         -->
</head>
<body>
         <a href="<%=path%>/download/stu1.xlsx">
<img alt="模板下载"  src="<%=path%>/images/excel.png"> 下载标准模板1<br>
         </a>  <!—第一种方式-- >
         <a href="<%=path%>/LoadServlet?method=download">
<img alt="模板下载"  src="<%=path%>/images/excel.png"> 下载标准模板2<br>
         </a>   <!—第二种方式-- >
         <p>
</body>
</html>

第一种方式:

<a href="<%=path%>/download/stu1.xlsx">
<img alt="模板下载"         src="<%=path%>/images/excel.png"> 下载标准模板1<br>
</a>

此种方式,通过浏览器提供的下载功能,不需要Servlet的支持。
缺点:遇到图片等浏览器能解析的文件,只是在浏览器窗口中打开,而不是下载文件。

第二种方式:

<a href="<%=path%>/LoadServlet?method=download"> <img alt="模板下载"
                   src="<%=path%>/images/excel.png"> 下载标准模板2<br>
</a>

● Servlet的处理

package cn.sdut.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/LoadServlet")
public class LoadServlet extends HttpServlet {
         private static final long serialVersionUID = 1L;
         protected void doGet(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   String method = request.getParameter("method");
                   switch (method) {
                   case "upload":
                            upload(request, response);
                            break;
                   case "download":
                            download(request, response);
                            break;
                   }
         }

         public void upload(HttpServletRequest request, HttpServletResponse response)
                            throws ServletException, IOException {
                   //……..
         }

         public void download(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   // 获取网站部署路径(通过ServletContext对象),用于确定下载文件位置,从而实现下载
                   String path = getServletContext().getRealPath("/");

                   // 1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
                   response.setContentType("multipart/form-data");
                   // 2.设置文件头:最后一个参数是设置下载文件名(假如叫stu.xlsx)
                   response.setHeader("Content-Disposition",
                                     "attachment;fileName=stu.xlsx");
                  // Content-Disposition当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
                   ServletOutputStream out;
                   // 设置源文件路径,通过文件路径获得File对象(假如此路径中有一个stu1.xlsx文件)
                   File file = new File(path + "download/" + "stu1.xlsx");

                   try {
                            FileInputStream inputStream = new FileInputStream(file);
                            // 3.通过response获取ServletOutputStream对象(out)
                            out = response.getOutputStream();
                            int length = 0;
                            byte[] buffer = new byte[1024];
                            while ((length = inputStream.read(buffer)) > 0) {
                                     // 4.写到输出流(out)中
                                     out.write(buffer, 0, length);
                            }
                            inputStream.close();
                            out.close();
                            out.flush();

                   } catch (IOException e) {
                            e.printStackTrace();
                   }
         }

         protected void doPost(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
                   doGet(request, response);
         }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值