日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)

發布時間:2025/3/19 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 尚硅谷最新版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技術來解析
package com.atguigu.pojo;import java.math.BigDecimal;public class Book {private String sn;private String name;private BigDecimal price;private String author;// control + enter 快速生成函數// constructor -> a全選 -> okpublic Book(String sn, String name, BigDecimal price, String author) {this.sn = sn;this.name = name;this.price = price;this.author = author;}@Overridepublic String toString() {return "Book{" +"sn='" + sn + '\'' +", name='" + name + '\'' +", price=" + price +", author='" + author + '\'' +'}';}// constructor -> select nonepublic Book() {}public String getSn() {return sn;}public void setSn(String sn) {this.sn = sn;}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getPrice() {return price;}public void setPrice(BigDecimal price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;} } package com.atguigu.pojo;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.jupiter.api.Test;import java.util.List;public class Dom4jTest {@Testpublic void test1() throws DocumentException {SAXReader saxReader = new SAXReader();// Document document = saxReader.read("src/books.xml");Document read = saxReader.read("src/books.xml");// System.out.println(document);}@Testpublic void test2() throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read("src/books.xml");Element rootElement = document.getRootElement();// System.out.println(rootElement);List<Element> books = rootElement.elements("book");for (Element book : books) { // System.out.println(book.asXML()); // Element name = book.element("name"); // System.out.println(name.asXML()); // String text = name.getText(); // System.out.println(text);String price = book.elementText("price");System.out.println(price);}} }

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程序的訪問地址

package com.atguigu.servlet;import javax.servlet.*; import java.io.IOException;public class HelloServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}/*** service方法 專門用來處理請求和響應的* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { // System.out.println("HelloServlet 被訪問了");System.out.println("this is the service method");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {} } <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- servlet標簽給tomcat配置servlet程序 --><servlet><!-- servlet-name標簽 給Servlet程序起一個別名(一般是類名) --><servlet-name>HelloServlet</servlet-name><!-- servlet-class 是Servlet程序的全類名 --><servlet-class>com.atguigu.servlet.HelloServlet</servlet-class></servlet><!-- servlet-mapping標簽給servlet程序配置訪問地址 --><servlet-mapping><!-- servlet-name標簽的作用是告訴服務器,我當前配置的地址給哪個servlet程序使用 --><servlet-name>HelloServlet</servlet-name><!-- url-pattern標簽配置訪問地址/ 斜杠在服務器解析的時候,表示地址為:http://ip:port/工程路徑/hello 表示地址為:http://ip:port/工程路徑/hello--><url-pattern>/hello</url-pattern></servlet-mapping></web-app><!-- 常見錯誤1:url-pattern中配置的路徑沒有以斜杠打頭 Invalid <url-pattern> hello in servlet mapping --> <!-- 常見錯誤2:servlet-name配置的值不存在 Servlet mapping specifies an unknown sevlet name HelloServlet1 --> <!-- 常見錯誤3:servlet-class標簽的全類名配置錯誤 java.lang.ClassNotFoundException: com.atguigu.sssss.HelloServlet(寫的時候直接輸入Hello就會自己補全) -->

url地址如何定位到Servlet程序去訪問 :

  • 在localhost中,一個程序可以占用多個端口號,但是一個端口號唯一標識一個程序

Servlet的生命周期

1.執行Servlet構造器方法
2.執行init初始化方法
第一、二步是在,第一次訪問的,的時候 創建servlet程序會調用
3.執行service方法
第三步,每次訪問都會調用
4.執行destroy銷毀方法
第四步,在web工程停止的時候調用

package com.atguigu.servlet;import javax.servlet.*; import java.io.IOException;public class HelloServlet implements Servlet {// Constructor方法(一開始點“實現方法”后這個不會出現,要另外再添加)public HelloServlet() {System.out.println("1 構造器方法");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("2 init初始化方法");}@Overridepublic ServletConfig getServletConfig() {return null;}/*** service方法 專門用來處理請求和響應的* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { // System.out.println("HelloServlet 被訪問了");System.out.println("3 service方法 -- HelloServlet被訪問了");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("4 destroy銷毀方法");} } // console output 1 構造器方法 2 init初始化方法 3 service方法 -- HelloServlet被訪問了 3 service方法 -- HelloServlet被訪問了 3 service方法 -- HelloServlet被訪問了 3 service方法 -- HelloServlet被訪問了 3 service方法 -- HelloServlet被訪問了 3 service方法 -- HelloServlet被訪問了 3 service方法 -- HelloServlet被訪問了
  • 因此發現是 單例模式

請求的分發處理

  • 問題 :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被訪問啦“
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><form action="http://localhost:8080/_servlet/hello" method="get"><!-- input:submit 然后tab --><input type="submit"></form> </body> </html>
  • 將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();
@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {// 類型轉換(因為它有getMethod()方法)HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;// 獲取請求的方式String method = httpServletRequest.getMethod();System.out.println(method);}
  • 然后 重啟服務器,再在a.html中點擊按鈕后,Server中就會輸出“POST“
  • 因此說明我們已經可以得到method了,那么就可以根據method的不同類型來作出不同代碼
@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;String method = httpServletRequest.getMethod();if ("POST".equals(method)) {System.out.println("post請求");} else {System.out.println("get請求");}}
  • 如果if里執行的語句太多,顯得很臃腫;因此,我們采用 封裝 的思想,將if中語句換成函數
@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;String method = httpServletRequest.getMethod();if ("POST".equals(method)) {doPost();} else {doGet();}}public void doPost(){System.out.println("this is Post");System.out.println("ohayo!");}public void doGet(){System.out.println("this is Get");System.out.println("ohayo!");}

通過繼承HttpServlet類來實現Servlet程序

  • 實際開發中,很少通過 “通過實現Servlet接口” 的方式來實現Servlet程序
  • 開發時,一般都是導入他的子類去繼承即可
  • 一般在實際開發中,都是使用繼承HttpServlet類的方法去實現Servlet程序
    1.編寫一個類來繼承HttpServlet類
    2.根據業務需求重寫doGet()和doPost()方法
    3.到web.xml中配置Servlet程序的訪問地址
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 HelloServlet2 extends HttpServlet {/*** 第一步,control + enter 然后點擊 "重寫方法"也就是 Overrride Methods* 第二部,按住 command ,然后就可以同時選擇doGet()和doPost()* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doGet(req, resp);System.out.println("this is HelloServlet2 - get");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doPost(req, resp);System.out.println("this is HelloServlet2 - post");} } <!-- xml配置 --> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.atguigu.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><servlet><servlet-name>HelloServlet2</servlet-name><servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet2</servlet-name><url-pattern>/hello2</url-pattern></servlet-mapping></web-app> <!-- 修改html中表單的action屬性 --> <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><form action="http://localhost:8080/_servlet/hello2" method="post"><!-- input:submit 然后tab --><input type="submit"></form> </body> </html>
  • 然后 重啟服務器;就可以顯示啦
  • 我們注意到在這個編寫的繼承類中,我們直接只需要重寫doGet方法即可,不需要再得到method,然后ifelse

使用IDEA創建Servlet程序

  • 第一步,點擊要在哪個包中編寫這個類,然后

  • 會自動創建這個類(里面有準備好doGet方法和doPost方法的重寫),以及在web.xml中自動配置(但要自行寫serlet-mapping)

整個Servlet類的繼承體系

ServletConfig類使用介紹


關于初始化參數init-param

  • 且這個init-param在一個servlet標簽中可以有多對
  • servletConfig可以在HelloServlet的init初始化方法中使用

HelloServlet程序的別名是:HelloServlet 初始化參數username的值是:root org.apache.catalina.core.ApplicationContextFacade@7602e52f

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
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- context-param是上下文參數(它屬于整個web工程,與servlet并列) --><context-param><param-name>username</param-name><param-value>context</param-value></context-param><!-- context-param也可以擁有多對 --><context-param><param-name>password</param-name><param-value>root</param-value></context-param><servlet>... </web-app>
  • 然后,通過 ServletConfig 來獲得 ServletContext 對象
  • 有一個小細節,這個代碼只能寫在doGet中,寫在doPost中是不會在Server中輸出語句的
  • context.getInitParameter()只能得到context-param,不能得到servlet中的init-param(只能由ServletConfig的getInitParameter()得到)
package com.atguigu.servlet;import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException;public class ContextServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1.獲取web.xml中配置的上下文參數context-paramServletContext context = getServletConfig().getServletContext();String username = context.getInitParameter("username");System.out.println("context-param的參數username的值是:" + username);System.out.println("context-param的參數password的值是:" + context.getInitParameter("password"));// 2.獲取當前的工程路徑,格式:/工程路徑System.out.println("當前工程路徑:" + context.getContextPath());// 3.獲取工程部署后在服務器硬盤的絕對路徑/*** /斜杠 被服務器解析地址為: http://ip:port/工程名/ 映射到 IDEA代碼的web目錄*/System.out.println("工程部署的路徑是:" + context.getRealPath("/"));System.out.println("工程下css目錄的絕對路徑是:" + context.getRealPath("/css")); // System.out.println("工程下imgs目錄1.jpg的絕對路徑是:" + context.getRealPath("/imgs/1.jpg"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} } <!-- Server輸出的內容 --> context-param的參數username的值是:context context-param的參數password的值是:root 當前工程路徑:/_servlet 工程部署的路徑是:/Users/fieldxia/Desktop/JavaWeb/_servlet/target/_servlet-1.0-SNAPSHOT/ 工程下css目錄的絕對路徑是:/Users/fieldxia/Desktop/JavaWeb/_servlet/target/_servlet-1.0-SNAPSHOT/css

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工程就停止了,里面的數據就沒有了
public class ContextServlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 獲取ServletContext對象ServletContext context = getServletContext();System.out.println(context);} } public class ContextServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext context = getServletContext();System.out.println(context);} } <!-- 一個web工程,只有一個ServletContext對象實例 --> org.apache.catalina.core.ApplicationContextFacade@4f419be1 14-Mar-2022 19:53:39.424 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 應用程序部署到目錄 [/Users/fieldxia/Downloads/apache-tomcat-8.5.75/webapps/manager] 14-Mar-2022 19:53:39.467 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web應用程序目錄[/Users/fieldxia/Downloads/apache-tomcat-8.5.75/webapps/manager]的部署已在[43]毫秒內完成 org.apache.catalina.core.ApplicationContextFacade@4f419be1

什么是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

<!-- Server --> username: javaweb password: 123456 hobby: cpp
  • 以上hobby的做法是錯的,這樣興趣愛好多選只會返回一個值,應該將getParameter換成getParameterValues
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.getParameterValues("hobby");System.out.println("username: " + username);System.out.println("password: " + password);System.out.println("hobby: " + Arrays.asList(hobby));} }

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且中文,還是會亂碼
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 設置請求體的字符集為UTF-8,從而解決post請求的中文亂碼問題// 也要在獲取請求參數之前調用才有效req.setCharacterEncoding("UTF-8");String username = req.getParameter("username");String password = req.getParameter("password");String[] hobby = req.getParameterValues("hobby");System.out.println("username: " + username);System.out.println("password: " + password);System.out.println("hobby: " + Arrays.asList(hobby));}

請求的轉發

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打印 :
在Servlet1(柜臺1)中查看參數(材料): wzg168 在Servlet2(柜臺2)中查看參數(材料): wzg168 柜臺1是否有章:柜臺1的章 Servlet2 處理自己的業務

  • 第三個特點體現在上述代碼中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-8resp.setCharacterEncoding("UTF-8");// 通過響應頭,設置 瀏覽器 也使用UTF-8字符集(一般是GBKresp.setHeader("Content-Type", "text/html; charset=UTF-8");PrintWriter writer = resp.getWriter();writer.write("這不是中文亂碼");} }

解決響應中文亂碼問題方案二

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"} }

請求重定向



public class Response1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("曾到此一游 Response1");// 設置響應狀態碼302,表示重定向(已搬遷)resp.setStatus(302);// 設置響應頭,說明 新的地址在哪里resp.setHeader("Location", "http://localhost:8080/_servlet02/response2");} } public class Response2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("response2's result!!!");} }
  • 然后訪問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零基础入门完整版(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费黄色美女网站 | 豆花免费跳转入口官网 | 全黄性性激高免费视频 | 亚洲成a| 中文字幕在线免费 | 亚洲精品色 | 色综合色综合 | 毛片毛片女人毛片毛片 | 香蕉视频官网在线观看 | melody在线高清免费观看 | 日韩欧洲亚洲AV无码精品 | 国产成人在线电影 | 中国一极毛片 | a v在线视频 | 红桃视频网站 | 99热最新网址| 91大神一区二区 | 美国黄色一级大片 | 国模私拍xvideos私拍 | 欧美日韩在线视频免费 | 男女交性视频 | 神马一区二区三区 | 手机在线观看免费av | 国产精品乱 | 日本一区二区三区电影在线观看 | 国产成人精品网站 | 成年性生交大片免费看 | 在线日韩中文字幕 | 亚洲一区二区动漫 | 韩日少妇 | 久久手机看片 | 免费污视频 | 午夜国产小视频 | 欧美日韩中文字幕一区二区 | 日剧大尺度床戏做爰 | 久久精品国产亚洲av高清色欲 | 最新国产露脸在线观看 | 国产精品久久久久久久久久东京 | av收藏小四郎最新地址 | いいなり北条麻妃av101 | 人妻 校园 激情 另类 | 又大又粗欧美黑人aaaaa片 | 中文字幕无码日韩专区免费 | 天天插综合 | 国产精品爽爽爽 | 女仆裸体打屁屁羞羞免费 | 国产精品99久久久久久人 | 色哟哟国产 | 欧美二区在线观看 | 色窝窝无码一区二区三区成人网站 | 国产精品99久久久久久人 | 特级丰满少妇一级aaaa爱毛片 | 国产乱偷| 欧美国产日本 | 中文字幕超清在线免费观看 | 性高湖久久久久久久久免费 | 日韩影院一区二区 | 亚洲一区二区三区视频 | 日韩成人免费观看 | 日皮视频网站 | 免费涩涩视频 | 日韩av电影中文字幕 | 日日干干 | 插女生下面| 欧美怡红院 | 欧美黑吊大战白妞 | 男人操女人下面 | 加勒比日韩 | 国产无遮挡又黄又爽免费视频 | 丰满大肥婆肥奶大屁股 | 久久性| 空姐吹箫视频大全 | 午夜在线影院 | 手机在线看a | 怡红院一区二区三区 | 免费黄色高清视频 | 中文字幕丰满孑伦无码专区 | 亚洲av熟女一区 | 色日韩| 日韩精品黄 | 无人码人妻一区二区三区免费 | 在线免费观看高清视频 | 在线你懂的 | 美女一二区 | 少妇人妻无码专区视频 | 熟女人妇 成熟妇女系列视频 | 亚洲一区二区三区四区五区xx | 国产精品一区电影 | 熟女视频一区二区三区 | 亚洲精品欧美日韩 | 中文字幕国产视频 | 探花国产精品一区二区 | 一卡二卡三卡在线视频 | 日韩一级片在线观看 | 亚洲国产第一页 | 欧美最猛黑人xxxx | 久草欧美视频 | 成人免费视频观看视频 | 韩国精品一区二区三区 |