Tomcat收到客戶端的http請求,會針對每一次請求,分別建立一個表明請求的request對象、和表明響應的response對象html
既然request對象表明http請求,那麼咱們獲取瀏覽器提交過來的數據,找request對象便可。response對象表明http響應,那麼咱們向瀏覽器輸出數據,找response對象便可。java
http響應由狀態行、實體內容、消息頭、一個空行組成。HttpServletResponse對象就封裝了http響應的信息。web
//獲取到OutputStream流
ServletOutputStream servletOutputStream = response.getOutputStream();
//向瀏覽器輸出數據
servletOutputStream.print("aaaa");
複製代碼
//獲取到OutputStream流
ServletOutputStream servletOutputStream = response.getOutputStream();
//向瀏覽器輸出數據
servletOutputStream.print("中國!");
複製代碼
response.getOutputStream().write("aaa".getBytes());
複製代碼
response.getOutputStream().write("你好呀我是中國".getBytes());
複製代碼
"你好呀我是中國".getBytes()
這句代碼在轉成byte[]數組的時候默認查的是gb2312編碼,而**"你好呀我是中國"支持gb2312編碼**,因此能夠正常顯示出來。response.getOutputStream().write("你好呀我是中國".getBytes("UTF-8"));
複製代碼
//設置頭信息,告訴瀏覽器我回送的數據編碼是utf-8的
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getOutputStream().write("你好呀我是中國".getBytes("UTF-8"));
複製代碼
另外,除了使用HttpServletResponse對象設置消息頭的方法,我能夠使用html的標籤模擬一個http消息頭數組
下面是代碼:瀏覽器
//獲取到servletOutputStream對象
ServletOutputStream servletOutputStream = response.getOutputStream();
//使用meta標籤模擬http消息頭,告訴瀏覽器回送數據的編碼和格式
servletOutputStream.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
servletOutputStream.write("我是中國".getBytes("UTF-8"));
複製代碼
//獲取到printWriter對象
PrintWriter printWriter = response.getWriter();
printWriter.write("看完博客點贊!");
複製代碼
//本來是ISO 8859-1的編碼,我設置成UTF-8
response.setCharacterEncoding("UTF-8");
//獲取到printWriter對象
PrintWriter printWriter = response.getWriter();
printWriter.write("看完博客點贊!");
複製代碼
//設置瀏覽器用UTF-8編碼顯示數據
response.setContentType("text/html;charset=UTF-8");
複製代碼
既然Servlet有那麼多方法解決亂碼問題,是否是有一種是最簡便的呢?沒錯!下面這個方法是最簡便的,它不只設置瀏覽器用UTF-8顯示數據,內部還把中文轉碼的碼錶設置成UTF-8了,也就是說,response.setContentType("text/html;charset=UTF-8");
把response.setCharacterEncoding("UTF-8")
的事情也幹了!緩存
使用getWriter()顯示中文數據,只須要一個方法就搞掂了!bash
//設置瀏覽器用UTF-8編碼顯示數據,
response.setContentType("text/html;charset=UTF-8");
//獲取到printWriter對象
PrintWriter printWriter = response.getWriter();
printWriter.write("看完博客點贊!");
複製代碼
下載資源咱們在平常中也很經常使用,它是怎麼作到的呢?要可以給別人下載,服務器就應該有這個資源服務器
既然瀏覽器發送全部的請求都是去找Servlet的話,那麼我就寫一個Servlet,當別人訪問我這個Servlet的時候,它們就能夠下載我這個圖片了!微信
java的文件上傳下載都是經過io流來完成的,既然要下載圖片,首先要可以讀取到它app
//獲取到資源的路徑
String path = this.getServletContext().getRealPath("/download/1.png");
//讀取資源
FileInputStream fileInputStream = new FileInputStream(path);
//獲取到文件名,路徑在電腦上保存是\\形式的。
String fileName = path.substring(path.lastIndexOf("\\") + 1);
複製代碼
//設置消息頭,告訴瀏覽器,我要下載1.png這個圖片
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
複製代碼
//把讀取到的資源寫給瀏覽器
int len = 0;
byte[] bytes = new byte[1024];
ServletOutputStream servletOutputStream = response.getOutputStream();
while ((len = fileInputStream.read(bytes)) > 0) {
servletOutputStream.write(bytes, 0, len);
}
//關閉資源
servletOutputStream.close();
fileInputStream.close();
複製代碼
當我訪問時,瀏覽器就提示下載了。
也能夠成功打開!
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
複製代碼
以規定的時間讓頁面刷新,更新資源
//每3秒自動刷新網頁一次
response.setHeader("Refresh", "3");
複製代碼
response.getWriter().write("time is :" + System.currentTimeMillis());
複製代碼
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("3秒後跳轉頁面.....");
//三秒後跳轉到index.jsp頁面去,web應用的映射路徑我設置成/,url沒有寫上應用名
response.setHeader("Refresh", "3;url='/index.jsp'");
複製代碼
瀏覽器自己就存在着緩存機制
//瀏覽器有三消息頭設置緩存,爲了兼容性!將三個消息頭都設置了
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma", "no-cache");
//這裏爲了看效果
PrintWriter printWriter = response.getWriter();
printWriter.print("你好啊" + new Date().toString());
複製代碼
網頁上的信息量是很大的,若是不將數據壓縮再回送給瀏覽器,這樣就十分耗費流量
response.setContentType("text/html;charset=UTF-8");
String ss = "fsdfhsdfhuisdhfusdhfuids" +
"fsdfdsfsdfsdfdsfdafdsfhsdjfhsdjkfhkjds" +
"fdsfjdslkfjsldkfjsdlkfjsdkfsdjkff" +
"fsjdfjdsklfjdsklfjkldsfjlksdjflksdjflkds" +
"dsjfklsdjflsdjfkldsfkjsdkfjsldkfjsdlfk" +
"fdsjlkfjdslkfjsdlkfjlkasjflk";
response.getWriter().write("原來的長度是:"+ss.getBytes().length+"</br>");
//輸出給瀏覽器
response.getWriter().write(ss);
複製代碼
//GZIP的構造方法須要一個OutputStream子類對象,究竟哪一個對象適合,咱們看下write()方法
GZIPOutputStream gzipOutputStream = new GZIPOutputStream();
//查看了下API,write()接收的是byte[]類型的。
gzipOutputStream.write();
複製代碼
//既然是byte[]類型,那麼我就給他一個ByteArrayOutputStream
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(new ByteArrayOutputStream());
複製代碼
//建立GZIPOutputStream對象,給予它ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
//GZIP對數據壓縮,GZIP寫入的數據是保存在byteArrayOutputStream上的
gzipOutputStream.write(ss.getBytes());
//gzipOutputStream有緩衝,把緩衝清了,並順便關閉流
gzipOutputStream.close();
複製代碼
//將壓縮的數據取出來
byte[] bytes = byteArrayOutputStream.toByteArray();
//將壓縮的數據寫給瀏覽器
response.getOutputStream().write(bytes);
複製代碼
//告訴瀏覽器這是gzip壓縮的數據
response.setHeader("Content-Encoding","gzip");
//再將壓縮的數據寫給瀏覽器
response.getOutputStream().write(bytes);
複製代碼
生成隨機圖片這是很是常見的。在咱們登錄的時候常常要寫驗證碼,而那些驗證碼是一張圖片,就是經過HttpServletResponse寫給瀏覽器的。
//在內存中生成一張圖片,寬爲80,高爲20,類型是RGB
BufferedImage bufferedImage = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//獲取到這張圖片
Graphics graphics = bufferedImage.getGraphics();
//往圖片設置顏色和字體
graphics.setColor(Color.BLUE);
graphics.setFont(new Font(null, Font.BOLD, 20));
//往圖片上寫數據,先寫個12345,橫座標是0,縱座標是20【高度】
graphics.drawString("12345", 0, 20);
複製代碼
//要往瀏覽器寫一張圖片,那要告訴瀏覽器回送的類型是一張圖片
response.setHeader("ContentType", "jpeg");
//java提供了圖片流給咱們使用,這是一個工具類
//把圖片傳進去,類型是jpg,寫給瀏覽器
ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
複製代碼
//把白色填充整張圖片
graphics.setColor(Color.white);
graphics.fillRect(0, 0, 80, 20);
複製代碼
private String makeNum() {
Random random = new Random();
//這樣就會生成0-7位的隨機數,如今問題又來了,若是隨機數不夠7位呢?若是不夠7位,咱們加到7位就好了
int anInt = random.nextInt(9999999);
//將數字轉成是字符串
String num = String.valueOf(anInt);
//判斷位數有多少個,不夠就加
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
stringBuffer.append("0");
}
return stringBuffer.append(num).toString();
}
複製代碼
什麼是重定向跳轉呢?點擊一個超連接,通知瀏覽器跳轉到另外的一個頁面就叫重定向跳轉。**是通知瀏覽器去跳轉,這很重要。**頁面之間的跳轉有兩種方式:重定向和轉發,至於何時用重定向,什麼用轉發,我在講完HttpServletRequest對象的時候會詳細說明。
//重定向到index.jsp頁面
response.sendRedirect("/zhongfucheng/index.jsp");
複製代碼
//設置狀態碼是302
response.setStatus(302);
//HttpServletResponse把經常使用的狀態碼封裝成靜態常量了,因此咱們可使用SC_MOVED_TEMPORARILY表明着302
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
//跳轉的地址是index.jsp頁面
response.setHeader("Location", "/zhongfucheng/index.jsp");
複製代碼
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章的同窗,能夠關注微信公衆號:Java3y