使用步驟html
1.經過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)參數是轉發資源的路徑java
2.使用Requestispatcher對象進行轉發web
特色:瀏覽器地址欄路徑不會發生變化,只能轉發當前服務器內部資源,轉發是一次請求瀏覽器
域對象:一個有做用範圍的對象,能夠在範圍內共享數據緩存
request域:表明一次請求的範圍,通常用於請求轉發的多個資源中共享數據服務器
方法:dom
package com.Data.HttpServlet; import javax.servlet.RequestDispatcher; 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("/requestDemo1") public class RequestDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用request對象的方法setAttribute將數據存儲到request域中 request.setAttribute("msg","Hello"); System.out.println("RequestDemo1被訪問了。。。。"); //轉發到requestDemo2 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo2"); requestDispatcher.forward(request,response); } }
package com.Data.HttpServlet; 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("/requestDemo2") public class RequestDemo2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //訪問共享數據,經過鍵獲取值 System.out.println(request.getAttribute("msg")); System.out.println("RequestDemo2被訪問了。。。"); } }
RequestDemo1被訪問了。。。。 Hello RequestDemo2被訪問了。。。
獲取ServletContext:ide
ServletContext getServletContext()post
服務器端發送給客戶端的數據this
五種數據格式
1.響應行
1:組成:協議/版本 響應狀態嗎 狀態碼描述
2.響應狀態碼:服務器告訴客戶端瀏覽器本次請求和響應的一個狀態,狀態碼都是3位數字有5種狀態碼
- 1xx :服務器接收客戶端消息,但沒有接收完成,等待一段時間後,發送1xx多狀態碼
- 2xx :成功 。表明數字:200
- 3xx :重定向。表明:302(重定向),304(訪問緩存)
- 4xx :客戶端錯誤。表明(404)請求路徑沒有對應的資源,405(請求方式沒有對應的doxxx方法)
- 5xx : 服務端錯誤。表明:500(服務器內部出現異常,好比代碼有錯)
2.響應頭
格式:頭名稱 :值
常見的響應頭
Content-Type:服務器告訴客戶端本次響應體數據格式以繼編碼格式
Content-dispostition:服務器告訴客戶端以什麼格式打開響應體數據
3.響應空行
4響應體:傳輸的數據
package com.data; 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("/Demo1") public class ResponseServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("demo1...."); //完成重定向 //設置狀態碼爲302 //response.setStatus(302); //設置響應頭,頭的名稱,頭的值 //response.setHeader("location","/Demo2"); //重定向能夠訪問其餘站點資源 //response.sendRedirect("https://www.baidu.com");//訪問了百度 //重定向 response.sendRedirect("/Demo2"); //設置共享數據 request.setAttribute("msg","hello"); } }
package com.data; 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("/Demo2") public class ResponseServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //重定向能夠訪問其餘站點的資源 System.out.println("demo2....."); //重定向不能訪問共享數據 Object o1 = request.getAttribute("msg"); System.out.println(o1); } }
輸出結果 demo1.... demo2..... null
重定向的特色:redirect
相對路徑:經過相對路徑不能夠肯定惟一資源
絕對路徑: 經過絕對路徑能夠肯定惟一資源,給客戶端瀏覽器使用須要加虛擬目錄,給服務器使用,不須要加虛擬目錄
package com.data; 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("/Demo3") public class ResponseServlet3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用響應頭,告訴瀏覽器我使用的編碼 //瀏覽器收到響應,就會按照指定字符集解碼 response.setContentType("text/html;charset=utf-8"); //response.setHeader("content-type","text/html;charset=utf-8"); //向客戶端輸出數據,先要獲取字符輸出流 PrintWriter writer = response.getWriter(); writer.write("<h1>你好,world</h1>"); } }
package com.data; 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; @WebServlet("/Demo3") public class ResponseServlet3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write("你好,客戶端".getBytes("utf-8")); } }
package com.data; import javax.imageio.ImageIO; 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.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; @WebServlet("/Demo4") public class CheckCodeServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int width = 100; int height = 50; //建立對象,該對象能夠在內存中生成圖片 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //美化圖片 //填充背景色 Graphics g = image.getGraphics(); g.setColor(Color.PINK); g.fillRect(0,0,width,height); //畫邊框 g.setColor(Color.BLUE); g.drawRect(0,0,width-1,height-1); String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 寫驗證碼 Random ran = new Random(); for(int i = 1;i<=4;i++){ int index = ran.nextInt(str.length()); char ch = str.charAt(index); g.drawString(ch+"",width/5*i,height/2); } g.setColor(Color.GREEN); for (int i = 0 ; i< 10 ;i++){ int x1 = ran.nextInt(width); int x2 = ran.nextInt(width); int y1 = ran.nextInt(height); int y2 = ran.nextInt(height); g.drawLine(x1,y1,x2,y2); } //將圖片輸出到頁面上 ImageIO.write(image,"jpg",resp.getOutputStream()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> // 分析: // 點擊超連接或者圖片,須要換一張, // 給圖片和超連接綁定單擊事件 window.onload=function () { //獲取圖片對象 var img=document.getElementById("change"); //綁定單擊事件 img.onclick=function () { var date =new Date().getTime(); img.src="/day14/Demo4"+date; } } </script> </head> <body> <img id="checkCode" src="/day14/Demo4" /> <a id="change" href="">看不清?換一張</a> </body> </html>
1.概念:表明整個web應用,能夠和程序的容器來通訊
獲取方式:
1.request.getServletContext();
2.this.getServletContext();
功能:獲取MIME類型(在互聯網通訊過程種定義的一種文件數據類型,不如text/html,image/jpeg)
package com.data; import javax.servlet.ServletContext; 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("/Demo5") public class ServletDemo5 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取MIME類型 ServletContext context=this.getServletContext(); //定義文件名稱 String filename = "a.jpg"; //獲取MIME類型 String mimeType = context.getMimeType(filename); System.out.println(mimeType); } } //image/jpeg
功能:域對象,共享數據
域對象的方法
setArrtibute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
功能:獲取文件服務器路徑
文件在項目目錄下,能夠直接文件名獲取路徑 在WEB-INF目錄下,須要加上WEB-INF才能夠獲取 src目錄下的全部文件未來都存放在/WEB-INF/classes目錄下
package com.data; import javax.servlet.ServletContext; 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("/Demo5") public class ServletDemo5 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取web目錄下的資源訪問 ServletContext context = this.getServletContext(); String realPath = context.getRealPath("/b.txt");//b.txt在項目目錄下,能夠直接文件名獲取路徑 System.out.println(realPath); //獲取WEB-INF目錄下的資源訪問 String realPath1 = context.getRealPath("/WEB-INF/c.txt");//c.txt在WEB-INF目錄下,須要加上WEB-INF才能夠獲取到路徑 System.out.println(realPath1); //獲取src目錄下的資源能路徑 String realPath2 = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的全部文件未來都存放在/WEB-INF/classes目錄下 System.out.println(realPath2); } }