您好,登錄后才能下訂單哦!
Http協議: 瀏覽器和服務器進行數據交互時,數據的一種規范
請求行: 請求方式 請求路徑?get請求參數 協議/版本(http/1.1)
getMethod()
getContextPath()
getRemoteAddr()
getLocalPort()
請求頭: key/values
getHeader("頭名稱");
重要頭:
referer: 防盜鏈
user-agent: 用戶代理
cookie:
請求體: post請求時攜帶的參數(get請求沒有請求體)
獲取請求參數: ★★★ 瀏覽器攜帶的參數,我們所獲取的都是字符串
String getParameter("名稱");
String[] getParameterValues("名稱");
Map<String,String[]> getParameterMap("名稱");
BeanUtils:
populate(實體對象,map集合);
請求轉發: 一次請求的延續(可以經過多個servlet)
request.getRequestDispatcher("/請求轉發的地址").forWard(req,resp);
作用域:
request.setAttribute(String,Object);
// 設置相同名稱的屬性就是 修改
request.getAttribute(String);
request.removeAttribute(String);
響應: 服務器給瀏覽器的內容
組成:
響應行 響應頭 響應體
響應行
格式:
協議/版本 響應的狀態碼 (狀態碼說明)
tomcat8.5中沒有響應狀態碼說明了
eg: HTTP/1.1 200 OK tomcat7
狀態碼:
1xx :請求已發送
2xx :響應已完成
200:響應成功(請求成功)
3xx :需要瀏覽器進一步操作才可以完成
302:重定向(配合location頭使用)
304:讀緩存
4xx :用戶訪問錯誤
404:用戶訪問的資源不存在
5xx :服務器內部錯誤
500:服務器內部異常
響應頭
格式:
key/values的格式 (values可以為多個值的)
常見的響應頭
Location: http://www.it315.org/index.jsp --跳轉方向
Server:apache tomcat --服務器型號
Content-Encoding: gzip --數據壓縮
Content-Length: 80 --數據長度
Content-Language: zh-cn --語言環境
Content-Type: text/html; charset=utf-8 --數據類型(MIME類型) 大類型/小類型 text/javascript
index.html text/html
設置響應文件的mime類型
設置響應流的編碼方式
通知瀏覽器使用指定的編碼解析
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改時間
Refresh: 1(秒);url=http://www.it315.org --定時刷新
Content-Disposition: attachment; filename=aaa.zip --下載 用于文件下載 附件
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
重點的頭:
Content-Type Refresh Content-Disposition Location Set-Cookie
響應體
瀏覽器解析的內容
response★
設置服務器發送給瀏覽器的內容
HttpServletResponse
操作響應行:
協議/版本 狀態碼(說明)
常用方法
(理解)setStatus(int code):針對1 2 3 開頭的
(了解)sendError(int code):針對 4 5 開頭的
操作響應頭:
格式: key/values
常用方法
(重點)setHeader(String name,String value); // 設置一個字符串形式的響應頭
sendRedirect("路徑"); // 重定向
常見的響應頭
location:重定向
方式1: 需要配合302狀態碼一起使用 (了解)
response.setStatus(302);
response.setHeader("location","絕對路徑");
路徑:絕對路徑
方式2: (掌握)
response.sendRedirect("路徑");
重定向發送的是多次請求
重定向不可以共享request對象(因為發送的是多次請求)
重定向時瀏覽器地址欄顯示的是最后一次的地址
重定向可以跳轉到任何路徑
refresh:定時刷新
response.setHeader("refresh","秒數;url=跳轉的路徑"); 幾秒之后跳轉到指定的路徑上
content-type:設置文件的mime類型
設置響應文件的mime類型
設置響應流的編碼方式
通知瀏覽器使用指定的編碼解析
方式1: 了解
response.setHeader("content-type","mime類型;charset=編碼");
response.setHeader("content-type","text/html;charset=utf-8");
方式2: 掌握
response.setContentType("文件的mime類型;charset=utf-8");
content-disposition:文件下載專用頭
response.setHeader("content-disposition","attachment;filename="+文件名稱);
操作響應體:
常用方法:
PrintWriter getWriter():字符流
ServletOutputStream getOutputStream():字節流
注意事項:
自己編寫的文件 一般都使用字符流輸出 如:txt html等
音頻,視頻等文件使用字節流輸出
==字節流和字符流互斥,不能同時使用==
服務器會幫我們釋放資源,建議自己關閉;底層使用的緩存流
ServletContext:
上下文對象,全局管理者,知曉一個項目中所有Servlet的一切信息
作用:
獲取文件的mime類型 *.html text/html
資源共享
獲取資源的完整路徑
生命周期:
創建:
當服務器啟動的時候,服務器會為每一個項目創建servletcontext對象,一個項目只有一個servletcontext對象
銷毀:
項目從服務器上移除或者服務器關閉的時候
servletContext對象與項目共存亡
獲取方式:
方式1:通過ServletConfig對象獲取
ServletConfig().getServletContext();
方式2:通過getServletContext方法獲取 ★★★
getServletContext();
常用方法(API):
(掌握)獲取一個文件的mime類型
String getMimeType(String 文件名)
(掌握)資源共享: 相當于一個map集合
setAttribute(String name,Object value): 設置
設置相同名稱的屬性就是修改
getAttribute(String name):獲取指定的屬性值
removeAttribute(String name):移除指定的屬性
(掌握)獲取資源在服務器上的路徑
String getRealPath(String filepath)
注意:
filepath:直接從項目的根目錄開始寫
getRealPath("/") ---> d:/tomcat/webapps/day14
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function isIE(){ // 判斷用戶使用的瀏覽器是否為IE瀏覽器
//獲取當前瀏覽器相關信息
var explorer = window.navigator.userAgent.toLowerCase() ;
//判斷是否是ie瀏覽器
if (explorer.indexOf("msie") >= 0 || explorer.indexOf("rv:11.0) like gecko") >=
0) {
return true;
}else {
return false;
}
}
window.onload = function () { // 頁面加載成功事件
if(isIE()){
//在是IE瀏覽器的情況下,對中文請求參數編碼
var str = document.getElementById("ww").href;
str = encodeURI(str);
document.getElementById("ww").href = str;
}
};
function changeImg(obj) {
//alert(1);
obj.src = "anli5?aa="+new Date().getTime();
}
</script>
</head>
<body>
<h4>response對象的相關操作</h4>
<a href="refresh">3秒鐘之后跳轉到黑馬官網(定時刷新)</a> <br>
<a href="my?money=40">案例2-班長借錢(重定向)</a> <br>
<a href="anli3">案例3-返回中文無亂碼</a> <br>
<a href="body">操作響應體</a> <br>
<hr>
<h4>上下文對象</h4>
<a href="getMime?filename=aa.js">通過上下文對象獲取文件的mime類型</a> <br>
<a href="setAttr">向上下文對象中設置屬性</a> <br>
<a href="getAttr">從上下文對象中獲取屬性</a> <br>
<a href="updateAttr">修改上下文對象中的屬性</a> <br>
<a href="removeAttr">刪除上下文對象中的屬性</a> <br>
<a href="getRealPath">獲取資源在服務器上的完整路徑</a> <br>
<h4>文件下載</h4>
<a href="download?filename=meinv.png">美女的誘惑(下載)</a> <br>
<a href="download?filename=aa.txt">大數據簡單理解(下載)</a> <br>
<a id="ww" href="download?filename=大數據簡單理解.txt">大數據簡單理解1(下載)</a> <br>
<h4>驗證碼</h4>
<img src="anli5" alt="" onclick="changeImg(this)"> <br>
</body>
</html>
需求分析:
訪問一個servlet,3秒鐘之后跳轉到黑馬官網(定時刷新)
技術分析:
響應頭: refresh="3;url=http://www.itheima.com"
設置響應頭:
response.setHeader("refresh","3;url=http://www.itheima.com");
package com.itheima.a_anli1;
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(name = "RefreshServlet", urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 實現定時刷新
// 設置響應頭信息 refresh
response.setHeader("refresh","3;url=http://www.itheima.com");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
MyServlert
package com.itheima.b_location;
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(name = "MyServlet", urlPatterns = "/my")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("班長曰: 借我錢!");
System.out.println("我曰: 借多少啊?");
System.out.println("班長曰: 自己獲取....");
System.out.println(request.getParameter("money"));
System.out.println("我曰: 不好意思,沒有零錢,你去找花花借吧...");
System.out.println("班長曰: 花花在哪? ");
//------------------- 重定向
// 方式1: 了解
//a.設置響應狀態碼
//response.setStatus(302);
//b.設置重定向的路徑 /day04/hua
//response.setHeader("location",request.getContextPath()+"/hua?money=400");
//b.方式2:
response.sendRedirect(request.getContextPath()+"/hua?money=400");
//response.sendRedirect("http://www.itheima.com/");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
HuaServler
package com.itheima.b_location;
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(name = "HuaServlet", urlPatterns = "/hua")
public class HuaServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("班長曰: 花花,借我錢!");
System.out.println("花花曰: 借多少呀?");
System.out.println("班長曰: 自己獲取?");
System.out.println(request.getParameter("money"));
response.getWriter().print("success....");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package com.itheima.c_anli3;
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(name = "Anli3Servlet", urlPatterns = "/anli3")
public class Anli3Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 返回一段中文信息
// response.setHeader("content-type","text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("你好美女....success");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
需求分析:
當用戶在瀏覽器上點擊"下載"超鏈接時,向服務器發送一個文件下載的請求
將服務器上的文件保存到本地
技術分析:
瀏覽器: 提供文件下載的超鏈接
<a href="download?filename=meinv.png">美女的誘惑(下載)</a>
<a href="download?filename=aa.txt">java資料(下載)</a>
服務器:
設置兩個頭,一個流
設置 文件的mime類型
response.setContentType(文件的mime類型);
設置 文件下載專用頭 attachment(附件) filename: 文件下載時,保存文件的默認名稱
response.setHeader("content-disposition","attachment;filename="+文件名稱);
獲取文件輸出流
response.getOutputStream();
步驟分析:
前端:
<a href="download?filename=meinv.png">美女的誘惑(下載)</a>
后臺:
//1.獲取被下載的文件的名稱
String filename = request.getParameter("filename");
//2.設置兩個頭
//a.設置 文件的mime類型
// 獲取上下文對象
context = getServletContext();
// 獲取被下載文件的mime類型
String mimeType = context.getMimeType(filename);
response.setContentType(mimeType);
//b.設置 文件下載專用頭 attachment(附件) filename: 文件下載時,保存文件的默認名稱
response.setHeader("content-disposition","attachment;filename="+filename);
//3.獲取文件輸出流
// 讀取文件
// 找到文件在服務器上的完整路徑
String realPath = context.getRealPath("/download/"+filename);
// 獲取文件的輸入流
InputStream is = new FileInputStream(realPath);
// 輸出流
os = response.getOutputStream();
// 流的對拷
package com.itheima.f_download;
import javax.servlet.ServletContext;
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.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet(name = "DownloadServlet", urlPatterns = "/download")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 設置request對象的編解碼方式
request.setCharacterEncoding("utf-8");
//1.獲取被下載的文件的名稱
String filename = request.getParameter("filename");
//2.設置兩個頭
//a.設置 文件的mime類型
// 獲取上下文對象
ServletContext context = getServletContext();
// 獲取被下載文件的mime類型
String mimeType = context.getMimeType(filename);
response.setContentType(mimeType);
//b.設置 文件下載專用頭 attachment(附件) filename: 文件下載時,保存文件的默認名稱
//response.setHeader("content-disposition","attachment;filename="+filename);
//-------------------- 處理文件下載時,默認名稱(中文亂碼)
// 文件下載注意事項: 文件下載的默認名稱永遠使用瀏覽器自己的編解碼方式進行解碼
//String name = "美女.png";
//name = URLEncoder.encode(name,"utf-8");
// 使用工具類實現
String agent = request.getHeader("user-agent");
String name = DownLoadUtils.getName(agent,filename);
//---------------------
response.setHeader("content-disposition","attachment;filename="+name);
//3.獲取文件輸出流
// 讀取文件
// 找到文件在服務器上的完整路徑
String realPath = context.getRealPath("/download/"+filename);
// 獲取文件的輸入流
FileInputStream is = new FileInputStream(realPath);
// 輸出流
ServletOutputStream os = response.getOutputStream();
// 流的對拷
int len = 0;
byte b[] = new byte[1024];
while((len=is.read(b))!=-1){
os.write(b,0,len);
}
// 關流
os.close();
is.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
工具類
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import sun.misc.BASE64Encoder;
public class DownLoadUtils {
/**
@param agent : 用戶代理
@param filename : 文件名稱
@return
@throws UnsupportedEncodingException
/
public static String getName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("Firefox")) {
// 火狐瀏覽器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
### 案例5:點擊切換驗證碼
package com.itheima.g_anli5;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
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;
@WebServlet(name = "CodeServlet",urlPatterns = "/anli5")
public class CodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 使用java圖形界面技術繪制一張圖片
int charNum = 4; // 生成4位的驗證碼
int width = 20 * 4; // 圖片寬
int height = 28; // 圖片高
// 1. 創建一張內存圖片
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 2.獲得繪圖對象
Graphics graphics = bufferedImage.getGraphics();
// 3、繪制背景顏色
graphics.setColor(Color.YELLOW);
graphics.fillRect(0, 0, width, height);
// 4、繪制圖片邊框
graphics.setColor(Color.GRAY);
graphics.drawRect(0, 0, width - 1, height - 1);
// 5、輸出驗證碼內容
graphics.setColor(Color.RED);
graphics.setFont(new Font("宋體", Font.BOLD, 22));
// 隨機輸出4個字符
String s = "ABCDEFGHGKLMNPQRSTUVWXYZ23456789";
Random random = new Random();
// session中要用到
String msg = "";
int x = 5;
for (int i = 0; i < charNum; i++) {
int index = random.nextInt(32);
String content = String.valueOf(s.charAt(index));
msg += content;
graphics.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
graphics.drawString(content, x, 22);
x += 20;
}
// 6、繪制干擾線
graphics.setColor(Color.GRAY);
for (int i = 0; i < 5; i++) {
int x1 = random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
}
// 釋放資源
graphics.dispose();
// 圖片輸出 ImageIO
ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。