模拟Servlet本质
JavaWeb系列教程,持續更新
JavaWeb—Servlet
模擬Servlet本質
使用IDEA開發Servlet程序
Servlet對象的生命周期
適配器(GenericServlet)改造Servlet
ServletConfig
Servlet–ServletContext
如果大家覺得有幫助的話,不妨動動小手,點贊收藏一波,也方便后面的復習哈
模擬Servlet本質
-
充當SUN公司角色,制定Servlet規范
-
javax.servlet.Servlet接口
package javax.servlet; /* 我們現在充當的角色是SUN公司 SUN公司把Servlet接口/規范制定出來*/ public interface Servlet{ //一個專門提供服務的方法void service();}
-
-
充當Tomcat服務器的開發者
package org.apache;
import java.util.Scanner;
import java.util.Properties;
import java.io.FileReader;
import javax.servlet.Servlet;
//充當Tomcat服務器的開發者
public class Tomcat{public static void main(String[]args) throws Exception{System.out.println("Tomcat服務器啟動成功,開始接收用戶的訪問");
/*
簡單的使用Scanner類模擬一下用戶的請求
用戶訪問服務器是通過瀏覽器上的請求路徑
也就是說用戶請求的路徑不同,后臺執行的Serlet不同*/ Scanner scanner=new Scanner(System.in);System.out.println("請輸入你的訪問路徑");String key=scanner.nextLine();// Tomcat已經獲取到了用戶的請求路徑/*Tomcat服務器應該通過輸入的請求路徑來找對應的XXXServlet請求路徑和XXXServlet之間的關系應該由誰來制定呢由webapp開發者制定對應Tomcat服務器來說需要解析配置文件*/FileReader reader=new FileReader("web.properties");Properties pro=new Properties();pro.load(reader);reader.close();//通過key獲取valueString className=pro.getProperty(key);//通過反射機制創建對象Class clazz=Class.forName(className);//obj的類型對于Tomcat服務器來說,并不知道他具體是什么類型Object obj=clazz.newInstance();
//但是Tomcat服務器的開發者知道我們寫的xxxServlet都實現Servlet接口Servlet servlet=(Servlet)obj;servlet.service();}
}
-
充當webapp的開發者
-
BankServlet
-
package com.bjpowernode.servlet;import javax.servlet.Servlet; //充當的角色:webapp的開發者 //只要是webapp開發中寫的XXXServlet都要實現Servlet接口 public class BankServlet implements Servlet{public void service(){System.out.println("BankServlet的service方法");}} -
UserListServlet
package com.bjpowernode.servlet;()import javax.servlet.Servlet; //充當的角色:webapp的開發者 public class UserListServlet implements Servlet{public void service(){System.out.println("UserListServlet的service方法");}}-
UserLoginServlet
-
package com.bjpowernode.servlet;import javax.servlet.Servlet; //充當的角色:webapp的開發者 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程序當中,Tomcat在找配置文件的時候,對javaweb程序員來說,這個配置文件的名字和存放的路徑不能隨便起名,文件放的位置不能隨便放
- 通過分析發現
- 對應我們javaweb程序員來說,我們只需要做兩件事
- 編寫一個類實現Servlet接口
- 把編寫的類配置到配置文件當中,在配置文件中指定請求路徑和類名的關系
- 對應我們javaweb程序員來說,我們只需要做兩件事
- 注意:
- 這個配置文件的文件名不能隨便亂來,它是固定的
- 這個配置文件的路徑不能亂來,是固定的
- 文件名、文件路徑都是由SUN公司在Servlet規范中制定的明細
-
嚴格意義上來說Servlet其實并不是簡單的一個接口
-
Servlet規范 中規定了:
- 遵循Servlet規范的webapp,這個webapp就可以放在不同的WEB服務器中運行。(因為這個webapp是遵循Servlet規范的。)
- Servlet規范包括什么呢?
- 規范了哪些接口
- 規范了哪些類
- 規范了一個web應用中應該有哪些配置文件
- 規范了一個web應用中配置文件的名字
- 規范了一個web應用中配置文件存放的路徑
- 規范了一個web應用中配置文件的內容
- 規范了一個合法有效的web應用它的目錄結構應該是怎樣的。
- 規范了一個合格的webapp中Java程序放在哪里
? Tomcat服務器要遵循這個Servlet規范,JavaWeb程序員也要遵循這個Servlet規范,這樣Tomcat服務器和webapp才能解耦合
開發一個帶有Servlet(Java小程序)的webapp(重點)
開發步驟是怎樣的?
-
第一步:在webapps目錄下新建一個目錄,起名crm(這個crm就是webapp的名字)。當然,也可以是其它項目,比如銀行項目,可以創建一個目錄bank,辦公系統可以創建一個oa。
- 注意:crm就是這個webapp的根
-
第二步:在webapp的根下新建一個目錄:WEB-INF
- 注意:這個目錄的名字是Servlet規范中規定的,必須全部大寫,必須一模一樣。必須的必須。
-
第三步:在WEB-INF目錄下新建一個目錄:classes
- 注意:這個目錄的名字必須是全部小寫的classes。這也是Servlet規范中規定的。另外這個目錄下一定存放的是Java程序編譯之后的class文件(這里存放的是字節碼文件)。
-
第四步:在WEB-INF目錄下新建一個目錄:lib
- 注意:這個目錄不是必須的。但如果一個webapp需要第三方的jar包的話,這個jar包要放到這個lib目錄下,這個目錄的名字也不能隨意編寫,必須是全部小寫的lib。例如java語言連接數據庫需要數據庫的驅動jar包。那么這個jar包就一定要放到lib目錄下。這Servlet規范中規定的。
-
第五步:在WEB-INF目錄下新建一個文件:web.xml
-
注意:這個文件是必須的,這個文件名必須叫做web.xml。這個文件必須放在這里。一個合法的webapp,web.xml文件是必須的,這個web.xml文件就是一個配置文件,在這個配置文件中描述了請求路徑和Servlet類之間的對照關系。
-
這個文件最好從其他的webapp中拷貝,最好別手寫。沒必要。復制粘貼
-
<?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程序也不能隨意開發,這個小java程序必須實現Servlet接口。
-
這個Servlet接口不在JDK當中。(因為Servlet不是JavaSE了。Servlet屬于JavaEE,是另外的一套類庫。)
-
Servlet接口(Servlet.class文件)是Oracle提供的。(最原始的是sun公司提供的。)
-
Servlet接口是JavaEE的規范中的一員。
-
Tomcat服務器實現了Servlet規范,所以Tomcat服務器也需要使用Servlet接口。Tomcat服務器中應該有這個接口,Tomcat服務器的CATALINA_HOME\lib目錄下有一個servlet-api.jar,解壓這個servlet-api.jar之后,你會看到里面有一個Servlet.class文件。
-
重點:從JakartaEE9開始,Servlet接口的全名變了:jakarta.servlet.Servlet
-
注意:編寫這個Java小程序的時候,java源代碼你愿意在哪里就在哪里,位置無所謂,你只需要將java源代碼編譯之后的class文件放到classes目錄下即可。
-
-
第七步:編譯我們編寫的HelloServlet
-
重點:你怎么能讓你的HelloServlet編譯通過呢?配置環境變量CLASSPATH
CLASSPATH=.;D:\Program Files\Tomcat\apache-tomcat-10.0.16\lib\jsp-api.jar
-
思考問題:以上配置的CLASSPATH和Tomcat服務器運行有沒有關系?
- 沒有任何關系,以上配置這個環境變量只是為了讓你的HelloServlet能夠正常編譯生成class文件。因為Tomcat服務器知道servlet.jar在哪里
-
-
第八步:將以上編譯之后的HelloServlet.class文件拷貝到WEB-INF\classes目錄下。
-
第九步:在web.xml文件中編寫配置信息,讓“請求路徑”和“Servlet類名”關聯在一起。
- 這一步用專業術語描述:在web.xml文件中注冊Servlet類。
- 這一步用專業術語描述:在web.xml文件中注冊Servlet類。
-
第十步:啟動Tomcat服務器
-
第十一步:打開瀏覽器,在瀏覽器地址欄上輸入一個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的唯一區別就是:瀏覽器上的請求路徑帶項目名:/crm
-
瀏覽器上編寫的路徑太復雜,可以使用超鏈接。(非常重要:html頁面只能放到WEB-INF目錄外面。)
-
以后不需要我們編寫main方法了。tomcat服務器負責調用main方法,Tomcat服務器啟動的時候執行的就是main方法。我們javaweb程序員只需要編寫Servlet接口的實現類,然后將其注冊到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");//設置響應的內容類型是普通文本或html//設置響應的內容類型時,不要在獲取流之后response.setContentType("text/html");/*怎么把一個信息直接輸出到瀏覽器上需要使用ServletResponse接口:responseresponse表示響應:從服務器向瀏覽器發送數據叫做響應*/PrintWriter out=response.getWriter();out.print("Hello Servlet,You are my first Servlet");out.print("<h1>hello servlet</h1>");/*這是一個輸出流這個輸出流不需要我們刷新,也不需要我們關閉,這些都是由Tomcat服務器來維護out.flush();out.close();*/}public void destroy(){}public String getServletInfo(){return "";}public ServletConfig getServletConfig(){return null;}}
總結一下:一個合法的webapp目錄結構應該是怎樣的?
webapproot|------WEB-INF|------classes(存放字節碼)|------lib(第三方jar包)|------web.xml(注冊Servlet)|------html|------css|------javascript|------image....
瀏覽器發送請求,到最終服務器調用Servlet中的方法,是怎樣的一個過程?(只是大概過程)
- 用戶輸入URL,或者直接點擊超鏈接:http://127.0.0.1:8080/crm/fdsa/fd/saf/d/sa/fd/sa/fd
- 然后Tomcat服務器接收到請求,截取路徑:/crm/fdsa/fd/saf/d/sa/fd/sa/fd
- Tomcat服務器找到crm項目
- Tomcat服務器在web.xml文件中查找/fdsa/fd/saf/d/sa/fd/sa/fd 對應的Servlet是:com.bjpowernode.servlet.HelloServlet
- Tomcat服務器通過反射機制,創建com.bjpowernode.servlet.HelloServlet的對象。
- Tomcat服務器調用com.bjpowernode.servlet.HelloServlet對象的service方法。
關于JavaEE的版本
- JavaEE目前最高版本是 JavaEE8
- JavaEE被Oracle捐獻了,Oracle將JavaEE規范捐獻給Apache了。
- Apache把JavaEE換名了,以后不叫JavaEE了,以后叫做 jakarta EE。
- 以后沒有JavaEE了。以后都叫做Jakarta EE。
- JavaEE8版本升級之后的"JavaEE 9",不再是"JavaEE9"這個名字了,叫做JakartaEE9
- JavaEE8的時候對應的Servlet類名是:javax.servlet.Servlet
- JakartaEE9的時候對應的Servlet類名是:jakarta.servlet.Servlet (包名都換了)
- 如果你之前的項目還是在使用javax.servlet.Servlet,那么你的項目無法直接部署到Tomcat10+版本上。你只能部署到Tomcat9-版本上。在Tomcat9以及Tomcat9之前的版本中還是能夠識別javax.servlet這個包。
解決Tomcat服務器在DOS命令窗口中的亂碼問題(控制臺亂碼)
將CATALINA_HOME/conf/logging.properties文件中的內容修改如下:
java.util.logging.ConsoleHandler.encoding = GBK
向瀏覽器響應一段HTML代碼
public void service(ServletRequest request, ServletResponse response){response.setContentType("text/html");PrintWriter out = response.getWriter();out.print("<h1>hello servlet!</h1>");
}
在Servlet中連接數據庫,怎么做?
- Servlet是Java程序,所以在Servlet中完全可以編寫JDBC代碼連接數據庫。
- 在一個webapp中去連接數據庫,需要將驅動jar包放到WEB-INF/lib目錄下。(com.mysql.cj.jdbc.Driver 這個類就在驅動jar包當中。)
- 這樣子就可以實現動態網頁技術,數據庫中數據的變化都可以反應到網頁中
總結
以上是生活随笔為你收集整理的模拟Servlet本质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat之the jre_home
- 下一篇: 使用IDEA开发Servlet程序