# Servlet重要類及其方法的應用 ## Servlet重要類及其方法的應用 ### 1.1 HttpServlet的一些方法介紹 ```java // this.getInitParameter();得到初始化參數 // this.getServletConfig();得到servlet配置就 ...
Servlet重要類及其方法的應用
Servlet重要類及其方法的應用
1.1 HttpServlet的一些方法介紹
// this.getInitParameter();得到初始化參數
// this.getServletConfig();得到servlet配置就是web.xml中我們寫的配置
// this.getServletContext();得到servlet上下文
1.2 ServletContext
web容器(tomcat)在啟動的時候,它會為每個web程式創建一個對應的ServletContext對象,它代表當前的web應用。
作用:
-
共用數據:不同servlet之間(類似vue的store)
//第一個servlet中 ServletContext servletContext = this.getServletContext(); String username = "lihua"; //將數據保存在其中,通過第一個參數取出數據,第二個參數是值 servletContext.setAttribute("username",username); //另外一個servlet ServletContext servletContext2 = this.getServletContext(); String username = (String) //取出 servletContext2.getAttribute("username"); //設置格式 resp.setContentType("text/html;charset=utf-8") //列印到響應中 resp.getWriter().print(username);
- 獲取初始化參數
<!--在web.xml中--> <!-- 配置一些web應用初始化參數:就是一些鍵值對--> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param>
//獲取初始化參數 ServletContext servletContext = this.getServletContext(); String url = servletContext.getInitParameter("url"); //jdbc:mysql://localhost:3306/mybatis
-
請求轉發
ServletContext servletContext = this.getServletContext(); //需要轉發的請求路徑 RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/hello"); requestDispatcher.forward(req,resp);//實現請求轉發 //合併前兩句 // servletContext.getRequestDispatcher("/hello").forward(req,resp);
現在本servlet路徑顯示的是/hello路徑的頁面
-
讀取資源文件
Properties:
- 在java目錄下新建properties(如db.properties)
- 在resources目錄下新建properties
發現都被打包到同一個路徑下:classes,俗稱類路徑
ServletContext servletContext = this.getServletContext(); //把資源變成流 InputStream resourceAsStream = servletContext.getResourceAsStream("/WEB-INFO/classes/db.properties"); Properties properties = new Properties(); properties.load(resourceAsStream); String username = properties.getProperty("username"); //得到:helloworld //db.properties中: username=helloworld
1.3 HttpServletResponse
web伺服器接收到客戶端的http請求,針對這個請求,分別創建一個代表請求的HttpsServletRequest代表,代表響應的一個HttpServletResponse
- 如果要獲取客戶端請求過來的參數,找HttpServletRequest
- 如果要給客戶端響應一些信息,找HttpServletResponse
簡單分類方法:
-
負責向瀏覽器發送信息的方法
-
getOutputStream()//位元組流 getWriter()//字元,用來寫中文等 //這些方法都是繼承自ServletResponse
-
-
負責向瀏覽器發送響應頭的方法
-
setCharacterEncoding(String charset) setContentLength(int len) setContentLengthLong(long len) setContentType(String type) //上述方法繼承自ServletResponse addDateHeader(String name, long date) setHeader(String name, String value) addHeader(String name, String value) setIntHeader(String name, int value) addIntHeader(String name, int value) //這些是自己類的方法,而且不止這些
-
-
響應碼和設置響應碼的方法
一些應用:
-
向瀏覽器輸出消息:不多說,上面一直在演示
-
下載文件
// 1.獲取下載路徑 String realPath ="C:\\Users\\adminster\\Desktop\\雨夜.png"; // 2.獲取下載文件名 // 截取字元串獲取文件名字 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3.想辦法讓瀏覽器支持下載(設置響應頭) // 如果文件路徑有中文的話需要UrlEncoder resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); // 4.獲取下載文件的輸入流 FileInputStream fileInputStream = new FileInputStream(realPath); // 5.創建緩衝區 int len = 0; byte[] bytes = new byte[1024]; // 6.獲取OutputStream對象 ServletOutputStream outputStream = resp.getOutputStream(); // 7.將OutputStream流寫入緩衝區 while ((len=fileInputStream.read(bytes))>0){ outputStream.write(bytes,0,len); } fileInputStream.close(); outputStream.close(); //最後成功下載文件
-
驗證碼功能
驗證碼是怎麼來的:
- 前端實現
- 後端實現,需要用到java的圖片類生成一個圖片
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 讓瀏覽器三秒刷新一次 resp.setHeader("refresh","3"); // 在記憶體創建一個圖片,參數寬高顏色 BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); // 圖片的畫筆 Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics(); // 設置圖片背景顏色 graphics2D.setColor(Color.RED); // 填充圖形 graphics2D.fillRect(0,0,80,20); // 給圖片寫數據 graphics2D.setColor(Color.blue); graphics2D.setFont(new Font(null,Font.BOLD,20)); graphics2D.drawString(makeNum(),0,20); // 告訴瀏覽器這個請求以圖片jpeg的形式打開 resp.setContentType("image/jpeg"); // 網站存在緩存,我們阻止其緩存,下麵三行可以不掌握 resp.setDateHeader("expires",-1); // 緩存控制,設置為不緩存 resp.setHeader("Cache-Control","no-cache"); // Pragma resp.setHeader("Pragma","no-cache"); // 把圖片寫給瀏覽器,以imageIO的形式 ImageIO.write(bufferedImage,"jpg",resp.getOutputStream()); } private String makeNum(){ Random random = new Random(); // 生成隨機數[0,10000000) int ; String s = random.nextInt(10000000) + ""; //以下步驟都是為了當為啥不夠七位時補零 StringBuffer sb = new StringBuffer(); for (int i = 0; i < 7 - s.length(); i++) { sb.append("0"); } s = sb.toString() + s; return s; }
效果:同時每三秒刷新一次為不同數字
-
Response重定向(最重要)
至於什麼是重定向?感覺說過很多次了,就是web資源收到客戶端請求之後,讓它去訪問另外一個資源的過程
//重定向操作: resp.sendRedirect("/SonMaven_war/img"); //重定向路徑不能只寫個/img,還需要加上部署的項目名
狀態碼3開頭都是重定向請求
轉發和重定向的區別:(131條消息) 請求轉發和重定向_豆蟲兒的博客-CSDN博客
請求轉發:request.getRequestDispatcher(URL地址).forward(request, response)
重定向:response.sendRedirect(URL地址)
重定向之後url地址變化,轉發不變
1.4 HttpServletRequest
代表客戶端的請求,用戶通過Http協議訪問伺服器,HTTP請求中的所有信息會被封裝得到HttpServletRequest
方法介紹一些重要的:
-
獲取前端傳遞的參數
//一個表單,index.jsp中 //修改編碼 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <form action="${pageContext.request.contextPath}/hello" method="get"> 用戶名:<input type="text" name="username"><br> 密碼:<input type="password" name="password"> <br> <input type="submit"> servlet中 // 解決後臺中文亂碼 req.setCharacterEncoding("utf-8"); // 得到表單參數 String username = req.getParameter("username"); String password = req.getParameter("password"); resp.setCharacterEncoding("utf-8"); // 一組同名的可以用 // String[] password =req.getParameterValues("password")
-
請求轉發
// 請求轉發,不像重定向不需要寫部署項目路徑 req.getRequestDispatcher("/error").forward(req,resp); //只改變頁面,路徑不變
問題一如何解決封裝到埠被占用?
打開cmd,輸入netstat -aon | find "1099",數字是被占用的埠號,然後打開任務管理器,輸入該進程的pid號結束進程
問題二不允許有匹配 [xX][m M][lL] 的處理指令目標
原因web.xml中
<?xml version="1.0" encoding="UTF-8" ?>
必須放在第一行