但在實際開發中,咱們不會直接去實現Servlet接口,由於那樣須要覆蓋的方法太多, 咱們通常建立類繼承HttpServlethtml
實現步驟:web
1)建立類繼承HttpServlet類瀏覽器
2)覆蓋doGet和doPosttomcat
3)在web.xml中進行servlet的配置服務器
咱們在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲表明請求的request和表明響應response。service方法中的response的類型是ServletResponse,而doGet/doPost方法的response的類型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更增強大,今天咱們學習HttpServletResponse。網絡
response的運行流程jsp
2.經過response設置響應行 post
1 //設置狀態碼 2 response.setStatus(405);
3.經過response設置響應頭性能
//添加響應頭 response.addHeader("name2", "bianxiutong"); //5秒後跳轉百度 response.setHeader("refresh", "5;url=https://baidu.com/"); /*//重定向步驟:1.設置狀態碼 response.setStatus(302); //2.設置響應頭Location response.setHeader("Location", "/Servlet04");*/ //實際開發中,上面的代碼不會使用,重定向用一句話搞定 response.sendRedirect("/Servlet04");
4.經過response設置響應體學習
1 response.getWriter().write("hello dandan...");
案例--文件下載
(1)向瀏覽器輸出一張照片
1 //向客戶端輸出一張圖片 2 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3 //明確數據源 4 String path=getServletContext().getRealPath("IMG_0152.JPG"); 5 //得到輸入流 6 FileInputStream fis=new FileInputStream(path); 7 //明確目的地 8 ServletOutputStream sos=response.getOutputStream(); 9 //複製 10 int len=0; 11 byte[] bytes=new byte[1024]; 12 while((len=fis.read(bytes))!=-1){ 13 sos.write(bytes, 0, len); 14 } 15 //釋放資源 16 fis.close(); 17 }
(2)提供下載
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //獲取要下載的文件名稱 3 String filename=request.getParameter("filename"); 4 //response解決中文亂碼 5 filename=new String(filename.getBytes("ISO8859-1"),"utf-8"); 6 //要下載的文件類型--客戶端會經過文件的MIME類型去區分類型 7 response.setContentType(getServletContext().getMimeType(filename)); 8 //獲取請求頭中的瀏覽器信息 9 String agent=request.getHeader("User-Agent"); 10 //複製不一樣瀏覽器對文件名編碼的代碼 11 String filenameEncoder=""; 12 if (agent.contains("MSIE")) { 13 // IE瀏覽器 14 filenameEncoder = URLEncoder.encode(filename, "utf-8"); 15 filenameEncoder = filenameEncoder.replace("+", " "); 16 } else if (agent.contains("Firefox")) { 17 // 火狐瀏覽器 18 BASE64Encoder base64Encoder = new BASE64Encoder(); 19 filenameEncoder= "=?utf-8?B?" 20 + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; 21 } else { 22 // 其它瀏覽器 23 filenameEncoder= URLEncoder.encode(filename, "utf-8"); 24 } 25 //要告知客戶端文件的打開方式(下載) 26 response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder); 27 //獲取文件的絕對路徑 28 String path=getServletContext().getRealPath("download/"+filename); 29 //得到該文件的輸入流 30 FileInputStream fis=new FileInputStream(path); 31 //獲取文件輸出流 32 ServletOutputStream sos=response.getOutputStream(); 33 //文件複製 34 int len=0; 35 byte[] bytes=new byte[1024]; 36 while((len=fis.read(bytes))!=-1){ 37 sos.write(bytes, 0, len); 38 } 39 //釋放資源 40 fis.close(); 41 }
下載html:
<h1>使用服務器端的編碼方式實現文件的下載</h1> <a href="/WEB04/DownLoadServlet?filename=IMG_0152.JPG">IMG_0152.JPG</a> <a href="/WEB04/DownLoadServlet?filename=你好.txt">你好.txt</a> <a href="/WEB04/DownLoadServlet?filename=New Folder.zip">New Folder.zip</a> <a href="/WEB04/DownLoadServlet?filename=ServletCOntext.wmv">ServletCOntext.wmv</a>
response細節點:
關於中文亂碼問題
https://www.cnblogs.com/-dashu/p/9625892.html
咱們在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲表明請求的request和表明響應response。service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更增強大,今天咱們學習HttpServletRequest。
response的運行流程
http請求
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //1.獲取請求方式 3 String method=request.getMethod(); 4 System.out.println("請求方式:"+method); 5 //2.獲取請求資源的相關內容 6 String requestURI=request.getRequestURI(); 7 System.out.println("requestURI:"+requestURI); 8 StringBuffer requestURL=request.getRequestURL(); 9 System.out.println("requestURL:"+requestURL); 10 //3.獲取WEB應用名稱 11 String contextpath=request.getContextPath(); 12 System.out.println("WEB項目名稱爲:"+contextpath); 13 //4.獲取get方式提交url後的參數信息 14 String queryString=request.getQueryString(); 15 System.out.println("get提交參數信息"+queryString); 16 //5.獲取客戶端的訪問者的ip地址 17 String ip=request.getRemoteAddr(); 18 System.out.println("ip地址爲:"+ip); 19 }
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //1.獲取指定的頭 3 String agent=request.getHeader("User-Agent"); 4 System.out.println(agent); 5 //2.獲取全部頭的名稱 6 Enumeration<String> headerNames=request.getHeaderNames(); 7 while(headerNames.hasMoreElements()){ 8 String headerName=headerNames.nextElement(); 9 String headerValue=request.getHeader(headerName); 10 System.out.println(headerName+"..."+headerValue); 11 } 12 }
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //獲取referer的信息 3 String refer=request.getHeader("referer"); 4 //解決中文亂碼 5 response.setContentType("text/hetml;charset=utf-8"); 6 //對referer進行判斷 7 if(refer!=null&& refer.startsWith("http://localhost")){ 8 response.getWriter().write("1、京東重創中國網絡零售商京東創始人劉強東涉嫌犯罪事態升級。明尼拿波里斯警察局發言人埃爾德(John Elder)接受電話採訪表示,劉強東涉嫌強暴重罪。"); 9 }else{ 10 response.getWriter().write("你是盜鏈者,可恥"); 11 } 12 }
form.jsp:
<form action="/WEB06/ContentServlet" method="post"> 用戶名:<input type="text" name="username"><br> <input type="checkbox" name="hobby" value="zq">足球 <input type="checkbox" name="hobby" value="lq">籃球 <input type="checkbox" name="hobby" value="pq">排球 <input type="checkbox" name="hobby" value="ppq">乒乓球 <input type="submit" value="提交"> </form>
servlet:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //獲取單個值 3 String username=request.getParameter("username"); 4 //獲取指定表單元素的value值 5 String[] hobbys=request.getParameterValues("hobby"); 6 for(String h:hobbys){ 7 System.out.println(h); 8 } 9 //獲取全部參數,並封裝到一個Map<String,String[]>中 10 Map<String,String[]> map=request.getParameterMap(); 11 for(Map.Entry<String,String[]> entry:map.entrySet()){ 12 //參數的name值 13 System.out.println(entry.getKey()); 14 //參數value值(String[]) 15 for(String str:entry.getValue()){ 16 System.out.println(str); 17 } 18 System.out.println("-----------------"); 19 } 20 }
(1)request是一個域對象
//往域對象中設置值 request.setAttribute("name", "張三"); //中文亂碼 response.setContentType("text/hetml;charset=utf-8"); //獲取域對象值 String name=(String)request.getAttribute("name"); response.getWriter().write(name);
(2)request完成請求轉發
//請求轉發--得到轉發器、經過轉發器轉發 request.getRequestDispatcher("/Servlet2").forward(request, response);
轉發與重定向的區別?
1)重定向兩次請求,轉發一次請求
2)重定向地址欄的地址變化,轉發地址不變
3)從新定向能夠訪問外部網站 轉發只能訪問內部資源
4)轉發的性能要優於重定向
注意:ServletContext域與Request域的生命週期比較?
ServletContext:
建立:服務器啓動
銷燬:服務器關閉
域的做用範圍:整個web應用
request:
建立:訪問時建立request
銷燬:響應結束request銷燬
域的做用範圍:一次請求中
注意:客戶端地址與服務器端地址的寫法?
客戶端地址:
是客戶端去訪問服務器的地址,服務器外部的地址,特色:寫上web應用名 稱
直接輸入地址:重定向
服務器端地址:
服務器內部資源的跳轉的地址,特色:不須要寫web應用的名稱
請求轉發