生成圖片主要用到了一個BufferedImage類,javascript
生成隨機圖片範例:css
package gacl.response.study; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResponseDemo04 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 1.調用sendRedirect方法實現請求重定向, * sendRedirect方法內部調用了 * response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); * response.setStatus(HttpServletResponse.SC_FOUND);//設置302狀態碼,等同於response.setStatus(302); */ response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); //2.使用response設置302狀態碼和設置location響應頭實現重定向實現請求重定向 //response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); //response.setStatus(HttpServletResponse.SC_FOUND);//設置302狀態碼,等同於response.setStatus(302); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
運行結果以下:html
response.setDateHeader("expries", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache");
response.setHeader("refresh", "5");//設置refresh響應頭控制瀏覽器每隔5秒鐘刷新一次
請求重定向指:一個web資源收到客戶端請求後,通知客戶端去訪問另一個web資源,這稱之爲請求重定向。要請求兩個Servlet服務,區別於轉發。java
應用場景:用戶登錄,用戶首先訪問登陸頁面,登陸成功後,就會跳轉到某個頁面,這個過程就是一個請求重定向的過程web
實現方式:response.sendRedirect(String location)
,即調用response
對象的sendRedirect
方法實現請求重定向
sendRedirect
內部的實現原理:使用response設置302狀態碼和設置location響應頭實現重定向瀏覽器
例如:緩存
package gacl.response.study; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResponseDemo04 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 1.調用sendRedirect方法實現請求重定向, * sendRedirect方法內部調用了 * response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); * response.setStatus(HttpServletResponse.SC_FOUND);//設置302狀態碼,等同於response.setStatus(302); */ response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); //2.使用response設置302狀態碼和設置location響應頭實現重定向實現請求重定向 //response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); //response.setStatus(HttpServletResponse.SC_FOUND);//設置302狀態碼,等同於response.setStatus(302); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
在JavaWeb開發中,只要是寫URL地址,那麼建議最好以"/"
開頭,也就是使用相對路徑的方式,那麼這個"/"
到底表明什麼呢?能夠用以下的方式來記憶"/"
:若是"/"
是給服務器用的,則表明當前的web工程,若是"/"
是給瀏覽器用的,則表明webapps目錄。服務器
①.ServletContext.getRealPath(String path)獲取資源的絕對路徑app
/** * 1.ServletContext.getRealPath("/download/1.JPG")是用來獲取服務器上的某個資源, * 那麼這個"/"就是給服務器用的,"/"此時表明的就是web工程 * ServletContext.getRealPath("/download/1.JPG")表示的就是讀取web工程下的download文件夾中的1.JPG這個資源 * 只要明白了"/"表明的具體含義,就能夠很快寫出要訪問的web資源的絕對路徑 */ this.getServletContext().getRealPath("/download/1.JPG");
②.在服務器端forward到其餘頁面webapp
/** * 2.forward * 客戶端請求某個web資源,服務器跳轉到另一個web資源,這個forward也是給服務器用的, * 那麼這個"/"就是給服務器用的,因此此時"/"表明的就是web工程 */ this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
③.使用include指令或者<jsp:include>
標籤引入頁面
<%@include file="/jspfragments/head.jspf" %> <jsp:include page="/jspfragments/demo.jsp" />
此時"/"表明的都是web工程。
①.使用sendRedirect實現請求重定向
response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
服務器發送一個URL地址給瀏覽器,瀏覽器拿到URL地址以後,再去請求服務器,因此這個"/"是給瀏覽器使用的,此時"/"表明的就是webapps目錄,"/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"
這個地址指的就是"webapps\JavaWeb_HttpServletResponse_Study_20140615\index.jsp"
response.sendRedirect("/項目名稱/文件夾目錄/頁面");這種寫法是將項目名稱寫死在程序中的作法,不靈活,萬一哪天項目名稱變了,此時就得改程序,因此推薦使用下面的靈活寫法:
將
response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
這種寫法改爲
response.sendRedirect(request.getContextPath()+"/index.jsp");
request.getContextPath()獲取到的內容就是"/JavaWeb_HttpServletResponse_Study_20140615
",這樣就比較靈活了,使用request.getContextPath()
代替"/項目名稱
",推薦使用這種方式,靈活方便!
②.使用超連接跳轉
<a href="/JavaWeb_HttpServletResponse_Study_20140615/index.jsp">跳轉到首頁</a>
這是客戶端瀏覽器使用的超連接跳轉,這個"/"
是給瀏覽器使用的,此時"/"
表明的就是webapps目錄。
使用超連接訪問web資源,絕對路徑的寫法推薦使用下面的寫法改進:
<a href="${pageContext.request.contextPath}/index.jsp">跳轉到首頁</a>
這樣就能夠避免在路徑中出現項目的名稱,使用**${pageContext.request.contextPath}**
取代"/JavaWeb_HttpServletResponse_Study_20140615"
③.Form表單提交
<form action="/JavaWeb_HttpServletResponse_Study_20140615/servlet/CheckServlet" method="post"> <input type="submit" value="提交"> </form>
這是客戶端瀏覽器將form表單提交到服務器,因此這個"/"
是給瀏覽器使用的,此時"/"
表明的就是webapps目錄。
對於form表單提交中action屬性絕對路徑的寫法,也推薦使用以下的方式改進:
<form action="${pageContext.request.contextPath}/servlet/CheckServlet" method="post"> <input type="submit" value="提交"> </form>
${pageContext.request.contextPath}
獲得的就是"/JavaWeb_HttpServletResponse_Study_20140615"
${pageContext.request.contextPath}
的效果等同於request.getContextPath()
,二者獲取到的都是"/項目名稱"
④.js腳本和css樣式文件的引用
<%--使用絕對路徑的方式引用js腳本--%> <script type="text/javascript" src="${pageContext.request.contextPath}/js/index.js"></script> <%--${pageContext.request.contextPath}與request.getContextPath()寫法是獲得的效果是同樣的--%> <script type="text/javascript" src="<%=request.getContextPath()%>/js/login.js"></script> <%--使用絕對路徑的方式引用css樣式--%> <link rel="stylesheet" href="${pageContext.request.contextPath}/css/index.css" type="text/css"/>
綜合範例:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>"/"表明webapps目錄的常見應用場景</title> <%--使用絕對路徑的方式引用js腳本--%> <script type="text/javascript" src="${pageContext.request.contextPath}/js/index.js"></script> <%--${pageContext.request.contextPath}與request.getContextPath()寫法是獲得的效果是同樣的--%> <script type="text/javascript" src="<%=request.getContextPath()%>/js/login.js"></script> <%--使用絕對路徑的方式引用css樣式--%> <link rel="stylesheet" href="${pageContext.request.contextPath}/css/index.css" type="text/css"/> </head> <body> <%--form表單提交--%> <form action="${pageContext.request.contextPath}/servlet/CheckServlet" method="post"> <input type="submit" value="提交"> </form> <%--超連接跳轉頁面--%> <a href="${pageContext.request.contextPath}/index.jsp">跳轉到首頁</a> </body> </html>
getOutputStream和getWriter方法分別用於獲得輸出二進制數據、輸出文本數據的ServletOuputStream、Printwriter對象。
getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另外一方法。 Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response裏面獲取,Servlet引擎將這些數據看成響應消息的正文,而後再與響應狀態行和各響應頭組合後輸出到客戶端。 Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,若是沒有,Servlet引擎將調用close方法關閉該輸出流對象。