<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
設定響應狀態碼 如果沒有呼叫這個方法,預設返回200狀態碼(前提:正常執行,沒有異常) 如果出現異常,返回500
前端程式碼:
<body> <h3>設定響應頭</h3> <input type="text" id="status"> <br> <button onclick="setStatus()">提交</button> </body> <script> function setStatus(){ //js中傳送請求:(1)ajax(2)直接修改url let status = document.querySelector("#status"); //後端會設定文字方塊輸入的值為響應狀態碼:嚴格來做需要驗證(省略) window.location.href = "response?status="+status.value; } </script>
後端程式碼:
@WebServlet("/response") public class ResponseStudyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取請求傳送的queryString資料:status=xxx String status = req.getParameter("status"); resp.setStatus((Integer.parseInt(status))); resp.getWriter().write("設定響應狀態碼成功"); } }
前端顯示:
提交後fiddler抓包:
設定響應頭
響應頭name鍵已有,會覆蓋原有的鍵值對
前端程式碼:
<h3>設定響應頭</h3> <a href="response" rel="external nofollow" >設定</a>
後端程式碼:
//設定響應頭的鍵值對,鍵可以是標準的http響應頭的鍵,也可以是自定義的 //響應狀態碼是301,302,307,響應頭有Location欄位,才是重定向 resp.setHeader("Location","http://www.baidu.com"); resp.setHeader("username","張三");
fiddler抓包結果:
設定響應頭
響應頭name鍵已有,不會影響,新增一個新的
這兩個瞭解即可
設定響應頭Content-Type的值,等同於setHeader(“Content-Type”,String type) 因為Content-Type是標識body的資料格式,所以還需要設定body的內容
1.響應一個網頁
//響應html:設定響應的Content-Type resp.setContentType("text/html; charset=utf-8");
可以返回靜態和動態網頁
兩種方式展示:
前端程式碼:
<body> <h3>返回響應正文為簡單的html</h3> <a href="html?type=1" rel="external nofollow" >檢視</a> <h3>返回響應正文為複雜的html(動態變化的)</h3> <input type="text" id="username" placeholder="輸入姓名"> <br> <button onclick="toWelcome()">跳轉</button> </body> <script> function toWelcome(){ let username = document.querySelector("#username"); window.location.href = "html?type=2&username="+username.value; } </script>
後端程式碼:
@WebServlet("/html") public class HTMLTypeServlet extends HttpServlet { //html?type=... @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //響應html:設定響應的Content-Type resp.setContentType("text/html; charset=utf-8"); PrintWriter pw = resp.getWriter(); //獲取queryString中,type的值 String type = req.getParameter("type"); if("1".equals(type)){//返回簡單的html pw.println("<h3>獲取網頁成功</h3>"); }else if("2".equals(type)){//返回複雜的動態html //html?type=2&username=xxx String username = req.getParameter("username"); pw.println("<p>"); pw.println("歡迎你,"+username); pw.println("</p>"); } } }
簡單:
前端顯示:
點選“檢視”:
動態:
前端顯式:
點選“跳轉”:
關於動態網頁:在Java的程式碼中,寫很多html的程式碼
耦合性太強(兩個完全不同的程式語言,放在一起來開發)、維護性、擴充套件性很差
解決方式:
返回已有的一個網頁
(1)重定向:
特點:url位址列會變,發起兩次請求
原理:
第一次返回301/302/307響應狀態碼,及響應頭Location:網頁的地址
第二次:瀏覽器自動的跳轉到Location設定的地址
還是比較常用的:比如登入成功(其實也可以在js程式碼中跳轉)後,跳轉到某個首頁
(2)轉發:
特點:url位址列不變,只有一次請求
原理:當次請求Servlet時,由Servlet獲取到轉發路徑的html,把這個路徑的內容設定到響應正文
前端程式碼:
<h3>重定向到hello.html</h3> <a href="goto?type=1" rel="external nofollow" >跳轉</a> <h3>轉發到hello.html</h3> <a href="goto?type=2" rel="external nofollow" >跳轉</a>
後端程式碼:
@WebServlet("/goto") public class GoToServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //goto?type=xxx String type = req.getParameter("type"); if("1".equals(type)){//重定向 // resp.setStatus(301); // resp.setHeader("Location","hello.html"); //以上程式碼可以簡化為sendRedirect resp.sendRedirect("hello.html"); }else if("2".equals(type)){//轉發 req.getRequestDispatcher("hello.html") .forward(req,resp); } } }
設定一下Content-Type,然後把檔案的二進位制資料放在響應正文就可以
前端程式碼:
<h3>獲取一個圖片(渲染展示)</h3> <img src="file?type=photo&show=1"> <h3>獲取一個音樂(渲染展示)</h3> <audio src="file?type=music&show=1" controls></audio> <h3>獲取一個圖片(下載)</h3> <a href="file?type=photo&show=0" rel="external nofollow" >下載</a> <h3>獲取一個音樂(下載)</h3> <audio src="file?type=music&show=0" controls></audio>
後端程式碼:
@WebServlet("/file") public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //<img src="file?type=photo&show=1"> //獲取響應物件的位元組輸出流 OutputStream os = resp.getOutputStream(); //返回的檔案型別:1.圖片 2.音樂 String type = req.getParameter("type"); //返回時的操作:1.渲染 2.下載 String show = req.getParameter("show"); File file = null; byte[] data = null; //<img src="file?type=photo&show=1"> if("photo".equals(type)){//返回圖片 if("1".equals(show)){ resp.setContentType("image/jpeg");//jpg格式 }else{ //這樣只是沒有設定下載的檔名,有興趣可以自行擴充套件完成 resp.setContentType("application/octet-stream"); } file =new File("D:\java\servlet-study\src\main\resources\cui.jpg"); //<audio src="file?type=music&show=1" controls></audio> }else if("music".equals(type)){//返回音樂 if("1".equals(show)){ resp.setContentType("audio/mp3");//mp3格式 }else{ resp.setContentType("application/octet-stream"); } file = new File("D:\java\servlet-study\src\main\resources\這世界有那麼多人.mp3"); }//其他格式可以自行擴充套件完成 //返回一個檔案型別:Content-Length,body data = Files.readAllBytes(file.toPath()); resp.setContentLength(data.length);//setHeader("Content-Length",xxx) os.write(data); } }
問題:圖片、音樂、視訊是靜態檔案,直接放在web應用webapp下,就可以直接存取,那還需要Servlet來返回麼?是否多此一舉?
如果檔案總的大小非常大,放在web應用的webapp下就不合適了:打包就比較費勁,使用Servlet去讀取本地其他地方的檔案,來返回,就比較適合
常用於ajax請求,返回一些資料,用於動態的填充網頁
前端程式碼:
<body> <h3>獲取ajax響應資料,動態生成網頁內容</h3> <button onclick="gen()">試試</button> <div id="content"></div> </body> <script> function gen(){ let content = document.querySelector("#content"); ajax({ url: "ajax-response", method: "get", callback: function(status,resp){ console.log(resp);//resp是一個字串 //轉換為json物件 let array = JSON.parse(resp); for(json of array){//遍歷 //每一個json物件,建立一個dom來儲存資訊 let p = document.createElement("p"); p.innerHTML = json.from+" 對 "+json.to+" 說:"+json.info; content.appendChild(p); } } }); } function ajax(args){//var ajax = function(){} let xhr = new XMLHttpRequest(); //設定回撥函數 xhr.onreadystatechange = function(){ //4:使用者端接收到響應後回撥 if(xhr.readyState == 4){ // 回撥函數可能需要使用響應的內容,作為傳入引數 args.callback(xhr.status,xhr.responseText); } } xhr.open(args.method,args.url); // 如果args中,Content-Type屬性有內容,就設定Content-Type請求頭 if(args.contentType){//js中,除了判斷boolean值,還可以判斷字串,物件等,有值就為true xhr.setRequestHeader("Content-Type",args.contentType); } //如果args中,設定了body請求正文,呼叫send(body) if(args.body){ xhr.send(args.body); }else{//如果沒有設定,呼叫send() xhr.send(); } } </script>
後端程式碼:
@WebServlet("/ajax-response") public class AjaxJsonServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Message> messages = new ArrayList<>(); Message m1 = new Message("汪汪","喵喵","我喜歡你"); Message m2 = new Message("喵喵","汪汪","我喜歡你"); messages.add(m1); messages.add(m2); ObjectMapper mapper = new ObjectMapper(); //把Java物件,轉換為一個json字串,list和陣列會轉換為[],一個物件{成員變數名:值} String json = mapper.writeValueAsString(messages); //[{"from":"汪汪","to":"喵喵","info":"我喜歡你"},{"from":"喵喵","to":"汪汪","info":"我喜歡你"}] System.out.println("轉換的json字串"+json); //設定json可以不設定Content-Length,tomcat會設定 resp.setContentType("application/json; charset=utf-8"); resp.getWriter().println(json); } static class Message{ private String from;//誰 private String to;//對誰 private String info;//說了什麼 public Message(String from, String to, String info) { this.from = from; this.to = to; this.info = info; } public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String getTo() { return to; } public void setTo(String to) { this.to = to; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } } }
點選“試試”:
具體過程:
對應可以使用的資料格式:
到此這篇關於Java 後端Servlet響應httpServletResponse詳解的文章就介紹到這了,更多相關Servlet 響應httpServletResponse內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45