Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日本一级特黄完整大片,国产在线观看一区精品,欧美在线|欧美

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          servlet總結(jié)二:web服務(wù)器配置與啟動(dòng)

          servlet總結(jié)二:web服務(wù)器配置與啟動(dòng)

          們先來(lái)看一下web服務(wù)器在整個(gè)B/S架構(gòu)中的位置:

          我們發(fā)現(xiàn)web服務(wù)器有種承上啟下的作用,它是游覽器和java程序建立連接的一個(gè)橋梁;

          我們先去下載web服務(wù)器Tomcat

          https://www.apache.org/:Tomcat屬于apache組織下的一個(gè)開源的項(xiàng)目,

          圖上面的每一個(gè)單詞都代表一個(gè)項(xiàng)目,tomcat只是apache組織里面的冰山一角;apache里面還包含了很多我們常用的一些框架:struts,大數(shù)據(jù)相關(guān)的HBase,Hadoop等待太多了;

          我們點(diǎn)擊Tomcat進(jìn)入:https://tomcat.apache.org/

          目前tomcat的最新版本是10,我們下載并安裝;tomcat是綠色版,下載后直接解壓就可以了;

          tomcat目錄結(jié)構(gòu)

          啟動(dòng)命令:C:\apache-tomcat-8.5.73\bin\startup.bat

          tomcat服務(wù)器是純java語(yǔ)言寫的,所以要運(yùn)行tomcat一定要有java運(yùn)行環(huán)境,所以第一步先配置JAVA_HOME:C:\Program Files\Java\jdk1.8.0_101;

          配置了以上步驟就可以運(yùn)行tomcat了,但是如果現(xiàn)在cmd命令窗口里面直接運(yùn)行tomcat好需要配置兩個(gè)地方:

          1、配置啟動(dòng)命令的path;

          path:C:\apache-tomcat-8.5.73\bin

          2、配置CATALINA_HOME(tomcat的家)

          CATALINA_HOME:C:\apache-tomcat-8.5.73

          配置以上兩步驟就可以在任何地方啟動(dòng)tomcat了,CATALINA是tomcat的作者;

          文鏈接:https://juejin.cn/post/7107099957219295262

          一、Servlet 概述


          1、Servlet名字

          Servlet=Server + applet

          Server:服務(wù)器 applet:小程序 Servlet:服務(wù)器端的小程序


          2、Servlet在Web應(yīng)用中的作用

          ①生活中的例子

          ②對(duì)應(yīng)Web應(yīng)用

          ③具體細(xì)節(jié)

          ④Servlet扮演角色 在整個(gè)Web應(yīng)用中,Servlet主要負(fù)責(zé)處理請(qǐng)求、協(xié)調(diào)調(diào)度功能。我們可以把Servlet稱為Web應(yīng)用中的『控制器』



          二、Servlet HelloWorld


          1、HelloWorld分析

          ①目標(biāo) 在頁(yè)面上點(diǎn)擊超鏈接,由Servlet處理這個(gè)請(qǐng)求,并返回一個(gè)響應(yīng)字符串:Hello,I am Servlet! 。

          ②思路


          2、具體操作

          ①創(chuàng)建動(dòng)態(tài)Web Module 《踩坑+排雷新版IDEA2021.1創(chuàng)建配置Javaweb項(xiàng)目并部署在Tomcat容器》

          ②創(chuàng)建前端頁(yè)面超鏈接 begin.html 的代碼如下:

          <!DOCTYPE html>
          <html lang="en">
          <head>
            <meta charset="UTF-8">
            <title>Title</title>
          </head>
          <body>
            <a href="hello">請(qǐng)點(diǎn)擊我</a>
          </body>
          </html>
          復(fù)制代碼

          ③創(chuàng)建HelloServlet的Java類

          package com.yeman.Servlets;
          
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import javax.servlet.http.HttpServlet;
          import java.io.IOException;
          import java.io.PrintWriter;
          
          /**
           * @Author: Yeman
           * @Date: 2022-02-11-18:15
           * @Description:
           */
          public class Hello extends HttpServlet {
              @Override
              public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
                  System.out.println("執(zhí)行了Hello這個(gè)Servlet!");
                  
                  // 返回響應(yīng)字符串
                  // 1、獲取能夠返回響應(yīng)數(shù)據(jù)的字符流對(duì)象
                  PrintWriter writer=res.getWriter();
          
                  // 2、向字符流對(duì)象寫入數(shù)據(jù)
                  writer.write("Hello,I am Servlet!");
                  
              }
          }
          復(fù)制代碼

          ④配置Hello Servlet 配置文件位置:WEB-INF/web.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>
              	 <!-- 給Servlet設(shè)置一個(gè)簡(jiǎn)短名稱 -->
                  <servlet-name>Hello</servlet-name>
                  <!-- 配置Servlet的全類名 -->
                  <servlet-class>com.yeman.Servlets.Hello</servlet-class>
              </servlet>
              <!-- 將Servlet和訪問地址關(guān)聯(lián)起來(lái) -->
              <servlet-mapping>
                  <servlet-name>Hello</servlet-name>
                  <url-pattern>/hello</url-pattern>
              </servlet-mapping>
          </web-app>
          復(fù)制代碼

          ⑤測(cè)試

          ⑥小結(jié) 需求:在瀏覽器上點(diǎn)超鏈接能夠訪問Java程序。


          3、梳理概念

          ①原生Tomcat

          ②IDEA中的Tomcat實(shí)例

          ③IDEA中的Web工程

          ④根據(jù)Web工程生成的war包

          ⑤Web工程中的資源 [1]靜態(tài)資源

          • HTML文件
          • CSS文件
          • JavaScript文件
          • 圖片文件

          [2]動(dòng)態(tài)資源

          • Servlet

          ⑥訪問資源的地址 [1]靜態(tài)資源

          /Web應(yīng)用名稱/靜態(tài)資源本身的路徑

          [2]動(dòng)態(tài)資源

          /Web應(yīng)用名稱/虛擬路徑

          ⑦Web應(yīng)用名稱

          ⑧總體的邏輯結(jié)構(gòu)



          三、Servlet 繼承關(guān)系


          1、繼承關(guān)系

          javax.servlet.Servlet接口----->javax.servlet.GenericServlet抽象類 ----->javax.servlet.http.HttpServlet抽象子類


          2、相關(guān)方法

          ①javax.servlet.Servlet接口:

          • void init(config) - 初始化方法
          • void service(request,response) - 服務(wù)方法
          • void destory() - 銷毀方法

          ②javax.servlet.GenericServlet抽象類:

          • void service(request,response) - 仍然是抽象的

          ③javax.servlet.http.HttpServlet 抽象子類:

          • void service(request,response) - 不是抽象的

          String method=req.getMethod(); 獲取請(qǐng)求的方式 各種if判斷,根據(jù)請(qǐng)求方式不同,決定去調(diào)用不同的do方法:

          if (method.equals("GET")) {
                          this.doGet(req,resp);
                      } else if (method.equals("HEAD")) {
                          this.doHead(req, resp);
                      } else if (method.equals("POST")) {
                          this.doPost(req, resp);
                      } else if (method.equals("PUT")) {
                      ......
          復(fù)制代碼

          在HttpServlet這個(gè)抽象類中,do方法都差不多:

          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          	String protocol=req.getProtocol();
              String msg=lStrings.getString("http.method_get_not_supported");
              if (protocol.endsWith("1.1")) {
              	resp.sendError(405, msg);
              } else {
                  resp.sendError(400, msg);
              }
          }
          復(fù)制代碼

          3、小結(jié)

          ①繼承關(guān)系: HttpServlet -> GenericServlet -> Servlet

          ②Servlet中的核心方法:init(),service(),destroy()

          ③服務(wù)方法: 當(dāng)有請(qǐng)求過(guò)來(lái)時(shí),service方法會(huì)自動(dòng)響應(yīng)(其實(shí)是tomcat容器調(diào)用的)。

          ④在HttpServlet中會(huì)分析請(qǐng)求的方式:到底是get、post、head還是delete等,然后再?zèng)Q定調(diào)用的是哪個(gè)do開頭的方法。

          ⑤在HttpServlet中的do方法默認(rèn)都是405的實(shí)現(xiàn)風(fēng)格,需要子類去實(shí)現(xiàn)對(duì)應(yīng)的方法,否則默認(rèn)會(huì)報(bào)405錯(cuò)誤。因此,我們?cè)谛陆⊿ervlet時(shí),需要考慮請(qǐng)求方法,從而決定重寫哪個(gè)do方法。



          四、Servlet 生命周期


          1、生命周期

          從出生到死亡的過(guò)程就是生命周期。對(duì)應(yīng)Servlet中的三個(gè)方法init(),service(),destroy()。

          默認(rèn)情況下:第一次接收請(qǐng)求時(shí),這個(gè)Servlet會(huì)進(jìn)行實(shí)例化(調(diào)用構(gòu)造方法)、初始化(調(diào)用init())、然后服務(wù)(調(diào)用service())。從第二次請(qǐng)求開始,每一次都是服務(wù)。當(dāng)容器關(guān)閉時(shí),其中的所有的servlet實(shí)例會(huì)被銷毀,調(diào)用銷毀方法。

          Servlet實(shí)例Tomcat只會(huì)創(chuàng)建一個(gè),所有的請(qǐng)求都是這個(gè)實(shí)例去響應(yīng)。默認(rèn)情況下,第一次請(qǐng)求時(shí),Tomcat才會(huì)去實(shí)例化,初始化,然后再服務(wù)。這樣的好處是什么是可以提高系統(tǒng)的啟動(dòng)速度,這樣的缺點(diǎn)是什么是第一次請(qǐng)求耗時(shí)較長(zhǎng)。因此得出結(jié)論: 如果需要提高系統(tǒng)的啟動(dòng)速度,當(dāng)前默認(rèn)情況即可,如果需要提高響應(yīng)速度,就應(yīng)該設(shè)置Servlet的初始化時(shí)機(jī)。


          2、初始化時(shí)機(jī)

          我們可以通過(guò)<load-on-startup>來(lái)設(shè)置servlet啟動(dòng)的先后順序,數(shù)字越小,啟動(dòng)越靠前,最小值0。可以讓其在系統(tǒng)啟動(dòng)時(shí)便實(shí)例化初始化,提高后期響應(yīng)速度。

          修改web.xml中Servlet的配置:

          <!-- 配置Servlet本身 -->
          <servlet>
              <!-- 全類名太長(zhǎng),給Servlet設(shè)置一個(gè)簡(jiǎn)短名稱 -->
              <servlet-name>HelloServlet</servlet-name>
          
              <!-- 配置Servlet的全類名 -->
              <servlet-class>com.yeman.servlet.HelloServlet</servlet-class>
          
              <!-- 配置Servlet啟動(dòng)順序 -->
              <load-on-startup>1</load-on-startup>
          </servlet>
          復(fù)制代碼

          3、Servlet 容器

          ①容器 在開發(fā)使用的各種技術(shù)中,經(jīng)常會(huì)有很多對(duì)象會(huì)放在容器中。

          ②容器提供的功能 容器會(huì)管理內(nèi)部對(duì)象的整個(gè)生命周期。對(duì)象在容器中才能夠正常的工作,得到來(lái)自容器的全方位的支持。

          • 創(chuàng)建對(duì)象
          • 初始化
          • 工作
          • 清理

          ③容器本身也是對(duì)象 特點(diǎn)1:往往是非常大的對(duì)象 特點(diǎn)2:通常的單例的

          ④典型Servlet容器產(chǎn)品舉例 Tomcat、jetty、jboss、Weblogic、WebSphere、glassfish

          ⑤Servlet在容器中是:?jiǎn)卫摹⒕€程不安全的。

          單例:所有的請(qǐng)求都是同一個(gè)實(shí)例去響應(yīng) 線程不安全:一個(gè)線程需要根據(jù)這個(gè)實(shí)例中的某個(gè)成員變量值去做邏輯判斷,但是在中間某個(gè)時(shí)機(jī),另一個(gè)線程改變了這個(gè)成員變量的值,從而導(dǎo)致第一個(gè)線程的執(zhí)行路徑發(fā)生了變化。

          注意:盡量的不要在servlet中定義成員變量,如果不得不定義成員變量,那么不要去:①修改成員變量的值 ②根據(jù)成員變量的值做一些邏輯判斷。


          4、小結(jié)



          五、ServletConfig 和 ServletContext


          1、ServletConfig 接口

          ①接口概覽

          ②接口方法

          ③初始化參數(shù)舉例

          <!-- 配置Servlet本身 -->
          <servlet>
              <!-- 全類名太長(zhǎng),給Servlet設(shè)置一個(gè)簡(jiǎn)短名稱 -->
              <servlet-name>HelloServlet</servlet-name>
          
              <!-- 配置Servlet的全類名 -->
              <servlet-class>com.yeman.servlet.HelloServlet</servlet-class>
          
              <!-- 配置初始化參數(shù) -->
              <init-param>
                  <param-name>goodMan</param-name>
                  <param-value>me</param-value>
              </init-param>
          
              <!-- 配置Servlet啟動(dòng)順序 -->
              <load-on-startup>1</load-on-startup>
          </servlet>
          復(fù)制代碼

          ④體驗(yàn)

          public class HelloServlet implements Servlet {
          
              // 聲明一個(gè)成員變量,用來(lái)接收init()方法傳入的servletConfig對(duì)象
              private ServletConfig servletConfig;
          
              public HelloServlet(){
                  System.out.println("HelloServlet對(duì)象創(chuàng)建!");
              }
          
              @Override
              public void init(ServletConfig servletConfig) throws ServletException {
          
                  System.out.println("HelloServlet對(duì)象初始化");
          
                  // 將Tomcat調(diào)用init()方法時(shí)傳入的servletConfig對(duì)象賦值給成員變量
                  this.servletConfig=servletConfig;
          
              }
          
              @Override
              public ServletConfig getServletConfig() {
          
                  // 返回成員變量servletConfig,方便使用
                  return this.servletConfig;
              }
          
              @Override
              public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
          
                  // 控制臺(tái)打印,證明這個(gè)方法被調(diào)用了
                  System.out.println("我是HelloServlet,我執(zhí)行了!");
          
                  // 返回響應(yīng)字符串
                  // 1、獲取能夠返回響應(yīng)數(shù)據(jù)的字符流對(duì)象
                  PrintWriter writer=servletResponse.getWriter();
          
                  // 2、向字符流對(duì)象寫入數(shù)據(jù)
                  writer.write("Hello,I am Servlet!");
          
                  //=============分割線===============// 測(cè)試ServletConfig對(duì)象的使用
                  // 1.獲取ServletConfig對(duì)象:在init()方法中完成
                  System.out.println("servletConfig=" + servletConfig.getClass().getName());
          
                  // 2.通過(guò)servletConfig對(duì)象獲取ServletContext對(duì)象
                  ServletContext servletContext=this.servletConfig.getServletContext();
                  System.out.println("servletContext=" + servletContext.getClass().getName());
          
                  // 3.通過(guò)servletConfig對(duì)象獲取初始化參數(shù)
                  Enumeration<String> enumeration=this.servletConfig.getInitParameterNames();
                  while (enumeration.hasMoreElements()) {
                      String name=enumeration.nextElement();
                      System.out.println("name=" + name);
          
                      String value=this.servletConfig.getInitParameter(name);
                      System.out.println("value=" + value);
                  }
              }
          
              @Override
              public String getServletInfo() {
                  return null;
              }
          
              @Override
              public void destroy() {
                  System.out.println("HelloServlet對(duì)象即將銷毀,現(xiàn)在執(zhí)行清理操作");
              }
          }
          復(fù)制代碼

          ⑤Servlet標(biāo)準(zhǔn)和JDBC標(biāo)準(zhǔn)對(duì)比: 廣義Servlet:javax.servlet包下的一系列接口定義的一組Web開發(fā)標(biāo)準(zhǔn)。遵循這一套標(biāo)準(zhǔn),不同的Servlet容器提供了不同的實(shí)現(xiàn)。 狹義Servlet:javax.servlet.Servlet接口和它的實(shí)現(xiàn)類,也就是實(shí)際開發(fā)時(shí)使用的具體的Servlet。

          同樣都體現(xiàn)了面向接口編程的思想,同時(shí)也體現(xiàn)了解耦的思想:只要接口不變,下層方法有任何變化,都不會(huì)影響上層方法。


          2、ServletContext 接口

          ①簡(jiǎn)介

          代表整個(gè)Web應(yīng)用,是單例。

          典型的功能:

          • 獲取某個(gè)資源的真實(shí)路徑:getRealPath()
          • 獲取整個(gè)Web應(yīng)用級(jí)別的初始化參數(shù):getInitParameter()
          • 作為Web應(yīng)用范圍的域?qū)ο?/li>

          存入數(shù)據(jù):setAttribute() 取出數(shù)據(jù):getAttribute(

          ②體驗(yàn) [1]配置Web應(yīng)用級(jí)別的初始化參數(shù)

            <!-- 配置Web應(yīng)用的初始化參數(shù) -->
              <context-param>
                  <param-name>handsomeMan</param-name>
                  <param-value>alsoMe</param-value>
              </context-param>
          復(fù)制代碼

          [2]獲取參數(shù)

          String handsomeMan=servletContext.getInitParameter("handsomeMan");
          System.out.println("handsomeMan=" + handsomeMan);
          復(fù)制代碼


          六、請(qǐng)求轉(zhuǎn)發(fā)與重定向


          1、接力

          發(fā)一個(gè)請(qǐng)求給Servlet,接力棒就傳遞到了Servlet手中。而絕大部分情況下,Servlet不能獨(dú)自完成一切,需要把接力棒繼續(xù)傳遞下去,此時(shí)我們就需要請(qǐng)求的『轉(zhuǎn)發(fā)』或『重定向』。


          2、轉(zhuǎn)發(fā)

          ①本質(zhì):轉(zhuǎn)交

          ②完整定義:在請(qǐng)求的處理過(guò)程中,Servlet完成了自己的任務(wù),需要把請(qǐng)求轉(zhuǎn)交給下一個(gè)Servlet繼續(xù)處理。

          ③代碼

          request.getRequestDispatcher("/fruit/apple/red/big.html").forward(request, response);
          復(fù)制代碼

          ④類比

          關(guān)鍵:由于轉(zhuǎn)發(fā)操作的核心部分是在服務(wù)器端完成的,所以瀏覽器感知不到,整個(gè)過(guò)程中瀏覽器只發(fā)送一次請(qǐng)求。


          3、重定向

          ①本質(zhì):一種特殊的響應(yīng)

          ②完整定義:在請(qǐng)求的處理過(guò)程中,Servlet完成了自己的任務(wù),然后以一個(gè)響應(yīng)的方式告訴瀏覽器:要完成這個(gè)任務(wù)還需要你另外再訪問下一個(gè)資源”。

          ③代碼

          response.sendRedirect("/app/fruit/apple/red/big.html");
          復(fù)制代碼

          關(guān)鍵:由于重定向操作的核心部分是在瀏覽器端完成的,所以整個(gè)過(guò)程中瀏覽器共發(fā)送兩次請(qǐng)求。


          4、對(duì)比


          5、應(yīng)用場(chǎng)景

          可以簡(jiǎn)單的判斷:能用轉(zhuǎn)發(fā)的先用轉(zhuǎn)發(fā),如果轉(zhuǎn)發(fā)不行,再使用重定向。

          需要通過(guò)同一個(gè)request對(duì)象把數(shù)據(jù)攜帶到目標(biāo)資源:只能用轉(zhuǎn)發(fā)。

          如果希望前往下一個(gè)資源之后,瀏覽器刷新訪問的是第二個(gè)資源:只能用重定向。



          七、獲取請(qǐng)求參數(shù)


          1、請(qǐng)求參數(shù)的概念

          瀏覽器在給服務(wù)器發(fā)送請(qǐng)求的同時(shí),攜帶的參數(shù)數(shù)據(jù)。


          2、瀏覽器發(fā)送請(qǐng)求參數(shù)的基本形式

          • URL地址后面附著的請(qǐng)求參數(shù)

          /orange/CharacterServlet?username=Tom

          • 表單
          • Ajax請(qǐng)求

          3、服務(wù)器對(duì)請(qǐng)求參數(shù)的封裝

          總體上來(lái)說(shuō),服務(wù)器端將請(qǐng)求參數(shù)封裝為Map<String, String[]>。

          鍵:請(qǐng)求參數(shù)的名字 值:請(qǐng)求參數(shù)的值組成的數(shù)組


          4、獲取請(qǐng)求參數(shù)的方法


          5、測(cè)試

          ①HTML代碼

          <!-- 測(cè)試請(qǐng)求參數(shù)的表單 -->
          <form action="/orange/ParamServlet" method="post">
          
              <!-- 單行文本框 -->
              <!-- input標(biāo)簽配合type="text"屬性生成單行文本框 -->
              <!-- name屬性定義的是請(qǐng)求參數(shù)的名字 -->
              <!-- 如果設(shè)置了value屬性,那么這個(gè)值就是單行文本框的默認(rèn)值 -->
              個(gè)性簽名:<input type="text" name="signal" value="單行文本框的默認(rèn)值" /><br/>
          
              <!-- 密碼框 -->
              <!-- input標(biāo)簽配合type="password"屬性生成密碼框 -->
              <!-- 用戶在密碼框中填寫的內(nèi)容不會(huì)被一明文形式顯示 -->
              密碼:<input type="password" name="secret" /><br/>
          
              <!-- 單選框 -->
              <!-- input標(biāo)簽配合type="radio"屬性生成單選框 -->
              <!-- name屬性一致的radio會(huì)被瀏覽器識(shí)別為同一組單選框,同一組內(nèi)只能選擇一個(gè) -->
              <!-- 提交表單后,真正發(fā)送給服務(wù)器的是name屬性和value屬性的值 -->
              <!-- 使用checked="checked"屬性設(shè)置默認(rèn)被選中 -->
              請(qǐng)選擇你最喜歡的季節(jié):
              <input type="radio" name="season" value="spring" />春天
              <input type="radio" name="season" value="summer" checked="checked" />夏天
              <input type="radio" name="season" value="autumn" />秋天
              <input type="radio" name="season" value="winter" />冬天
          
              <br/><br/>
          
              你最喜歡的動(dòng)物是:
              <input type="radio" name="animal" value="tiger" />路虎
              <input type="radio" name="animal" value="horse" checked="checked" />寶馬
              <input type="radio" name="animal" value="cheetah" />捷豹
          
              <br/>
          
              <!-- 多選框 -->
              <!-- input標(biāo)簽和type="checkbox"配合生成多選框 -->
              <!-- 多選框被用戶選擇多個(gè)并提交表單后會(huì)產(chǎn)生『一個(gè)名字?jǐn)y帶多個(gè)值』的情況 -->
              你最喜歡的球隊(duì)是:
              <input type="checkbox" name="team" value="Brazil"/>巴西
              <input type="checkbox" name="team" value="German" checked="checked"/>德國(guó)
              <input type="checkbox" name="team" value="France"/>法國(guó)
              <input type="checkbox" name="team" value="China" checked="checked"/>中國(guó)
              <input type="checkbox" name="team" value="Italian"/>意大利
          
              <br/>
          
              <!-- 下拉列表 -->
              <!-- 使用select標(biāo)簽定義下拉列表整體,在select標(biāo)簽內(nèi)設(shè)置name屬性 -->
              你最喜歡的運(yùn)動(dòng)是:
              <select name="sport">
                  <!-- 使用option屬性定義下拉列表的列表項(xiàng) -->
                  <!-- 使用option標(biāo)簽的value屬性設(shè)置提交給服務(wù)器的值,在option標(biāo)簽的標(biāo)簽體中設(shè)置給用戶看的值 -->
                  <option value="swimming">游泳</option>
                  <option value="running">跑步</option>
          
                  <!-- 使用option標(biāo)簽的selected="selected"屬性設(shè)置這個(gè)列表項(xiàng)默認(rèn)被選中 -->
                  <option value="shooting" selected="selected">射擊</option>
                  <option value="skating">溜冰</option>
              </select>
          
              <br/>
          
              <br/><br/>
          
              <!-- 表單隱藏域 -->
              <!-- input標(biāo)簽和type="hidden"配合生成表單隱藏域 -->
              <!-- 表單隱藏域在頁(yè)面上不會(huì)有任何顯示,用來(lái)保存要提交到服務(wù)器但是又不想讓用戶看到的數(shù)據(jù) -->
              <input type="hidden" name="userId" value="234654745" />
          
              <!-- 多行文本框 -->
              自我介紹:<textarea name="desc">多行文本框的默認(rèn)值</textarea>
          
              <br/>
          
              <!-- 普通按鈕 -->
              <button type="button">普通按鈕</button>
          
              <!-- 重置按鈕 -->
              <button type="reset">重置按鈕</button>
          
              <!-- 表單提交按鈕 -->
              <button type="submit">提交按鈕</button>
          </form>
          復(fù)制代碼

          ②Java代碼

          ervlet概述

          servlet=server + applet:運(yùn)行在服務(wù)器端的java程序

          Servlet是一個(gè)接口,一個(gè)類想通過(guò)瀏覽器被訪問到,那么這個(gè)類就必須直接或間接的實(shí)現(xiàn)Servlet接口

          Servlet執(zhí)行原理

          Servlet生命周期

          • init()

          servlet創(chuàng)建對(duì)象時(shí),調(diào)用此方法完成初始化操作

          • service()

          用戶訪問servlet時(shí),調(diào)用此方法完成業(yè)務(wù)邏輯的處理

          • destory()

          servlet對(duì)象銷毀,調(diào)用此方法完成銷毀操作

          Servlet體系結(jié)構(gòu)

          HttpServlet

          • Servlet可以映射多個(gè)url
          • url映射模式

          Request

          • 請(qǐng)求行

          • 請(qǐng)求頭

          • 請(qǐng)求體(請(qǐng)求參數(shù))

          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 設(shè)置解碼為UTF-8,解決post中文亂碼問題, 需放在首行
              req.setCharacterEncoding("UTF-8");
              
              doGet(req, resp);
          }
          • 請(qǐng)求轉(zhuǎn)發(fā)

          服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式

          • 域?qū)ο?/li>

          一個(gè)作用范圍的對(duì)象,可以在范圍共享數(shù)據(jù)

          request域: 代表一次請(qǐng)求的范圍,一般用于一次請(qǐng)求中轉(zhuǎn)發(fā)的多個(gè)資源中共享數(shù)據(jù)

          Response

          response對(duì)象表示web服務(wù)器給瀏覽器返回的響應(yīng)信息。

          作用:返回給瀏覽器的響應(yīng)信息。

          • 響應(yīng)行

          • 響應(yīng)頭

          • 響應(yīng)體

            • 響應(yīng)重定向

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("訪問到了CServlet,接下來(lái)重定向DServlet");
          
            // 方式一:設(shè)置重定向
            resp.setStatus(302);
            //        resp.setHeader("Location", "/項(xiàng)目名/DServlet");
          
            // 方式二:設(shè)置重定向
            resp.sendRedirect("/項(xiàng)目名/DServlet");
          }


          • 中文亂碼

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 第一種方式:設(shè)置編碼,一定要設(shè)置首行
            //        resp.setCharacterEncoding("GBK");
          
            // 第二種方式:統(tǒng)一瀏覽器和服務(wù)器編碼
            resp.setContentType("text/html;charset=UTF-8");
          
            // 頁(yè)面輸出中文
            PrintWriter writer=resp.getWriter();
            writer.write("中文");
          }

          ServletContext

          web容器在啟動(dòng)時(shí),會(huì)為每個(gè)web項(xiàng)目創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象。

          ServletContext: 代表當(dāng)前web項(xiàng)目

          • ServletContext對(duì)象

          • 域?qū)ο螅ü蚕頂?shù)據(jù))

          當(dāng)前項(xiàng)目范圍內(nèi),共享數(shù)據(jù)(多個(gè)Servlet都可以獲取)。

          • 獲取文件MIME類型

          互聯(lián)網(wǎng)通信過(guò)程中定義的一種文件數(shù)據(jù)類型格式。

          Cookie

          Cookie:客戶端會(huì)話技術(shù)。

          作用:在一次會(huì)話的多次請(qǐng)求之間共享數(shù)據(jù),將數(shù)據(jù)保存到客戶端(瀏覽器)。

          服務(wù)器可以發(fā)送多個(gè)Cookie。

          默認(rèn)情況下,瀏覽器關(guān)閉(會(huì)話結(jié)束),cookie銷毀(內(nèi)存)。

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 編碼
            String encodevalue=URLEncoder.encode("杰克  ", "UTF-8");
          
            Cookie cookie=new Cookie("name", encodevalue);
          
            resp.addCookie(cookie);
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie[] cookies=req.getCookies();
          
            for (Cookie cookie : cookies) {
              // 獲取cookie的name
              String name=cookie.getName();
          
              // 獲取cookie的value
              String value=cookie.getValue();
          
              // 解碼
              String decodeValue=URLDecoder.decode(value, "UTF-8");
          
          
              System.out.println(name + ":" + decodeValue);
            }
          • Cookie特點(diǎn)

          Session

          Session:會(huì)話技術(shù);基于cookie來(lái)實(shí)現(xiàn)的。

          作用:在一次會(huì)話的多次請(qǐng)求之間共享數(shù)據(jù),將數(shù)據(jù)保存到服務(wù)端。

          • HttpSession

          HttpSession:域?qū)ο蟆?/p>

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 將共享數(shù)據(jù)存到session
            // 獲取session對(duì)象
            HttpSession session=req.getSession();
            // 將session對(duì)象進(jìn)行數(shù)據(jù)存入
            session.setAttribute("name", "jack");
          
            System.out.println("已將數(shù)據(jù)存到共享數(shù)據(jù)中。。。");
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 將session中的共享數(shù)據(jù)取出來(lái)
            // 獲取session對(duì)象
            HttpSession session=req.getSession();
            // 獲取共享數(shù)據(jù)
            String name=(String) session.getAttribute("name");
          
            System.out.println(name);
          }
          • Session生命周期

          三大域?qū)ο?/h1>

          Request、Session、ServletContext

          • API

          • 生命周期

            • ServletContext

            • HttpSession

            • HttpServletRequest

          Filter:訪問服務(wù)器資源,過(guò)濾請(qǐng)求,完成通用操作

          web的三大組件:

          servlet(控制器)

          filter(過(guò)濾器)

          listener(監(jiān)聽器)

          • 執(zhí)行原理

          • 生命周期


          • 攔截路徑

          • 過(guò)濾器鏈

          Listener

          <listener>
              <listener-class>com.demo.listener.ServletContextListenerDemo</listener-class>
            </listener>
          package com.demo.listener;
          
          import javax.servlet.ServletContextEvent;
          import javax.servlet.ServletContextListener;
          
          public class ServletContextListenerDemo implements ServletContextListener {
              @Override
              public void contextInitialized(ServletContextEvent sce) {
                  System.out.println("監(jiān)聽到servletContext對(duì)象創(chuàng)建了。。。");
              }
          
              @Override
              public void contextDestroyed(ServletContextEvent sce) {
                  System.out.println("監(jiān)聽到servletContext對(duì)象銷毀了...");
              }
          }

          MVC

          三層架構(gòu)


          主站蜘蛛池模板: 日韩精品电影一区亚洲| 国产一在线精品一区在线观看| 夜夜嗨AV一区二区三区| 亚洲Av无码一区二区二三区| 国产在线观看精品一区二区三区91| 亚洲国产精品乱码一区二区 | 国产精品毛片a∨一区二区三区| 中文字幕一区二区三区5566| 国产精品丝袜一区二区三区 | 久久久国产精品一区二区18禁| AA区一区二区三无码精片| 精品香蕉一区二区三区| 国产福利91精品一区二区| 欧洲无码一区二区三区在线观看| 亚洲啪啪综合AV一区| 久久久91精品国产一区二区三区| 国产成人一区在线不卡| 亚洲日韩AV一区二区三区中文 | 四虎永久在线精品免费一区二区 | 国产免费一区二区三区免费视频 | 国产精品视频一区二区三区无码| 国偷自产Av一区二区三区吞精| 国产精品一区二区久久精品无码| 男人的天堂精品国产一区| 日韩精品一区二区三区中文字幕 | 一区二区中文字幕| 国产吧一区在线视频| 亚洲av无码成人影院一区| 精品人妻少妇一区二区三区不卡| 国产精品福利一区二区久久| 无码人妻精品一区二区三区久久久 | 国产一区二区三区高清视频 | 国产精品第一区揄拍无码| 日本一区二区三区免费高清| 成人精品一区二区激情| 亚洲性日韩精品一区二区三区 | 久久成人国产精品一区二区 | 97人妻无码一区二区精品免费 | 国产经典一区二区三区蜜芽| 国产精品制服丝袜一区| 国产一区二区在线观看麻豆|