1、Response常见应用-下载文件
-
步骤
- 得到文件路径与文件名称
- 让浏览器支持文件的下载
- 获取文件输入流
- 获取缓冲区
- 使用输出流将文件输出到网页界面
-
java代码
package org.westos.Response;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FilesDowload extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取文件的下载地址
String filePath = "F:\\Java program\\JavaWeb\\javaweb-01\\src\\main\\resources\\pictures\\dingding.png";
//2.得到下载的文件名
String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
//3.让浏览器支持下载我们的资源
//URLEncoder.encode(fileName,"UTF-8"),给文件名转码
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//4.获取文件下载的输入流
FileInputStream in = new FileInputStream(filePath);
//5.创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6.获得文件OutputStream对象
ServletOutputStream out = resp.getOutputStream();
//7.将使用in将数据写入缓冲区中,再将缓冲区中的数据写入到out中,输出到客户端
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
//8.关闭资源
in.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- web.xml配置
<servlet>
<servlet-name>FilesDowload</servlet-name>
<servlet-class>org.westos.Response.FilesDowload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FilesDowload</servlet-name>
<url-pattern>/dowload</url-pattern>
</servlet-mapping>
2、Response-验证码功能
-
步骤
- 设置浏览器刷新频率
- 绘制背景图片
- 生成随机数
- 绘制随机数(验证码)
- 将图片写到浏览器响应上
-
Java代码
package org.westos.Response; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; public class VerificationCode extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.设置浏览器刷新频率,三秒刷新一次 resp.setHeader("refresh", "3"); //2.在内存中创建一个图片 BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB); //3.得到绘制的笔,所有的背景及验证码都是由这支笔画出来的 Graphics2D graphics = (Graphics2D) image.getGraphics(); //4.用笔绘制图片的背景色 graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, 80, 20); //5.使用笔绘制随机数 graphics.setColor(Color.RED);//设置颜色 graphics.setFont(new Font(null, Font.BOLD, 20));//设置字体 graphics.drawString(getRandom(), 0, 20); //6.告诉浏览器请求的打开方式是图片 resp.setContentType("image/jpeg"); //7.不让浏览器缓存 resp.setDateHeader("expires", -1); resp.setHeader("Cache-Control", "no-cache"); resp.setHeader("Pragma", "no-cache"); //8.将图片写给响应的浏览器 ImageIO.write(image, "jpg", resp.getOutputStream()); } /* 生成随机数的方法 */ private String getRandom() { Random random = new Random(); String num = random.nextInt(9999999) + ""; StringBuffer buffer = new StringBuffer(); for (int i = 0; i < 7 - num.length(); i++) { //保证随机数位数不变 buffer.append("0"); } return buffer.toString() + num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
web.xml配置
<servlet> <servlet-name>VerificationCode</servlet-name> <servlet-class>org.westos.Response.VerificationCode</servlet-class> </servlet> <servlet-mapping> <servlet-name>VerificationCode</servlet-name> <url-pattern>/code</url-pattern> </servlet-mapping>
3、登录-请求重定向
-
程序思路
在loginDemo.jsp界面表单进行提交数据,提交到RedirectTest,在RedirectTest进行账号密码核验,如果符合就跳转至success.jsp页面
-
loginDemo.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录</title> </head> <body> <form action="${pageContext.request.contextPath}/redirect1" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit"> </form> </body> </html>
-
RedirectTest类
package org.westos.Response; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class RedirectTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //得到请求中的账号密码 String username = req.getParameter("username"); String password = req.getParameter("password"); //进行匹配,应该是从数据库中的数据进行匹配 if (username.equals("admin") && password.equals("123456")) { resp.sendRedirect("/hello/success.jsp"); } else { PrintWriter out = resp.getWriter(); out.write("账号或密码错误"); out.close(); } //设置编码 resp.setContentType("html/text"); resp.setCharacterEncoding("utf-8"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录成功</title> </head> <body> <h1>登陆成功</h1> </body> </html>
-
web.xml配置
<servlet> <servlet-name>RedirectTest</servlet-name> <servlet-class>org.westos.Response.RedirectTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>RedirectTest</servlet-name> <url-pattern>/redirect1</url-pattern> </servlet-mapping>
4、登录-请求转发
-
程序步骤
在loginDemo2.jsp页面登录,提交到ForwardTest处理,账号密码正确转发到success.jsp页面
-
loginDemo2.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录</title> </head> <body> <h1>登录</h1> <div style="text-align: center"> <%--以post的方式提交表单到login请求--%> <form action="${pageContext.request.contextPath}/forward" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> 爱好: <input type="checkbox" name="hobby" value="乒乓球">乒乓球 <input type="checkbox" name="hobby" value="听歌">听歌 <input type="checkbox" name="hobby" value="敲代码">敲代码 <input type="checkbox" name="hobby" value="电影">电影 <br> <input type="submit"> </form> </div> </body> </html>
-
ForwardTest代码
package org.westos.Response; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class ForwardTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置编码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); //得到请求的参数 String username = req.getParameter("username"); String password = req.getParameter("password"); String hobby = req.getParameter("hobby"); //进行匹配,应该是从数据库中的数据进行匹配 if (username.equals("admin") && password.equals("123456")) { req.getRequestDispatcher("/success.jsp").forward(req, resp); } else { PrintWriter out = resp.getWriter(); out.write("账号或密码错误"); out.close(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
success.jsp界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录成功</title> </head> <body> <h1>登陆成功</h1> </body> </html>
5、MVC三层架构
M:Model,模型,进行具体业务逻辑处理
V:view,视图,就是前端页面,用来展示数据
C:Controller,控制器,就是Servlet/Service,用来处理用户的请求,给客户端响应等
顺序:视图—>控制器—>模型—>数据库
6、过滤器Filter
Filter:用来过滤网站的数据
比如:中文乱码、登陆验证、处理垃圾请求等
-
过滤器类
package org.westos.filter; import javax.servlet.*; import java.io.IOException; //实现Filter接口 public class FilterTest implements Filter { //初始化方法,Web服务器一启动就开始初始化了,开始工作 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化方法的执行"); } //过滤方法 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //处理编码问题,每一个进来的请求都会执行 servletRequest.setCharacterEncoding("uft-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset-utf-8"); //让过滤链继续往下走 filterChain.doFilter(servletRequest, servletResponse); } //销毁方法,等待Web浏览器关闭的时候执行 public void destroy() { System.out.println("销毁方法的执行"); } }
-
web.xml配置
<filter> <filter-name>FilterTest</filter-name> <filter-class>org.westos.filter.FilterTest</filter-class> </filter> <filter-mapping> <filter-name>FilterTest</filter-name> <!--需要经过过滤器的路径--> <url-pattern>/*</url-pattern> </filter-mapping>
7、监听器
都间接的继承自EventListener接口
-
Java代码
package org.westos.listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * @BelongsProject: javaweb-01 * @BelongsPackage: org.westos.listener * @Author: 北风 * @CreateTime: 2020-02-18 22:36 * @Description: ${Description} */ //所有的监听器都间接的继承自EventListener接口 public class OnlineCountListener implements HttpSessionListener { //会话创建方法,一旦创建会话就会触发该事件 public void sessionCreated(HttpSessionEvent se) { //得到Servlet的上下文 ServletContext servletContext = se.getSession().getServletContext(); //打印每次创建的会话的sessionId System.out.println(se.getSession().getId()); //得到Session的在线数 Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount"); //进行判断,对Session在线数进行累加 if (onlineCount == null) { onlineCount = new Integer(1); } else { int count = onlineCount.intValue(); onlineCount = new Integer(count + 1); } //将Session的在线数重新赋值 servletContext.setAttribute("OnlineCount", onlineCount); } //会话销毁方法 //销毁Session会触发该事件 //session销毁分为手动销毁(getSession().invalidate()方法)和自动销毁 public void sessionDestroyed(HttpSessionEvent se) { ServletContext servletContext = se.getSession().getServletContext(); Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount"); if (onlineCount == null) { onlineCount = new Integer(0); } else { int count = onlineCount.intValue(); onlineCount = new Integer(count - 1); } servletContext.setAttribute("OnlineCount", onlineCount); } }
-
web.xml配置
<!--注册监听器--> <listener> <listener-class>org.westos.listener.OnlineCountListener</listener-class> </listener>