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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

模拟Servlet本质

發(fā)布時間:2023/11/28 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟Servlet本质 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JavaWeb系列教程,持續(xù)更新
JavaWeb—Servlet
模擬Servlet本質(zhì)
使用IDEA開發(fā)Servlet程序
Servlet對象的生命周期
適配器(GenericServlet)改造Servlet
ServletConfig
Servlet–ServletContext
如果大家覺得有幫助的話,不妨動動小手,點贊收藏一波,也方便后面的復(fù)習(xí)哈

模擬Servlet本質(zhì)

  • 充當(dāng)SUN公司角色,制定Servlet規(guī)范

    • javax.servlet.Servlet接口

      package javax.servlet;
      /*
      我們現(xiàn)在充當(dāng)?shù)慕巧荢UN公司
      SUN公司把Servlet接口/規(guī)范制定出來*/
      public interface Servlet{
      //一個專門提供服務(wù)的方法void service();}
      
  • 充當(dāng)Tomcat服務(wù)器的開發(fā)者

 
package org.apache;
import java.util.Scanner;
import java.util.Properties;
import java.io.FileReader;
import javax.servlet.Servlet;
//充當(dāng)Tomcat服務(wù)器的開發(fā)者
public class Tomcat{public static void main(String[]args) throws Exception{System.out.println("Tomcat服務(wù)器啟動成功,開始接收用戶的訪問");
/*
簡單的使用Scanner類模擬一下用戶的請求
用戶訪問服務(wù)器是通過瀏覽器上的請求路徑
也就是說用戶請求的路徑不同,后臺執(zhí)行的Serlet不同*/	Scanner scanner=new Scanner(System.in);System.out.println("請輸入你的訪問路徑");String key=scanner.nextLine();//	Tomcat已經(jīng)獲取到了用戶的請求路徑/*Tomcat服務(wù)器應(yīng)該通過輸入的請求路徑來找對應(yīng)的XXXServlet請求路徑和XXXServlet之間的關(guān)系應(yīng)該由誰來制定呢由webapp開發(fā)者制定對應(yīng)Tomcat服務(wù)器來說需要解析配置文件*/FileReader reader=new FileReader("web.properties");Properties pro=new Properties();pro.load(reader);reader.close();//通過key獲取valueString className=pro.getProperty(key);//通過反射機制創(chuàng)建對象Class clazz=Class.forName(className);//obj的類型對于Tomcat服務(wù)器來說,并不知道他具體是什么類型Object obj=clazz.newInstance();
//但是Tomcat服務(wù)器的開發(fā)者知道我們寫的xxxServlet都實現(xiàn)Servlet接口Servlet servlet=(Servlet)obj;servlet.service();}
}
  • 充當(dāng)webapp的開發(fā)者

    • BankServlet

    • package com.bjpowernode.servlet;import javax.servlet.Servlet;
      //充當(dāng)?shù)慕巧?#xff1a;webapp的開發(fā)者
      //只要是webapp開發(fā)中寫的XXXServlet都要實現(xiàn)Servlet接口
      public class BankServlet implements Servlet{public void service(){System.out.println("BankServlet的service方法");}}
      
    • UserListServlet

    package com.bjpowernode.servlet;()import javax.servlet.Servlet;
    //充當(dāng)?shù)慕巧?#xff1a;webapp的開發(fā)者
    public class UserListServlet implements Servlet{public void service(){System.out.println("UserListServlet的service方法");}}
    
    • UserLoginServlet

    • package com.bjpowernode.servlet;import javax.servlet.Servlet;
      //充當(dāng)?shù)慕巧?#xff1a;webapp的開發(fā)者
      public class UserLoginServlet implements Servlet{public void service(){System.out.println("UserLoginServlet的service方法");}}
      

      web.properties

/aaaa=com.bjpowernode.servlet.UserListServlet
/bbbb=com.bjpowernode.servlet.UserLoginServlet
/cccc=com.bjpowernode.BankServlet

Tomcat代碼是提前寫好的,讀取的配置文件的路徑也都是寫好的,寫死的在Java程序當(dāng)中,Tomcat在找配置文件的時候,對javaweb程序員來說,這個配置文件的名字和存放的路徑不能隨便起名,文件放的位置不能隨便放

  • 通過分析發(fā)現(xiàn)
    • 對應(yīng)我們javaweb程序員來說,我們只需要做兩件事
      • 編寫一個類實現(xiàn)Servlet接口
      • 把編寫的類配置到配置文件當(dāng)中,在配置文件中指定請求路徑和類名的關(guān)系
  • 注意:
    • 這個配置文件的文件名不能隨便亂來,它是固定的
    • 這個配置文件的路徑不能亂來,是固定的
    • 文件名、文件路徑都是由SUN公司在Servlet規(guī)范中制定的明細
  • 嚴(yán)格意義上來說Servlet其實并不是簡單的一個接口

  • Servlet規(guī)范 中規(guī)定了:

  • 遵循Servlet規(guī)范的webapp,這個webapp就可以放在不同的WEB服務(wù)器中運行。(因為這個webapp是遵循Servlet規(guī)范的。)
  • Servlet規(guī)范包括什么呢?
  • 規(guī)范了哪些接口
  • 規(guī)范了哪些類
  • 規(guī)范了一個web應(yīng)用中應(yīng)該有哪些配置文件
  • 規(guī)范了一個web應(yīng)用中配置文件的名字
  • 規(guī)范了一個web應(yīng)用中配置文件存放的路徑
  • 規(guī)范了一個web應(yīng)用中配置文件的內(nèi)容
  • 規(guī)范了一個合法有效的web應(yīng)用它的目錄結(jié)構(gòu)應(yīng)該是怎樣的。
  • 規(guī)范了一個合格的webapp中Java程序放在哪里

? Tomcat服務(wù)器要遵循這個Servlet規(guī)范,JavaWeb程序員也要遵循這個Servlet規(guī)范,這樣Tomcat服務(wù)器和webapp才能解耦合

開發(fā)一個帶有Servlet(Java小程序)的webapp(重點)

開發(fā)步驟是怎樣的?

  • 第一步:在webapps目錄下新建一個目錄,起名crm(這個crm就是webapp的名字)。當(dāng)然,也可以是其它項目,比如銀行項目,可以創(chuàng)建一個目錄bank,辦公系統(tǒng)可以創(chuàng)建一個oa。

    • 注意:crm就是這個webapp的根
  • 第二步:在webapp的根下新建一個目錄:WEB-INF

    • 注意:這個目錄的名字是Servlet規(guī)范中規(guī)定的,必須全部大寫,必須一模一樣。必須的必須。
  • 第三步:在WEB-INF目錄下新建一個目錄:classes

    • 注意:這個目錄的名字必須是全部小寫的classes。這也是Servlet規(guī)范中規(guī)定的。另外這個目錄下一定存放的是Java程序編譯之后的class文件(這里存放的是字節(jié)碼文件)。
  • 第四步:在WEB-INF目錄下新建一個目錄:lib

    • 注意:這個目錄不是必須的。但如果一個webapp需要第三方的jar包的話,這個jar包要放到這個lib目錄下,這個目錄的名字也不能隨意編寫,必須是全部小寫的lib。例如java語言連接數(shù)據(jù)庫需要數(shù)據(jù)庫的驅(qū)動jar包。那么這個jar包就一定要放到lib目錄下。這Servlet規(guī)范中規(guī)定的。
  • 第五步:在WEB-INF目錄下新建一個文件:web.xml

    • 注意:這個文件是必須的,這個文件名必須叫做web.xml。這個文件必須放在這里。一個合法的webapp,web.xml文件是必須的,這個web.xml文件就是一個配置文件,在這個配置文件中描述了請求路徑和Servlet類之間的對照關(guān)系。

    • 這個文件最好從其他的webapp中拷貝,最好別手寫。沒必要。復(fù)制粘貼

    • <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaeehttps://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"metadata-complete="true"></web-app>
  • 第六步:編寫一個Java程序,這個小Java程序也不能隨意開發(fā),這個小java程序必須實現(xiàn)Servlet接口。

    • 這個Servlet接口不在JDK當(dāng)中。(因為Servlet不是JavaSE了。Servlet屬于JavaEE,是另外的一套類庫。)

    • Servlet接口(Servlet.class文件)是Oracle提供的。(最原始的是sun公司提供的。)

    • Servlet接口是JavaEE的規(guī)范中的一員。

    • Tomcat服務(wù)器實現(xiàn)了Servlet規(guī)范,所以Tomcat服務(wù)器也需要使用Servlet接口。Tomcat服務(wù)器中應(yīng)該有這個接口,Tomcat服務(wù)器的CATALINA_HOME\lib目錄下有一個servlet-api.jar,解壓這個servlet-api.jar之后,你會看到里面有一個Servlet.class文件。

    • 重點:從JakartaEE9開始,Servlet接口的全名變了:jakarta.servlet.Servlet

    • 注意:編寫這個Java小程序的時候,java源代碼你愿意在哪里就在哪里,位置無所謂,你只需要將java源代碼編譯之后的class文件放到classes目錄下即可。

  • 第七步:編譯我們編寫的HelloServlet

    • 重點:你怎么能讓你的HelloServlet編譯通過呢?配置環(huán)境變量CLASSPATH

      CLASSPATH=.;D:\Program Files\Tomcat\apache-tomcat-10.0.16\lib\jsp-api.jar

    • 思考問題:以上配置的CLASSPATH和Tomcat服務(wù)器運行有沒有關(guān)系?

      • 沒有任何關(guān)系,以上配置這個環(huán)境變量只是為了讓你的HelloServlet能夠正常編譯生成class文件。因為Tomcat服務(wù)器知道servlet.jar在哪里
  • 第八步:將以上編譯之后的HelloServlet.class文件拷貝到WEB-INF\classes目錄下。

  • 第九步:在web.xml文件中編寫配置信息,讓“請求路徑”和“Servlet類名”關(guān)聯(lián)在一起。

    • 這一步用專業(yè)術(shù)語描述:在web.xml文件中注冊Servlet類。
  • 第十步:啟動Tomcat服務(wù)器

  • 第十一步:打開瀏覽器,在瀏覽器地址欄上輸入一個url,這個URL必須是:

    • http://127.0.0.1:8080/crm/fdsa/fd/saf/d/sa/fd/sa/fd
    • 非常重要的一件事:瀏覽器上的請求路徑不能隨便寫,這個請求路徑必須和web.xml文件中的url-pattern一致。
    • 注意:瀏覽器上的請求路徑和web.xml文件中的url-pattern的唯一區(qū)別就是:瀏覽器上的請求路徑帶項目名:/crm
  • 瀏覽器上編寫的路徑太復(fù)雜,可以使用超鏈接。(非常重要:html頁面只能放到WEB-INF目錄外面。

  • 以后不需要我們編寫main方法了。tomcat服務(wù)器負責(zé)調(diào)用main方法,Tomcat服務(wù)器啟動的時候執(zhí)行的就是main方法。我們javaweb程序員只需要編寫Servlet接口的實現(xiàn)類,然后將其注冊到web.xml文件中,即可。底層是 通過反射機制

  • `package com.bjpowernode.servlet;

package com.bjpowernode.servlet;import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;
import java.io.PrintWriter;public class HelloServlet implements Servlet{//5個方法public void init(ServletConfig config) throws ServletException{}public void service(ServletRequest request,ServletResponse response)throws ServletException,IOException{//向控制臺打印輸出System.out.println("My First Servlet,Hello Servlet");//設(shè)置響應(yīng)的內(nèi)容類型是普通文本或html//設(shè)置響應(yīng)的內(nèi)容類型時,不要在獲取流之后response.setContentType("text/html");/*怎么把一個信息直接輸出到瀏覽器上需要使用ServletResponse接口:responseresponse表示響應(yīng):從服務(wù)器向瀏覽器發(fā)送數(shù)據(jù)叫做響應(yīng)*/PrintWriter out=response.getWriter();out.print("Hello Servlet,You are my first Servlet");out.print("<h1>hello servlet</h1>");/*這是一個輸出流這個輸出流不需要我們刷新,也不需要我們關(guān)閉,這些都是由Tomcat服務(wù)器來維護out.flush();out.close();*/}public void destroy(){}public String getServletInfo(){return "";}public ServletConfig getServletConfig(){return null;}}


  • 總結(jié)一下:一個合法的webapp目錄結(jié)構(gòu)應(yīng)該是怎樣的?
webapproot|------WEB-INF|------classes(存放字節(jié)碼)|------lib(第三方j(luò)ar包)|------web.xml(注冊Servlet)|------html|------css|------javascript|------image....

瀏覽器發(fā)送請求,到最終服務(wù)器調(diào)用Servlet中的方法,是怎樣的一個過程?(只是大概過程)

  • 用戶輸入URL,或者直接點擊超鏈接:http://127.0.0.1:8080/crm/fdsa/fd/saf/d/sa/fd/sa/fd
  • 然后Tomcat服務(wù)器接收到請求,截取路徑:/crm/fdsa/fd/saf/d/sa/fd/sa/fd
  • Tomcat服務(wù)器找到crm項目
  • Tomcat服務(wù)器在web.xml文件中查找/fdsa/fd/saf/d/sa/fd/sa/fd 對應(yīng)的Servlet是:com.bjpowernode.servlet.HelloServlet
  • Tomcat服務(wù)器通過反射機制,創(chuàng)建com.bjpowernode.servlet.HelloServlet的對象。
  • Tomcat服務(wù)器調(diào)用com.bjpowernode.servlet.HelloServlet對象的service方法。

關(guān)于JavaEE的版本

  • JavaEE目前最高版本是 JavaEE8
  • JavaEE被Oracle捐獻了,Oracle將JavaEE規(guī)范捐獻給Apache了。
  • Apache把JavaEE換名了,以后不叫JavaEE了,以后叫做 jakarta EE。
  • 以后沒有JavaEE了。以后都叫做Jakarta EE。
  • JavaEE8版本升級之后的"JavaEE 9",不再是"JavaEE9"這個名字了,叫做JakartaEE9
  • JavaEE8的時候?qū)?yīng)的Servlet類名是:javax.servlet.Servlet
  • JakartaEE9的時候?qū)?yīng)的Servlet類名是:jakarta.servlet.Servlet (包名都換了)
  • 如果你之前的項目還是在使用javax.servlet.Servlet,那么你的項目無法直接部署到Tomcat10+版本上。你只能部署到Tomcat9-版本上。在Tomcat9以及Tomcat9之前的版本中還是能夠識別javax.servlet這個包。

解決Tomcat服務(wù)器在DOS命令窗口中的亂碼問題(控制臺亂碼)

將CATALINA_HOME/conf/logging.properties文件中的內(nèi)容修改如下:

java.util.logging.ConsoleHandler.encoding = GBK

向瀏覽器響應(yīng)一段HTML代碼

public void service(ServletRequest request, ServletResponse response){response.setContentType("text/html");PrintWriter out = response.getWriter();out.print("<h1>hello servlet!</h1>");
}

在Servlet中連接數(shù)據(jù)庫,怎么做?

  • Servlet是Java程序,所以在Servlet中完全可以編寫JDBC代碼連接數(shù)據(jù)庫。
  • 在一個webapp中去連接數(shù)據(jù)庫,需要將驅(qū)動jar包放到WEB-INF/lib目錄下。(com.mysql.cj.jdbc.Driver 這個類就在驅(qū)動jar包當(dāng)中。)
  • 這樣子就可以實現(xiàn)動態(tài)網(wǎng)頁技術(shù),數(shù)據(jù)庫中數(shù)據(jù)的變化都可以反應(yīng)到網(wǎng)頁中

總結(jié)

以上是生活随笔為你收集整理的模拟Servlet本质的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。