web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 配置servlet当通过url访问时http://localhost:8080/tomcatdemo_war_exploded/demo1服务器会到web.xml访问到/demo1然后往上找到demo1,接着找到com.example.tomcatdemo.servletdemo1这个是全类名,第一时间想到反射:tomcat将全类名对应的字节码文件加载进内存 Class.forName()创建对象cls.newInstance()调用方法 service 因为demo1指向的servlet文件实现了Servlet,所以tomcat知道有这个方法servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单列的当多个用户访问这个Servlet时,可能存在线程安全问题解决:尽量不要在Servlet中定义成员变量,定义局部变量。万一即使定义了成员变量,也不要对其赋值、修改值--><servlet><servlet-name>demo1</servlet-name><servlet-class>com.example.tomcatdemo.servletdemo1</servlet-class></servlet><servlet-mapping><servlet-name>demo1</servlet-name><url-pattern>/demo1</url-pattern></servlet-mapping><servlet><servlet-name>demo2</servlet-name><servlet-class>com.example.tomcatdemo.servletdemo2</servlet-class><!-- 指定servlet的创建时机1、第一次被访问时,创建load-on-startup的值为负数2、在服务器启动时,创建load-on-startup的值为0或正整数--><load-on-startup>5</load-on-startup></servlet><servlet-mapping><servlet-name>demo2</servlet-name><url-pattern>/demo2</url-pattern></servlet-mapping></web-app>
servlet
package com.example.tomcatdemo;import javax.servlet.*;import java.io.IOException;public class servletdemo1 implements Servlet {/*** 初始化方法* Servlet被创建时执行,只会执行一次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init.......");}/*** 获取ServletConfig对象,即servlet的配置对象* @return*/@Overridepublic ServletConfig getServletConfig() {return null;}/*** 提供服务的方法* 每一次servlet被访问时执行,执行多次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service....");}/*** 获取servlet的一些信息,版本,作者等* @return*/@Overridepublic String getServletInfo() {return null;}/*** 销毁方法* 在服务器正常关闭时,执行,执行一次*/@Overridepublic void destroy() {System.out.println("destroy.......");}}
注解-代替web.xml
package com.example.tomcatdemo;import javax.servlet.*;import javax.servlet.annotation.WebServlet;import java.io.IOException;@WebServlet(urlPatterns = "/demo3") //直接使用注解进行xml配置 也可以如下//@WebServlet("/demo4") //直接使用注解进行xml配置public class servletdemo3 implements Servlet {/*** 初始化方法* Servlet被创建时执行,只会执行一次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init.......");}/*** 获取ServletConfig对象,即servlet的配置对象* @return*/@Overridepublic ServletConfig getServletConfig() {return null;}/*** 提供服务的方法* 每一次servlet被访问时执行,执行多次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service....");}/*** 获取servlet的一些信息,版本,作者等* @return*/@Overridepublic String getServletInfo() {return null;}/*** 销毁方法* 在服务器正常关闭时,执行,执行一次*/@Overridepublic void destroy() {System.out.println("destroy.......");}}
idea2021-代替web.xml
2021idea生成webapp 直接生成这个目录,在这个目录下面的servlet可以直接访问
HttpServlet-获取请求行方法
package com.example.tomcatdemo.servletdemo;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;/*** 演示请求行数据*/@WebServlet(name = "ServletTest2", value = "/ServletTest2")public class ServletTest2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// System.out.println(111111);// //获取请求方式// String method = request.getMethod();// System.out.println(method);//// 获取虚拟目录 重要// String contextPath = request.getContextPath();// System.out.println(contextPath);//// 获取servlet路径 /ServletTest2// String servletPath = request.getServletPath();// System.out.println(servletPath);//// 获取get方式请求参数// String queryString = request.getQueryString();// System.out.println(queryString);//// 获取URI 和 URL// String requestURI = request.getRequestURI();// StringBuffer requestURL = request.getRequestURL();// System.out.println(requestURI);// System.out.println(requestURL);//// 获取协议及版本// String protocol = request.getProtocol();// System.out.println(protocol);//// 获取客户机IP地址// String remoteAddr = request.getRemoteAddr();// System.out.println(remoteAddr);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(2222);//获取请求方式String method = request.getMethod();System.out.println(method);// 获取虚拟目录 重要String contextPath = request.getContextPath();System.out.println(contextPath);// 获取servlet路径 /ServletTest2String servletPath = request.getServletPath();System.out.println(servletPath);// 获取post方式请求参数String queryString = request.getParameter("username");System.out.println(queryString);// 获取URI 和 URLString requestURI = request.getRequestURI();StringBuffer requestURL = request.getRequestURL();System.out.println(requestURI);System.out.println(requestURL);// 获取协议及版本String protocol = request.getProtocol();System.out.println(protocol);// 获取客户机IP地址String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}}
HttpServlet-获取请求头方法
package com.example.tomcatdemo.servletdemo;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.util.Enumeration;/*** 演示请求行数据*/@WebServlet(name = "ServletTest3", value = "/ServletTest3")public class ServletTest3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取请求头数据String userAgent = request.getHeader("user-agent");System.out.println(userAgent);if (userAgent.contains("Chrome")){System.out.println("Chrome");} else if (userAgent.contains("Firefox")){System.out.println("Firefox");}System.out.println("-------------");System.out.println("-------------");// 获取所有的请求头名称,这个方法不常用,一般没有必要获取这么多Enumeration<String> headerNames = request.getHeaderNames();// 遍历while (headerNames.hasMoreElements()){String name = headerNames.nextElement();//根据请求头名称获取请求头的值String value = request.getHeader(name);System.out.println(name+"------"+value);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}
HttpServlet-获取请求体方法
package com.example.tomcatdemo.servletdemo;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.BufferedReader;import java.io.IOException;import java.util.Enumeration;/*** 演示请求行数据*/@WebServlet(name = "ServletTest4", value = "/ServletTest4")public class ServletTest4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*** 请求体,只有post请求方式,才有请求体,在请求体中封装了post请求参数** 1、获取流对象* BufferedReader getReader() 获取字符输入流,只能操作字符数据* ServletInputStream getInputStream() 获取字节输入流 可以操作所有类型数据 在文件上传再学**/BufferedReader br = request.getReader();String line = null;while ((line = br.readLine()) != null){System.out.println(line);}}}
HttpServlet-重要方法
package com.example.tomcatdemo.servletdemo;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.BufferedReader;import java.io.IOException;import java.util.Enumeration;import java.util.Map;import java.util.Set;/*** 其它功能 都非常重要* getParameter(string name) 根据参数名称获取参数值* getParameterValues(string name) 根据参数名称获取参数值的数组 多用于复选框* getParameterNames() 获取所有请求的参数名称* getParameterMap() 获取所有参数的map集合*/@WebServlet(name = "ServletTest5", value = "/ServletTest5")public class ServletTest5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//这个方法无论是get和post方法都可以使用,这样get和post方法中写的差异就没有了,// 所以直接在post方法里面调用get方法即可//解决post请求体乱码问题request.setCharacterEncoding("utf-8");String username = request.getParameter("username");// System.out.println("get");// System.out.println(username);String[] hobbies = request.getParameterValues("hobby");// for (String hobby : hobbies) {// System.out.println(hobby);//// }//这里发现复选框没有被全部获取,使用Enumeration<String> parameterNames = request.getParameterNames();while (parameterNames.hasMoreElements()){String name = parameterNames.nextElement();System.out.println(name);String value = request.getParameter(name);System.out.println(value);System.out.println("------------");}System.out.println("----------修复复选框没有全选的问题------------");Map<String, String[]> parameterMap = request.getParameterMap();Set<String> keyset = parameterMap.keySet();for (String name : keyset) {String[] values = parameterMap.get(name);for (String value : values) {System.out.println(value);}System.out.println("---------------");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// String username = request.getParameter("username");// System.out.println("post");// System.out.println(username);// 简略this.doGet(request,response);}}

HttpServlet-请求转发
package com.example.servletdemoone;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "Servlettest1", value = "/s1")public class Servlettest1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(1111);//创建转发对象,使用转发对象调用转发方法// RequestDispatcher rqd =request.getRequestDispatcher("/s2");// rqd.forward(request,response);//简化request.getRequestDispatcher("/s2").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}
package com.example.servletdemoone;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "Servletdemo1", value = "/s2")public class Servletdemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(222222);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}

Servlet-登录demo阶段一
1、写一个user类 接受参数,实例化一个user类对象,传输给userdao类的对象,进度登录验证2、写一个userdao类 接受user类对象,传入login方法进行登录验证,这里面使用JdbcTemplate进行数据库连接操作3、写一个jdbcutils类 数据库工具类,获取连接池对象,获取Connection对象
package com.example.javawebs.util;import com.alibaba.druid.pool.DruidDataSourceFactory;/*** 数据库连接池*/import javax.sql.DataSource;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;public class jdbcutils {private static DataSource ds;static {try {//加载配置文件Properties pro = new Properties();InputStream is = jdbcutils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//初始化连接池对象ds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接池对象*/public static DataSource getDataSource(){return ds;}/*** 获取Connection对象*/public static Connection getConnection() throws SQLException {return ds.getConnection();}}
package com.example.javawebs.dao;import com.example.javawebs.domain.user;import com.example.javawebs.util.jdbcutils;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;public class userdao {//创建JdbcTemplate对象,直接链接数据库并进行操作private JdbcTemplate template = new JdbcTemplate(jdbcutils.getDataSource());/*** 登录方法 接受一个user对象* @param loginuser 只有用户名和密码* @return 包含用户全部数据*/public user login(user loginuser){try {String sql = "select * from user where username = ? and password =?";//使用JdbcTemplate对象的queryForObject()方法查询结果,方法中传入BeanPropertyRowMapper的实现类// 这里是传入通过获取的参数实例化出来的user对象,去数据库查询是否存在这个用户,如果存在,就返回这个用户的信息user user1 = template.queryForObject(sql,new BeanPropertyRowMapper<user>(user.class),loginuser.getUsername(), loginuser.getPassword());//这里的loginuser.getPassword()是user类里面的getPassword()方法,loginuser是user类的实例化对象return user1;} catch (DataAccessException e) {return null;}}}
package com.example.javawebs.domain;/*用户实体类*/public class user {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "user{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}
import com.example.javawebs.dao.userdao;import com.example.javawebs.domain.user;import org.junit.jupiter.api.Test;//测试上面的三个类是否能正常运行public class usertest {@Testpublic void testlogin(){user loginuser = new user();loginuser.setUsername("lww");loginuser.setPassword("lwwpasswd");/*** 使用userdao创建一个对象,这个对象可以调用userdao类里面的login方法* login方法接受的是user类的对象,因此上面先使用user类实例化一个对象,并且对该对象赋值进行测试*/userdao dao = new userdao();user user1 = dao.login(loginuser);System.out.println(user1);}}

Servlet-登录demo阶段二
接上面,写了一个登录界面 三个servlet



<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>demo1</title></head><body><form action="/demo/LoginServlet" method="post">username<input type="text" name="username1"><br>password<input type="text" name="password1"><br><input type="submit" value="登录"></form></body></html>
package com.example.javawebs.servletloginP;import com.example.javawebs.dao.userdao;import com.example.javawebs.domain.user;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");//这里需要注意,直接最好request.getParameter的参数和配置文件里面的不一样,不然容易默认去获取配置文件里面的数据库账号密码String username = request.getParameter("username1");//测试获取的是什么值// System.out.println(username);String password = request.getParameter("password1");// System.out.println(password);user loginuser = new user();loginuser.setUsername(username);loginuser.setPassword(password);userdao dao = new userdao();user reluser = dao.login(loginuser);if (reluser == null){//登录失败request.getRequestDispatcher("/failServlet").forward(request,response);//测试// System.out.println(22222);}else {//登录成功//存储数据,值就是查回来的user对象 进行request域共享user对象request.setAttribute("user",reluser);request.getRequestDispatcher("/successServlet").forward(request,response);}//测试// System.out.println(111111111);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}}
package com.example.javawebs.servletloginP;import com.example.javawebs.domain.user;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("/successServlet")public class SuccessServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取request域中共享的user对象user user1 = (user)request.getAttribute("user");if (user1 != null){response.setContentType("text/html;charset=utf-8");response.getWriter().write("欢迎"+" "+user1.getUsername());}}}
package com.example.javawebs.servletloginP;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet("/failServlet")public class FailServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");response.getWriter().write("用户名或密码错误");}}
Servlet-登录demo-BeanUtils改造LoginServlet
package com.example.javawebs.servletloginP;import com.example.javawebs.dao.userdao;import com.example.javawebs.domain.user;import org.apache.commons.beanutils.BeanUtils;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.util.Map;import java.util.Set;@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");/**//这里需要注意,直接最好request.getParameter的参数和配置文件里面的不一样,不然容易默认去获取配置文件里面的数据库账号密码String username = request.getParameter("username1");//测试获取的是什么值// System.out.println(username);String password = request.getParameter("password1");// System.out.println(password);user loginuser = new user();loginuser.setUsername(username);loginuser.setPassword(password);**///获取所有的请求参数 这里很奇怪,与上面备注不同的是,这里html中要写成username和password,不然这个方法获取不到Map<String, String[]> map = request.getParameterMap();Set<String> keyset = map.keySet();for (String name : keyset) {String[] values = map.get(name);for (String value : values) {System.out.println(value);}System.out.println("---------------");}//创建user对象user loginuser = new user();//使用beanutils封装,将map里面的键值对封装到loginuser对象中 这里如果登录页面的键名和user类里面的username成员变量不一样,就有可能封装一个null过去,password类似try {BeanUtils.populate(loginuser,map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}System.out.println(loginuser);userdao dao = new userdao();user reluser = dao.login(loginuser);if (reluser == null){//登录失败request.getRequestDispatcher("/failServlet").forward(request,response);//测试System.out.println(22222);}else {//登录成功//存储数据,值就是查回来的user对象 进行request域共享user对象request.setAttribute("user",reluser);request.getRequestDispatcher("/successServlet").forward(request,response);}//测试// System.out.println(111111111);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}}
Servlet-response-字符流输出
package com.example.javawebs.respdemo;/*** 输出字符数据到浏览器*/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("/rs3")public class respServletdemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取流对象之前,设置流的默认编码response.setCharacterEncoding("utf-8");// 告诉浏览器建议使用的编码response.setHeader("content-type","text/html;charset=utf=8");// 获取字符输出流PrintWriter pw = response.getWriter();// 输出数据pw.write("hello,resp,长河落日圆");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}}
Servlet-response-字节流输出
package com.example.javawebs.respdemo;/*** 输出字节数据到浏览器*/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;import java.io.PrintWriter;import java.nio.charset.StandardCharsets;@WebServlet("/rs4")public class respServletdemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取流对象之前,设置流的默认编码response.setCharacterEncoding("utf-8");// 告诉浏览器建议使用的编码response.setHeader("content-type","text/html;charset=utf=8");// 获取字节输出流ServletOutputStream os = response.getOutputStream();// 输出数据os.write("hello,resp,长河落日圆,落日孤烟直".getBytes(StandardCharsets.UTF_8));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}}
Servlet-文件下载
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><a href="images/01.jpg">图片</a><hr><a href="/demo/downLoadServlet?filename=一.jpg">图片</a><a href="/demo/downLoadServlet?filename=01.mp4">视频</a></body></html>
package com.example.javawebs.downLoadServlet;/*** 下载文件demo* 自定义资源文件夹,将文件放在资源文件夹中,如果中途加入新的文件,需要将资源文件夹取消资源文件夹设施,重新设置当前文件夹为资源文件,不然会报错*/import com.example.javawebs.util.DownLoadUtils;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.FileInputStream;import java.io.IOException;@WebServlet("/downLoadServlet")public class downLoadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求参数,文件名称String filename = request.getParameter("filename");// 使用字节流加载文件进内存// 找到文件服务器路径ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/images/" + filename);// 使用字节流关联FileInputStream fis = new FileInputStream(realPath);//设置response的响应头//设置响应头类型 content-typeString mimeType = servletContext.getMimeType(filename);response.setHeader("content-type",mimeType);//解决中文文件名问题 网上找的这个工具类,他的火狐浏览部分的代码有点问题,别的没有问题,先不找别的了String agent = request.getHeader("user-agent");filename = DownLoadUtils.getFileName(agent, filename);//设置响应头打开方式 content-disposition 就是用来设置先弹框再下载的response.setHeader("content-disposition","attachment;filename="+filename);// 将输入流数据,写出到输出流中//实例化输出流对象ServletOutputStream sos = response.getOutputStream();//写一个字节数组作为缓冲区,并输出byte[] buff = new byte[1024 * 8];int len = 0;while ((len = fis.read(buff)) != -1){sos.write(buff,0,len);}fis.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}
package com.example.javawebs.util;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.Base64;public class DownLoadUtils {public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MSIE")) {// IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐浏览器Base64.Encoder encoder = Base64.getEncoder();filename = "=?utf-8?B?" + encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}}
