尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)
HTML和CSS
- ctrl + shift + / 在同一行代碼中的后半截產生注釋
HTML標簽的介紹
- 標簽擁有自己的屬性,分為 基本屬性 和 事件屬性
- 標簽的基本屬性 :bgcolor="red 可以修改簡單的樣式效果
- 標簽的事件屬性 :onclick="alert('你好');"
單標簽:
- br/ 換行
- hr/ 水平線
常用標簽介紹:
- foot標簽是字體標簽,可以用來修改文本的 字體face,顏色color,大小size
- 特殊字符 :小于號,空格,和號&,引號",撇號’ 等 我是<br>標簽
- 標題標簽 :h1 到 h6, 屬性align控制左對齊left(默認),中間center,右對齊(會隨著窗口大小自動調整)
- 超鏈接標簽 :屬性href控制鏈接,屬性target控制當前(_self),和另一個頁面(_blank)
- 無序列表ul :屬性type可以修改列表項前面的符號(兼容)
- img標簽 :屬性src設置圖片的路徑,width,height,border設置邊框大小,alt
- 表格標簽table,tr是行標簽,th(相當于td加上b加粗)是表頭標簽,td是單元格標簽,align設置單元格文本對齊方式;bordr,width,height,align設置表格相對于頁面的對齊方式,cellspacing設置單元格間距
- 跨行跨列表格,colspan屬性設置跨列(用了以后要把其他同一行的單元格刪掉部分,否則表格會突出);rowspan屬性設置跨行
- iframe框架標簽(內嵌窗口),可以在一個html頁面上打開一個小窗口小區域,去加載一個單獨的頁面;iframe標簽和a標簽組合使用的步驟 :1.在iframe標簽中使用name屬性定義一個名稱;2.在a標簽的target屬性上設置iframe的name屬性值
- 表單標簽form :
- 表單格式化 :form里面嵌套table
- 表單提交的細節 :
- 其他標簽 :div標簽默認獨占一行;span標簽 它的長度是封裝數據的長度;p段落標簽 默認會在段落的上方或下方各空出一行來(如果已經有就不再空)
CSS技術
常用樣式:
- 字體顏色color: red;
- 寬度;高度;(像素值 / 百分比值)
- 背景顏色background-color
- 字體大小font-size
- 紅色1像素實線邊框border: 1px solid red;
- DIV居中margin-left: auto; margin-right: auto;
- 文本居中text-align: center;
- 超鏈接去下劃線text-decoration: none;
- 表格細線 :
- 列表去除修飾ul {list-style: none;}
JavaScript語言入門
- JS是弱類型(類型可變),Java是強類型
- 特點 :1.信息的動態交互;2.安全性,不允許直接訪問本地硬盤;3.跨平臺性,只要是可以解釋js的瀏覽器都可以執行,和平臺無關
- src屬性專門用來引入js文件路徑(可以是相對路徑或者絕對路徑)
變量
- typeof()函數 判斷變量的類型
比較運算
邏輯運算
數組
- var arr = [];
- var arr = [1,'abc',true];
- js語言中的數組,只要我們通過數組下標賦值,那么最大的下標值,就會自動給數組做擴容操作
函數
- 在java中函數允許重載,但是在js中函數的重載會直接覆蓋掉上一次的定義
- 函數的隱形參數 arguments(只在function函數內)
JS中的自定義對象
js中的事件
- 事件 : 電腦輸入設備與頁面進行交互的響應
常用的事件 :
- onload 加載完成事件;頁面加載完成后,常用于做頁面js代碼初始化操作
- onclick 單擊事件;常用于按鈕的點擊響應操作
- onblur 失去焦點事件;常用于輸入框失去焦點后驗證其輸入內容是否合法
- onchange 內容發生改變事件;常用于下拉列表和輸入框內容發生改變后操作
- onsubmit 表單提交事件;常用于表單提交前,驗證所有表單項是否合法
- 阻止表單提交 :
- 靜態注冊 : 在標簽屬性中的onsubmit中 不僅要在函數中return false,在調用函數的前面,還要加上一個return!
- 動態注冊 : 直接在 標簽對象 的函數中return false 即可
DOM模型
- DOM全稱是 Document Object Model 文檔對象模型
- 就是把文檔中的 標簽,屬性,文本 轉換成對象來管理
- document對象 的理解 :
1.document管理了所有的html文檔內容
2.document是一種 樹結構 的文檔,有層級關系
3.它讓我們把所有的標簽 都 對象化
4.我們可以通過document訪問所有的標簽對象 - 正則表達式RegExp :
1.表示要求字符串中,是否包含字母e :
1)var patt = new RegExp(“e”);
2)var patt = /e/;
3)以上兩種皆為 正則表達式對象
4)驗證方法 :
var str = “abcd”;
alert(patt.test(str));
2.表示要求字符串中,是否包含字母a或b或c : var patt = /[abc]/;
3.表示要求字符串中,是否包含任意小寫字母 : var patt = /[a-z]/;
4.表示要求字符串中,是否包含任意數字 : var patt = /[0-9]/;
5.元字符中 \w 用于查找單詞字符(a-z,A-Z,0-9,下劃線);因此,var patt = /\w/; 表示要求字符串中,是否包含字母,數字,下劃線; \W 查找 非單詞字符
6.量詞中 a+ ,var patt = /a+/;表示要求字符串中,是否包含至少一個a;var patt = /a*/;表示字符串中是否包含零個 或 多個a;var patt = /a?/;表示字符串中是否包含零個 或 一個a;var patt = /a{3}/;表示字符串中是否包含連續三個a
- document.getElementByName() :根據指定的name屬性查詢返回多個標簽對象集合;這個集合的操作和數組一樣;集合中每個元素都是dom對象;這個集合中的元素順序是他們在html頁面中從上到下的順序
- document.getElementByTagName() :按照指定標簽名來進行查詢并返回集合;同上
- document對象的三個查詢方法,如果有id屬性,優先使用ById;如果沒有id屬性,則優先使用ByName;最后才用TagName
- 以上三個方法一定要在頁面加載完成之后執行,才能查詢到標簽對象
節點的常用屬性和方法
- 方法 :
appendChild(divObj)
document.createElement(tagName) 通過給定的標簽名,創建一個標簽對象 - 屬性 :
childNodes 獲取當前節點的所有子節點
firstChild
lastChild
parentNode
nextSibling
previousSibling
className 獲取或設置標簽的class屬性值
innerHtml 內容
innerText 文本
jQuery
- 引入jQeury庫,<script type="text/javascripy" src="../script/jquery-1.7.2.js"></script>
- $(function () {}); 表示 頁面加載完成之后,相當于window.onload = function () {}
- var $btnObj = $("#btnId"); 表示按id查詢標簽對象
- $btnObj.click(function () {alert("");}); 綁定單擊事件
$是jQeury的核心函數
傳入參數為 函數 時 :表示頁面加載完成之后,相當于window.onload = function () {}
傳入參數為 HTML字符串 時 :會對我們創建這個html標簽對象
傳入參數為 選擇器字符串 時 :id選擇器、標簽名選擇器、類型選擇器
傳入參數為 DOM對象 時 : 會把這個dom對象轉換為jQeury對象
jQeury對象和dom對象區分
- jQeury對象的本質 :是dom對象的數組 + jQeury提供的一系列功能函數
- jQeury對象不能使用DOM對象的屬性和方法;DOM對象也不能使用jQeury…
dom對象轉化為jQeury對象
1.先有dom對象
2.$(dom對象);就可以
jQeury對象轉化為dom對象
1.先有jQeury對象
2.jQeury對象[下標]取出相應的dom對象
基礎選擇器
層級選擇器
基本過濾選擇器
內容過濾選擇器
屬性過濾選擇器
表單過濾選擇器
篩選元素
屬性的操作
dom的增刪改
CSS樣式操作
jQeury動畫
jQeury事件操作
jQeury中其他事件的處理方法
事件冒泡
事件對象
XML
<?xml version="1.0" encoding="utf-8" ?> <!--<?xml version="1.0" encoding="utf-8" ?>以上內容就是xml文件的聲明version="1.0" version表示xml的版本encoding="utf-8" encoding表示xml文件本身的編碼 --><books><book sn="1"><name>時間簡史</name><author>霍金</author><price>100</price></book><book sn="2"><name>java</name><author>teacher</author><price>120</price></book> </books>
xml解析技術介紹
- 不管是html文件還是xml文件它們都是標記型文檔,都可以使用w3c組織制定的dom技術來解析
JavaWeb
Web資源的分類
- web資源按實現的技術和呈現的效果的不同,又分為靜態資源和動態資源兩種
- 靜態資源 :html、css、js、txt、mp4視頻、jpg圖片
- 動態資源 :jsp頁面、Servlet程序
常用的Web服務器
Tomcat :一種Web服務器,提供對jsp和Servlet的支持,它是一種輕量級的javaWeb容器(服務器),也是當前應用最廣的JavaWeb容器(服務器)
Tomcat服務器和Servlet版本的對應關系
Tomcat目錄介紹
bin 專門用來存放tomcat服務器的可執行程序
conf 專門用來存放tomcat服務器的配置文件
lib 專門用來存放tomcat服務器的jar包
logs 專門用來存放tomcat服務器運行時輸出的日記信息
temp 專門用來存放tomcat服務器運行時產生的臨時數據
webapps 專門用來存放部署的web工程
work 是tomcat工作時的目錄,用來存放tomcat運行時jsp翻譯為servlet的源碼,和session鈍化的目錄
如何在idea中部署工程到tomcat上運行
建議修改web工程對應的tomcat運行實例名稱
Servlet 01
0.jsp,servlet,tomcat的關系
- tomcat是web服務器(javaweb項目常用tomcat),servlet在tomacat中能運行,jsp是一種servlet
- 瀏覽器是向服務器(tomcat)發出請求,然后tomcat根據瀏覽器的請求,派出對應的servlet去處理這些請求,在處理后,servlet得到一系列處理后的數據,然后將這個數據交給jsp,讓jsp顯示出來給用戶看到
- 在servlet中通過流將html代碼輸出給客戶端(然后由客戶端也就是瀏覽器渲染結果,所以并不是瀏覽器執行java代碼),為了方便就誕生了jsp(本質上就是servlet),jsp中可以拋開java代碼,直接使用html標簽編寫代碼,這樣就很好的將java代碼和html代碼分離,但其實jsp最終運行時會被編譯成servlet
什么是Servlet
Servlet是JavaEE規范之一。規范 就是 接口
Servlet是JavaWeb三大組件之一。三大組件分別是 :Servlet程序、Filter過濾器、Listener監聽器
Servlet是運行在服務器上的一個java小程序,它可以接收客戶端發來的請求,并相應數據給客戶端
手動實現Servlet程序
1.編寫一個類去實現Servlet接口
2.實現service方法,處理請求,并相應數據
3.到web.xml中去配置servlet程序的訪問地址
url地址如何定位到Servlet程序去訪問 :
- 在localhost中,一個程序可以占用多個端口號,但是一個端口號唯一標識一個程序
Servlet的生命周期
1.執行Servlet構造器方法
2.執行init初始化方法
第一、二步是在,第一次訪問的,的時候 創建servlet程序會調用
3.執行service方法
第三步,每次訪問都會調用
4.執行destroy銷毀方法
第四步,在web工程停止的時候調用
- 因此發現是 單例模式
請求的分發處理
- 問題 :service方法只有一個,而我們的請求有兩種,一種是get,一種是post
- 第1步,在 webapp 下創建一個 a.html ,里面有一個form表單,填入action屬性(/hello)和method屬性,form表單中有一個提交按鈕
- 第2步,啟動服務器后,在工程后面加上/a.html,進入了http://localhost:8080/_servlet/a.html,然后按下提交按鈕,就會進入hello,也就是http://localhost:8080/_servlet/hello?
- 只有在點下按鈕,進入到hello以后,Server才會輸出“11111 Constructor
22222 init
33333 service – HelloServlet被訪問啦“
- 將get改成post后,要記得刷新網頁(但居然不需要重啟服務器)
- 改成post后,同樣的操作,點了按鈕后,會進入http://localhost:8080/_servlet/hello,同時,Server會輸出"33333 service – HelloServlet被訪問啦",service一樣的被使用了
- 問題 :一般情況下,get和post請求是不一樣的,因此,在service方法中要寫不同
- 發現ServletRequest類無法直接使用getMethod方法
- 查看子類 快捷鍵 :在HelloServlet.java中 鼠標選中 service方法中的 ServletRequest,然后control + h,然后顯示該類(?)的層次結構,可以看到ServletRequest還有一個HttpServletRequest子類,點擊后,看到里面有一個String getMethod()方法,也就是說子類可以
- 因此,類型轉換,將它轉換為子接口(注意到這里是向下轉型?,但本質上還是向上轉型,接口的實現類就是它的子類,子類的對象就是該接口的子類對象),(快捷方式,先打出HttpServletRequest httpServletRequest = servletRequest;,然后option + enter,自動補全為HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
- httpServletRequest.getMethod()后再option + enter然后補全為String method = httpServletRequest.getMethod();
- 然后 重啟服務器,再在a.html中點擊按鈕后,Server中就會輸出“POST“
- 因此說明我們已經可以得到method了,那么就可以根據method的不同類型來作出不同代碼
- 如果if里執行的語句太多,顯得很臃腫;因此,我們采用 封裝 的思想,將if中語句換成函數
通過繼承HttpServlet類來實現Servlet程序
- 實際開發中,很少通過 “通過實現Servlet接口” 的方式來實現Servlet程序
- 開發時,一般都是導入他的子類去繼承即可
- 一般在實際開發中,都是使用繼承HttpServlet類的方法去實現Servlet程序
1.編寫一個類來繼承HttpServlet類
2.根據業務需求重寫doGet()和doPost()方法
3.到web.xml中配置Servlet程序的訪問地址
- 然后 重啟服務器;就可以顯示啦
- 我們注意到在這個編寫的繼承類中,我們直接只需要重寫doGet方法即可,不需要再得到method,然后ifelse
使用IDEA創建Servlet程序
- 第一步,點擊要在哪個包中編寫這個類,然后
- 會自動創建這個類(里面有準備好doGet方法和doPost方法的重寫),以及在web.xml中自動配置(但要自行寫serlet-mapping)
整個Servlet類的繼承體系
ServletConfig類使用介紹
關于初始化參數init-param
- 且這個init-param在一個servlet標簽中可以有多對
- servletConfig可以在HelloServlet的init初始化方法中使用
ServletConfig類的補充說明
- Servlet程序和ServletConfig對象都是由Tomcat負責創建,我們負責使用
- Servlet程序默認是第一次訪問的時候創建,ServletConfig是每個Servlet程序創建時,就創建一個對應的ServletConfig對象
- servletconfig還可以在除了init外使用 :
- 重寫 init方法后(init中只放了一個sout),在doGet方法中通過servletConfig獲得init-param就會有 空指針異常
- 注意,在重寫了init方法后,一定要在里面調用super.init(config);,就不會報空指針異常
- 原因 :doGet方法中的 getServletConfig()是從哪里來的呢?發現是從GenericServlet這個類的方法,而GenericServlet類持有一個ServletConfig類的引用;發現在GenericServlet類中的init方法有一個this.config = config;是將config保存起來,那我們如果重寫不就沒有了嗎,那么父類中init的保存就消失了,因此,要寫上super
- 按住command 鼠標移到方法上 就可以查看 所在的類中這個方法的位置
ServletContext對象的介紹
ServletContext對象作用的演示
- 先在web.xml中配置好ContextServlet程序的mapping 以及 上下文參數context-param
- 然后,通過 ServletConfig 來獲得 ServletContext 對象
- 有一個小細節,這個代碼只能寫在doGet中,寫在doPost中是不會在Server中輸出語句的
- context.getInitParameter()只能得到context-param,不能得到servlet中的init-param(只能由ServletConfig的getInitParameter()得到)
ServletContext像map一樣存取數據
public class ContextServlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 獲取ServletContext對象ServletContext context = getServletContext();System.out.println("保存之前:Context1 獲取key1的值為:" + context.getAttribute("key1"));context.setAttribute("key1", "value1");System.out.println("Context1 中獲取域數據key1的值為:" + context.getAttribute("key1"));System.out.println("Context1 中獲取域數據key1的值為:" + context.getAttribute("key1"));} } public class ContextServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext context = getServletContext();System.out.println("Context2 中獲取域數據key1的值為:" + context.getAttribute("key1"));} } <!-- 只訪問了/context1 --> 保存之前:Context1 獲取key1的值為:null Context1 中獲取域數據key1的值為:value1 Context1 中獲取域數據key1的值為:value1 <!-- 在訪問了/context1后再訪問了/context2 --> 保存之前:Context1 獲取key1的值為:null Context1 中獲取域數據key1的值為:value1 Context1 中獲取域數據key1的值為:value1 14-Mar-2022 19:45:37.570 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 應用程序部署到目錄 [/Users/fieldxia/Downloads/apache-tomcat-8.5.75/webapps/manager] 14-Mar-2022 19:45:37.601 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web應用程序目錄[/Users/fieldxia/Downloads/apache-tomcat-8.5.75/webapps/manager]的部署已在[30]毫秒內完成 Context2 中獲取域數據key1的值為:value1 <!-- 再訪問一次/context1 --> 保存之前:Context1 獲取key1的值為:null Context1 中獲取域數據key1的值為:value1 Context1 中獲取域數據key1的值為:value1 14-Mar-2022 19:45:37.570 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 應用程序部署到目錄 [/Users/fieldxia/Downloads/apache-tomcat-8.5.75/webapps/manager] 14-Mar-2022 19:45:37.601 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web應用程序目錄[/Users/fieldxia/Downloads/apache-tomcat-8.5.75/webapps/manager]的部署已在[30]毫秒內完成 Context2 中獲取域數據key1的值為:value1 保存之前:Context1 獲取key1的值為:value1 Context1 中獲取域數據key1的值為:value1 Context1 中獲取域數據key1的值為:value1- 因為 “ServletContext是在web1工程部署啟動的時候創建。在web工程停止的時候銷毀“
- 因此, 如果 重新部署一次,或者重啟這個工程,那么web工程就停止了,里面的數據就沒有了
什么是HTTP協議
GET請求HTTP協議內容介紹
POST請求HTTP協議內容介紹
- 注意要點了提交按鈕以后才會是POST請求,直接在a.html錄制還是GET請求
常用請求頭
哪些是GET請求,哪些是POST請求
響應的HTTP協議介紹
常見的響應狀態碼說明
MIME數據類型
谷歌瀏覽器和火狐瀏覽器如何查看HTTP協議內容
- 狀態碼304 點擊 Disable Cache停用緩存 狀態碼200
Servlet 02
HttpServletRequest類的介紹
Request常用API的演示
public class RequestAPIServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求的資源路徑System.out.println("URI => " + req.getRequestURI());// 獲取請求的統一資源定位符(絕對路徑)System.out.println("URL => " + req.getRequestURL());// 獲取客戶端的ip地址/*** 在IDEA中 使用 localhost 訪問時 得到的客戶端ip地址是 => 127.0.0.1* 因此 將 "http://localhost:8080/_servlet02/requestAPIServlet"* 改成 "http://127.0.0.1:8080/_servlet02/requestAPIServlet" 也可以訪問* 在IDEA中 使用 127.0.0.1 訪問時 得到的客戶端ip地址是 => 127.0.0.1* 在IDEA中 使用 真實ip 訪問時 得到的客戶端ip地址是 => 真實的客戶端 ip地址*/System.out.println("客戶端 ip地址 => " + req.getRemoteHost());// 獲取請求頭System.out.println("請求頭User-Agent => " + req.getHeader("User-Agent"));// 獲取請求的方式 GET 或 POSTSystem.out.println("請求的方式 => " + req.getMethod());} } URI => /_servlet02/requestAPIServlet URL => http://localhost:8080/_servlet02/requestAPIServlet 客戶端 ip地址 => 0:0:0:0:0:0:0:1 請求頭User-Agent => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 請求的方式 => GET獲取請求的參數值-補充
<!-- form.html --> <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><form action="http://localhost:8080/_servlet02/parameterServlet" method="get">用戶名:<input type="text" name="username"> <br/>密碼:<input type="password" name="password"> <br/>興趣愛好:<input type="checkbox" name="hobby" value="cpp">C++<input type="checkbox" name="hobby" value="java">Java<input type="checkbox" name="hobby" value="js">JS<br/><input type="submit"></form> </body> </html> public class ParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求參數String username = req.getParameter("username");String password = req.getParameter("password");String hobby = req.getParameter("hobby");System.out.println("username: " + username);System.out.println("password: " + password);System.out.println("hobby: " + hobby);} }
跳轉至http://localhost:8080/_servlet02/parameterServlet?username=javaweb&password=123456&hobby=cpp&hobby=java
- 以上hobby的做法是錯的,這樣興趣愛好多選只會返回一個值,應該將getParameter換成getParameterValues
http://localhost:8080/_servlet02/parameterServlet?username=123&password=123456&hobby=cpp&hobby=java&hobby=js
<!-- Server --> username: 123 password: 123456 hobby: [cpp, java, js]解決POST請求中文亂碼問題
- 如果在 用戶名text 中輸入中文的時候,如果method="get"不會有問題,但如果method="post",不是中文沒有問題,但一旦是中文,getParameter時輸出就變成亂碼
- 我們只需要一個操作
- 注意!!!必須在獲取請求參數之前調用才有效。比如說我先調用pasword的參數,然后才設置utf-8,然后再調用username,如果是post且中文,還是會亂碼
請求的轉發
public class Servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求的參數(辦事的材料)查看String username = req.getParameter("username");System.out.println("在Servlet1(柜臺1)中查看參數(材料): " + username);// 給材料 蓋一個章,并傳遞到Servlet2(柜臺2)去查看req.setAttribute("key1", "柜臺1的章");// 問路:Servlet2(柜臺2)怎么走/*** 請求轉發必須要以斜杠打頭, / 斜杠 表示地址為: http://ip:port/工程名/ ,映射到IDEA代碼的web目錄*/RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");// 走向Servlet2(柜臺2)requestDispatcher.forward(req,resp);} } public class Servlet2 extends HelloServlet {@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {// 獲取請求的參數(辦事的材料)查看String username = request.getParameter("username");System.out.println("在Servlet2(柜臺2)中查看參數(材料): " + username);Object key1 = request.getAttribute("key1");System.out.println("柜臺1是否有章:" + key1);// 處理自己的業務System.out.println("Servlet2 處理自己的業務");} } <!-- Server --> 在Servlet1(柜臺1)中查看參數(材料): null 在Servlet2(柜臺2)中查看參數(材料): null 柜臺1是否有章:柜臺1的章 Servlet2 處理自己的業務- 發現輸入的前兩句為null,因為我們在轉入/servlet1的時候,沒有傳入參數
- 若輸入http://localhost:8080/_servlet02/servlet1?username=wzg168來訪問,則Server打印 :
-
第三個特點體現在上述代碼中key1的傳遞
-
web-inf是受服務器保護的,客戶端不能直接訪問,但可以通過服務器中的資源進行間接訪問
-
比如如果我們把form.html放到web-inf下
-
這樣的話,訪問/servlet1也顯示form.html的表單的內容 :
base標簽的作用
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><!-- base標簽設置頁面相對路徑工作時參照的地址 --><base href="http://localhost:8080/_servlet02/a/b/c.html"><!-- 可以省略為“http://localhost:8080/_servlet02/a/b/“,但斜杠不能去掉,因為斜杠說明b是一個目錄,而不是一個資源路徑 --> </head> <body>這是a下的b下的c.html頁面 <br><a href="../../index.html">跳回首頁</a><!-- http://localhost:8080/_servlet02/a/b/c.html../../index.html --><!-- http://localhost:8080/_servlet02/index.html --> </body> </html>回顧javaweb中的路徑
斜杠在web中的不同意義
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>首頁</title> </head> <body>這是Web下的index.html <br><a href="a/b/c.html">a/b/c.html</a> <br><a href="http://localhost:8080/_servlet02/forwardC">請求轉發:a/b/c.html</a><a href="/">斜杠</a> </body> </html>- 點擊后跳轉至 http://localhost:8080/
HttpServletResponse類的介紹
兩個響應流的介紹
package com.atguigu.servlet;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class ResponseIOServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getOutputStream();resp.getWriter();} }給客戶端回傳字符串數據
package com.atguigu.servlet;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;public class ResponseIOServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 要求 :往客戶端回傳 字符串 數據PrintWriter writer = resp.getWriter();writer.write("response's content!!!");} }解決響應的中文亂碼
public class ResponseIOServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 要求 :往客戶端回傳 字符串 數據PrintWriter writer = resp.getWriter();writer.write("即將出現中文亂碼");} } public class ResponseIOServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(resp.getCharacterEncoding());} }- 訪問頁面后,Server輸出 ISO-8859-1
- 說明,默認是ISO-8859-1,這個字符集是不支持中文的
- 因此,我們要設置支持中文的字符集
解決響應中文亂碼問題方案二
public class ResponseIOServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 它會同時設置服務器和客戶端都使用UTF-8字符集,還設置了響應頭// 此方法一定要在獲取流對象(PrintWriter writer = resp.getWriter();)之前使用才有效resp.setContentType("text/html; charset=UTF-8");System.out.println(resp.getCharacterEncoding()); // output:"UTF-8"} }請求重定向
- 然后訪問http://localhost:8080/_servlet02/response1,會自動跳轉至http://localhost:8080/_servlet02/response2,
- 關于第三個特點的解釋 :
如果在Response1中保存一些數據,比如req.setAttribute("key1", "value1"); ,然后在Response2中System.out,println(req.getAttribute("key1"));會得到null
原因 :tomcat每次收到請求,就會把請求到的數據解析好,每次請求都會封裝 - 關于第四個特點 :
原因 :
第二次請求還是客戶端給服務器發的,而WEB-INF目錄是受保護的,瀏覽器無法直接訪問,第二次請求還是瀏覽器發過來的,還是進不來 - 第五個特點 :
請求重定向第二種實現方案
public class Response1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("http://localhost:8080/_servlet02/response2");} }總結
以上是生活随笔為你收集整理的尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈尔滨工业大学-数据库系统(基本知识与关
- 下一篇: 计算机组成原理(哈工大刘宏伟)135讲(