通过Response下载文件数据
放一个文件到resources目录
编写下载文件Servlet文件
public class FileDownServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 1.获取要下载文件的路径
String filePath = "D:\\Java Web\\JavaWebDemo\\ServletDemo\\src\\main\\resources\\1.png";
// 2.获取文件的下载名(客户端下载保存的时候的名字)
String downFileName = filePath.substring(filePath.lastIndexOf("\\")+1);
// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + downFileName);
// 4.获取下载文件的输入流
FileInputStream fis = new FileInputStream(filePath);
// 5.创建缓冲区
int len;
byte[] buffer = new byte[1024];
// 6.获取OutputStream对象
ServletOutputStream sos = resp.getOutputStream();
// 7.将文件流输出到ServletOutputStream中
while((len = fis.read(buffer)) != -1){
// 8.将数据输出到客户端
sos.write(buffer, 0, len);
}
// 9.关闭文件的输入输出流
sos.close();
fis.close();
}
}
编写下载映射xml
<servlet>
<servlet-name>downFile</servlet-name>
<servlet-class>com.huaijiuwang.servlet.FileDownServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downFile</servlet-name>
<url-pattern>/downFile</url-pattern>
</servlet-mapping>
访问测试:localhost:8080/downFile
下载成功(再次测试下载文件名为中文情况)
修改代码
// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + "怀旧.png");
访问测试:
文件名输出失败,修改代码,设置下载文件的编码
// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("怀旧.png", "utf-8"));
再次测试:
显示成功!
实现目的:在浏览器端创建一个图片生成验证码,让图片3秒刷新一次:
编写Servlet:
public class ToImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 设置浏览器3秒刷新一次
resp.setHeader("refresh", "3");
// 在内存中创建一个图片对象 · 参数(1.图片宽度 2. 图片长度 3.图片颜色渲染类型)
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
// 得到图片对象
Graphics2D graphics = (Graphics2D) image.getGraphics();
// 设置图片的背景颜色
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, 80, 20);
// 给图片写入数据
// 设置当前画笔颜色
graphics.setColor(Color.GREEN);
// 设置当前画笔字体
graphics.setFont(new Font(null, Font.BOLD, 20));
// 设置当前的内容
graphics.drawString(getData(), 0, 20);
// 响应浏览器,当前界面以图片形式打开
resp.setContentType("image/jpeg");
// 将当前图片输出到前端
ImageIO.write(image, "jpg", resp.getOutputStream());
}
public static String getData(){
Random random = new Random();
return String.format("%06d", random.nextInt(999999));
}
}
编写访问映射xml
<servlet>
<servlet-name>image</servlet-name>
<servlet-class>com.huaijiuwang.servlet.ToImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>image</servlet-name>
<url-pattern>/image</url-pattern>
</servlet-mapping>
访问测试:
格3秒就自动刷新
编写代码实现重定向:
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/image");
}
}
编写访问映射文件
<servlet>
<servlet-name>Redirect</servlet-name>
<servlet-class>com.huaijiuwang.servlet.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Redirect</servlet-name>
<url-pattern>/red</url-pattern>
</servlet-mapping>
访问测试:
自动重定向到了image路径
修改tomcat配置
添加一个前缀
重新测试重定向
访问路径:localhost:8080/hj/red 结果如下,重定向的地址没有带hj前缀,所以找不到
因为访问image需要带上hj前缀
这样就可以访问了,所以在重定向的时候,我们需要加上前面的前缀才可以,修改代码
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect(this.getServletContext().getContextPath() + "/image");
}
}
再次访问localhost:8080/hj/red,得到结果如下
重定向成功,并且带上了前缀
并且状态为302代表重定向,并且url也改变了
HttpServletRequest 对象代表客户端的请求
当客户端/浏览器通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中
通过这个对象的方法,可以获得客户端这些信息
getRequestURI() 获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getRemoteHost() 获取客户端的 主机, getRemoteAddr()
getHeader() 获取请求头
getParameter() 获取请求的参数
getParameterValues() 获取请求的参数(多个值的时候使用), 比如 checkbox, 返回的数组
getMethod() 获取请求的方式 GET 或 POST
setAttribute(key, value); 设置域数据
getAttribute(key); 获取域数据
getRequestDispatcher() 获取请求转发对象, 请求转发的核心对象
编写处理登录请求的servlet
public class RequestTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取用户输入的数据
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
// 判断用户输入
if("huaijiu".equals(userName) && "123456".equals(passWord)){
// 登录成功重定向success地址
resp.sendRedirect(this.getServletContext().getContextPath() + "/success.jsp");
}else{
// 登录失败重定向error地址
resp.sendRedirect(this.getServletContext().getContextPath() + "/error.jsp");
}
}
}
编写重定向成功或者失败地址:
添加jsp所需maven依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
编写发起请求的jsp代码 (index.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%-- "${pageContext.request.contextPath} 获取前缀访问路径/hj--%>
<form action="${pageContext.request.contextPath}/login" method="get">
<input style="font-size: 20px;" type="text" name="userName" /><br />
<input style="font-size: 20px;" type="password" name="passWord" /><br />
<input type="submit" value="登录" />
</form>
</body>
</html>
访问测试:
输入错误的用户名或密码
成功重定向到了登录失败界面
输入正确的用户名密码
返回到登录成功的界面。
和对应的response基本就是相对的
获取参数:
常用的就两个:
编写前端代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%-- "${pageContext.request.contextPath} 获取前缀访问路径/hj--%>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input style="font-size: 20px;" type="text" name="userName" /><br />
密码:<input style="font-size: 20px;" type="password" name="passWord" /><br />
爱好:<input type="checkbox" value="学习" name="hobby" />学习
<input type="checkbox" value="唱歌" name="hobby" />唱歌
<input type="checkbox" value="跳舞" name="hobby" />跳舞
<input type="checkbox" value="篮球" name="hobby" />篮球<br />
<input type="submit" value="登录" />
</form>
</body>
</html>
后台获取数据代码:
public class RequestTestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取一个数据
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
// 获取多个值
String[] hobbies = req.getParameterValues("hobby");
// 打印输出结果
System.out.println(userName + " : " + passWord);
System.out.println(Arrays.toString(hobbies));
}
}
请求前端提交输入信息:
成功请求,查看控制台的输出:
输出乱码:
解决乱码问题: 添加下面的代码到获取数据的签名
req.setCharacterEncoding("utf-8");
重新访问:
成功解决乱码问题:并且获取多条数据成功。
添加转发代码:
// 信息获取成功,转发到成功登录的地址
req.getRequestDispatcher(req.getContextPath() + "/success.jsp").forward(req, resp);
访问/login地址
发现请求地址前缀有两个hj所以找不到界面报错404
查看原因:
修改代码
req.getRequestDispatcher("/success.jsp").forward(req, resp);
修改代码完转发
req.getRequestDispatcher("success.jsp").forward(req, resp);
同样转发成功.
评论
登录后才可以进行评论哦!