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>