您好,登錄后才能下訂單哦!
Http協(xié)議: 瀏覽器和服務(wù)器進(jìn)行數(shù)據(jù)交互時(shí),數(shù)據(jù)的一種規(guī)范
請(qǐng)求行: 請(qǐng)求方式 請(qǐng)求路徑?get請(qǐng)求參數(shù) 協(xié)議/版本(http/1.1)
getMethod()
getContextPath()
getRemoteAddr()
getLocalPort()
請(qǐng)求頭: key/values
getHeader("頭名稱");
重要頭:
referer: 防盜鏈
user-agent: 用戶代理
cookie:
請(qǐng)求體: post請(qǐng)求時(shí)攜帶的參數(shù)(get請(qǐng)求沒有請(qǐng)求體)
獲取請(qǐng)求參數(shù): ★★★ 瀏覽器攜帶的參數(shù),我們所獲取的都是字符串
String getParameter("名稱");
String[] getParameterValues("名稱");
Map<String,String[]> getParameterMap("名稱");
BeanUtils:
populate(實(shí)體對(duì)象,map集合);
請(qǐng)求轉(zhuǎn)發(fā): 一次請(qǐng)求的延續(xù)(可以經(jīng)過多個(gè)servlet)
request.getRequestDispatcher("/請(qǐng)求轉(zhuǎn)發(fā)的地址").forWard(req,resp);
作用域:
request.setAttribute(String,Object);
// 設(shè)置相同名稱的屬性就是 修改
request.getAttribute(String);
request.removeAttribute(String);
響應(yīng): 服務(wù)器給瀏覽器的內(nèi)容
組成:
響應(yīng)行 響應(yīng)頭 響應(yīng)體
響應(yīng)行
格式:
協(xié)議/版本 響應(yīng)的狀態(tài)碼 (狀態(tài)碼說明)
tomcat8.5中沒有響應(yīng)狀態(tài)碼說明了
eg: HTTP/1.1 200 OK tomcat7
狀態(tài)碼:
1xx :請(qǐng)求已發(fā)送
2xx :響應(yīng)已完成
200:響應(yīng)成功(請(qǐng)求成功)
3xx :需要瀏覽器進(jìn)一步操作才可以完成
302:重定向(配合location頭使用)
304:讀緩存
4xx :用戶訪問錯(cuò)誤
404:用戶訪問的資源不存在
5xx :服務(wù)器內(nèi)部錯(cuò)誤
500:服務(wù)器內(nèi)部異常
響應(yīng)頭
格式:
key/values的格式 (values可以為多個(gè)值的)
常見的響應(yīng)頭
Location: http://www.it315.org/index.jsp --跳轉(zhuǎn)方向
Server:apache tomcat --服務(wù)器型號(hào)
Content-Encoding: gzip --數(shù)據(jù)壓縮
Content-Length: 80 --數(shù)據(jù)長(zhǎng)度
Content-Language: zh-cn --語言環(huán)境
Content-Type: text/html; charset=utf-8 --數(shù)據(jù)類型(MIME類型) 大類型/小類型 text/javascript
index.html text/html
設(shè)置響應(yīng)文件的mime類型
設(shè)置響應(yīng)流的編碼方式
通知瀏覽器使用指定的編碼解析
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改時(shí)間
Refresh: 1(秒);url=http://www.it315.org --定時(shí)刷新
Content-Disposition: attachment; filename=aaa.zip --下載 用于文件下載 附件
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
重點(diǎn)的頭:
Content-Type Refresh Content-Disposition Location Set-Cookie
響應(yīng)體
瀏覽器解析的內(nèi)容
response★
設(shè)置服務(wù)器發(fā)送給瀏覽器的內(nèi)容
HttpServletResponse
操作響應(yīng)行:
協(xié)議/版本 狀態(tài)碼(說明)
常用方法
(理解)setStatus(int code):針對(duì)1 2 3 開頭的
(了解)sendError(int code):針對(duì) 4 5 開頭的
操作響應(yīng)頭:
格式: key/values
常用方法
(重點(diǎn))setHeader(String name,String value); // 設(shè)置一個(gè)字符串形式的響應(yīng)頭
sendRedirect("路徑"); // 重定向
常見的響應(yīng)頭
location:重定向
方式1: 需要配合302狀態(tài)碼一起使用 (了解)
response.setStatus(302);
response.setHeader("location","絕對(duì)路徑");
路徑:絕對(duì)路徑
方式2: (掌握)
response.sendRedirect("路徑");
重定向發(fā)送的是多次請(qǐng)求
重定向不可以共享request對(duì)象(因?yàn)榘l(fā)送的是多次請(qǐng)求)
重定向時(shí)瀏覽器地址欄顯示的是最后一次的地址
重定向可以跳轉(zhuǎn)到任何路徑
refresh:定時(shí)刷新
response.setHeader("refresh","秒數(shù);url=跳轉(zhuǎn)的路徑"); 幾秒之后跳轉(zhuǎn)到指定的路徑上
content-type:設(shè)置文件的mime類型
設(shè)置響應(yīng)文件的mime類型
設(shè)置響應(yīng)流的編碼方式
通知瀏覽器使用指定的編碼解析
方式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="+文件名稱);
操作響應(yīng)體:
常用方法:
PrintWriter getWriter():字符流
ServletOutputStream getOutputStream():字節(jié)流
注意事項(xiàng):
自己編寫的文件 一般都使用字符流輸出 如:txt html等
音頻,視頻等文件使用字節(jié)流輸出
==字節(jié)流和字符流互斥,不能同時(shí)使用==
服務(wù)器會(huì)幫我們釋放資源,建議自己關(guān)閉;底層使用的緩存流
ServletContext:
上下文對(duì)象,全局管理者,知曉一個(gè)項(xiàng)目中所有Servlet的一切信息
作用:
獲取文件的mime類型 *.html text/html
資源共享
獲取資源的完整路徑
生命周期:
創(chuàng)建:
當(dāng)服務(wù)器啟動(dòng)的時(shí)候,服務(wù)器會(huì)為每一個(gè)項(xiàng)目創(chuàng)建servletcontext對(duì)象,一個(gè)項(xiàng)目只有一個(gè)servletcontext對(duì)象
銷毀:
項(xiàng)目從服務(wù)器上移除或者服務(wù)器關(guān)閉的時(shí)候
servletContext對(duì)象與項(xiàng)目共存亡
獲取方式:
方式1:通過ServletConfig對(duì)象獲取
ServletConfig().getServletContext();
方式2:通過getServletContext方法獲取 ★★★
getServletContext();
常用方法(API):
(掌握)獲取一個(gè)文件的mime類型
String getMimeType(String 文件名)
(掌握)資源共享: 相當(dāng)于一個(gè)map集合
setAttribute(String name,Object value): 設(shè)置
設(shè)置相同名稱的屬性就是修改
getAttribute(String name):獲取指定的屬性值
removeAttribute(String name):移除指定的屬性
(掌握)獲取資源在服務(wù)器上的路徑
String getRealPath(String filepath)
注意:
filepath:直接從項(xiàng)目的根目錄開始寫
getRealPath("/") ---> d:/tomcat/webapps/day14
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function isIE(){ // 判斷用戶使用的瀏覽器是否為IE瀏覽器
//獲取當(dāng)前瀏覽器相關(guān)信息
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瀏覽器的情況下,對(duì)中文請(qǐng)求參數(shù)編碼
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對(duì)象的相關(guān)操作</h4>
<a href="refresh">3秒鐘之后跳轉(zhuǎn)到黑馬官網(wǎng)(定時(shí)刷新)</a> <br>
<a href="my?money=40">案例2-班長(zhǎng)借錢(重定向)</a> <br>
<a href="anli3">案例3-返回中文無亂碼</a> <br>
<a href="body">操作響應(yīng)體</a> <br>
<hr>
<h4>上下文對(duì)象</h4>
<a href="getMime?filename=aa.js">通過上下文對(duì)象獲取文件的mime類型</a> <br>
<a href="setAttr">向上下文對(duì)象中設(shè)置屬性</a> <br>
<a href="getAttr">從上下文對(duì)象中獲取屬性</a> <br>
<a href="updateAttr">修改上下文對(duì)象中的屬性</a> <br>
<a href="removeAttr">刪除上下文對(duì)象中的屬性</a> <br>
<a href="getRealPath">獲取資源在服務(wù)器上的完整路徑</a> <br>
<h4>文件下載</h4>
<a href="download?filename=meinv.png">美女的誘惑(下載)</a> <br>
<a href="download?filename=aa.txt">大數(shù)據(jù)簡(jiǎn)單理解(下載)</a> <br>
<a id="ww" href="download?filename=大數(shù)據(jù)簡(jiǎn)單理解.txt">大數(shù)據(jù)簡(jiǎn)單理解1(下載)</a> <br>
<h4>驗(yàn)證碼</h4>
<img src="anli5" alt="" onclick="changeImg(this)"> <br>
</body>
</html>
需求分析:
訪問一個(gè)servlet,3秒鐘之后跳轉(zhuǎn)到黑馬官網(wǎng)(定時(shí)刷新)
技術(shù)分析:
響應(yīng)頭: refresh="3;url=http://www.itheima.com"
設(shè)置響應(yīng)頭:
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 {
// 實(shí)現(xiàn)定時(shí)刷新
// 設(shè)置響應(yīng)頭信息 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("班長(zhǎng)曰: 借我錢!");
System.out.println("我曰: 借多少啊?");
System.out.println("班長(zhǎng)曰: 自己獲取....");
System.out.println(request.getParameter("money"));
System.out.println("我曰: 不好意思,沒有零錢,你去找花花借吧...");
System.out.println("班長(zhǎng)曰: 花花在哪? ");
//------------------- 重定向
// 方式1: 了解
//a.設(shè)置響應(yīng)狀態(tài)碼
//response.setStatus(302);
//b.設(shè)置重定向的路徑 /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("班長(zhǎng)曰: 花花,借我錢!");
System.out.println("花花曰: 借多少呀?");
System.out.println("班長(zhǎng)曰: 自己獲取?");
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);
}
}
需求分析:
當(dāng)用戶在瀏覽器上點(diǎn)擊"下載"超鏈接時(shí),向服務(wù)器發(fā)送一個(gè)文件下載的請(qǐng)求
將服務(wù)器上的文件保存到本地
技術(shù)分析:
瀏覽器: 提供文件下載的超鏈接
<a href="download?filename=meinv.png">美女的誘惑(下載)</a>
<a href="download?filename=aa.txt">java資料(下載)</a>
服務(wù)器:
設(shè)置兩個(gè)頭,一個(gè)流
設(shè)置 文件的mime類型
response.setContentType(文件的mime類型);
設(shè)置 文件下載專用頭 attachment(附件) filename: 文件下載時(shí),保存文件的默認(rèn)名稱
response.setHeader("content-disposition","attachment;filename="+文件名稱);
獲取文件輸出流
response.getOutputStream();
步驟分析:
前端:
<a href="download?filename=meinv.png">美女的誘惑(下載)</a>
后臺(tái):
//1.獲取被下載的文件的名稱
String filename = request.getParameter("filename");
//2.設(shè)置兩個(gè)頭
//a.設(shè)置 文件的mime類型
// 獲取上下文對(duì)象
context = getServletContext();
// 獲取被下載文件的mime類型
String mimeType = context.getMimeType(filename);
response.setContentType(mimeType);
//b.設(shè)置 文件下載專用頭 attachment(附件) filename: 文件下載時(shí),保存文件的默認(rèn)名稱
response.setHeader("content-disposition","attachment;filename="+filename);
//3.獲取文件輸出流
// 讀取文件
// 找到文件在服務(wù)器上的完整路徑
String realPath = context.getRealPath("/download/"+filename);
// 獲取文件的輸入流
InputStream is = new FileInputStream(realPath);
// 輸出流
os = response.getOutputStream();
// 流的對(duì)拷
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 {
// 設(shè)置request對(duì)象的編解碼方式
request.setCharacterEncoding("utf-8");
//1.獲取被下載的文件的名稱
String filename = request.getParameter("filename");
//2.設(shè)置兩個(gè)頭
//a.設(shè)置 文件的mime類型
// 獲取上下文對(duì)象
ServletContext context = getServletContext();
// 獲取被下載文件的mime類型
String mimeType = context.getMimeType(filename);
response.setContentType(mimeType);
//b.設(shè)置 文件下載專用頭 attachment(附件) filename: 文件下載時(shí),保存文件的默認(rèn)名稱
//response.setHeader("content-disposition","attachment;filename="+filename);
//-------------------- 處理文件下載時(shí),默認(rèn)名稱(中文亂碼)
// 文件下載注意事項(xiàng): 文件下載的默認(rèn)名稱永遠(yuǎn)使用瀏覽器自己的編解碼方式進(jìn)行解碼
//String name = "美女.png";
//name = URLEncoder.encode(name,"utf-8");
// 使用工具類實(shí)現(xiàn)
String agent = request.getHeader("user-agent");
String name = DownLoadUtils.getName(agent,filename);
//---------------------
response.setHeader("content-disposition","attachment;filename="+name);
//3.獲取文件輸出流
// 讀取文件
// 找到文件在服務(wù)器上的完整路徑
String realPath = context.getRealPath("/download/"+filename);
// 獲取文件的輸入流
FileInputStream is = new FileInputStream(realPath);
// 輸出流
ServletOutputStream os = response.getOutputStream();
// 流的對(duì)拷
int len = 0;
byte b[] = new byte[1024];
while((len=is.read(b))!=-1){
os.write(b,0,len);
}
// 關(guān)流
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:點(diǎn)擊切換驗(yàn)證碼
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圖形界面技術(shù)繪制一張圖片
int charNum = 4; // 生成4位的驗(yàn)證碼
int width = 20 * 4; // 圖片寬
int height = 28; // 圖片高
// 1. 創(chuàng)建一張內(nèi)存圖片
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 2.獲得繪圖對(duì)象
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、輸出驗(yàn)證碼內(nèi)容
graphics.setColor(Color.RED);
graphics.setFont(new Font("宋體", Font.BOLD, 22));
// 隨機(jī)輸出4個(gè)字符
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);
}
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。