javaWeb學習十一天------servlet學習

認識Web開發

web 開發 :基於因特網開發
web 資源: 也就是一切在瀏覽器看見的資源都被稱爲web資源

​ ==>作用: 用於展示數據

web 開發的架構:B/S,C/S

B/S:基於遊覽器,服務器開發的架構 如現在的遊覽器上的淘寶官網

優點:維護成本低,可以實現無縫升級系統

缺點:1.訪問速度受網速影響,

​ 2.服務端不在本地,使用的時候要使用遊覽器進行加密,安全性較低

​ 3.依賴於遊覽,某些動畫效果無法實現

C/S :基於客戶端,服務器開發的架構,如:手機或電腦的軟件或遊戲的安裝包

優點:1客戶端,服務器訪問速度快,效率高

​ 2.因爲客戶端和服務器都在本地,主要數據都是存儲在本地,所以安全性高

缺點:維護成本比較高,升級特別麻煩(需要每一個主機都重新安裝一次)

B/S 架構請求原理

1.瀏覽器給服務器發送請求

2.服務器接收請求,並處理請求,給瀏覽器一個響應

3.瀏覽器顯示數據

注意點:1.先有請求,纔有響應 2.不管服務端還是客戶端請求與響應是成對的

原理圖:
在這裏插入圖片描述

不管是BS還是CS都有其優勢與缺點,所以談不上誰可以替換的誰

B/S架構:url(統一資源定位符)

服務器上的每一個圖片或者是頁面或其他,都有一個唯一的url地址指向其位置

url 的組成部分:如:https://nvzhuang.tmall.com/?spm=875.7931836

​ 協議 : http https ftp …
​ 域名或者是ip地址 本機的是localhost ==》nvzhuang.tmall.com
​ 端口號: 8080 tomcat的端口號
​ 請求的參數: spm=875.7931836(多個參數使用&連接)

常見的服務器

1.Tomcat 免費 輕量級 開源 支持servlet與jsp (學習使用)
2.weblogic 收費的服務器:不開源
3.阿里雲服務器: 收費,收費不是特別貴,多數用於測試上線

Tomcat

Tomcat 免費 輕量級 開源 支持servlet與jsp 支持servlet以及jsp的主鍵

tomcat 的下載地址 http://tomcat.apache.org/
Tomcat的安裝:https://blog.csdn.net/weixin_39383702/article/details/103603501

toamct的目錄結構:

  • bin : 可執行的一些指令
  • conf 配置文件
  • lib 存放jar包
  • webapps 存放發佈後的項目(eclipse部署的項目的war包會加載這個裏,但是idea則會部署到自己項目的out文件裏面)

圖解:
在這裏插入圖片描述

開啓服務器:

雙擊運行bin目錄下的startup.bat文件

18-Dec-2019 20:11:07.405 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\apache-tomcat-8.5.50\webapps\ROOT] has finished in [21] ms
18-Dec-2019 20:11:07.407 信息 [main] org.apache.coyote.AbstractProtocol.start 開始協議處理句柄["http-nio-8080"]
18-Dec-2019 20:11:07.418 信息 [main] org.apache.coyote.AbstractProtocol.start 開始協議處理句柄["ajp-nio-8009"]
18-Dec-2019 20:11:07.421 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 671 ms

出現上面結果代表成功開啓服務器

關閉服務器:

1.強制性關閉 啓動的黑窗口
2.執行shutdown.bat 關閉

web 項目與tomcat的整合

java web三大組件之 :servlet

servlet:運行在服務端的java代碼(必須引入Tomcat的jar包纔可以使用)

作用: 主要是負責處理請求與響應,也就是接受前端傳遞的數據通過getmethod獲取請求的方式,並判斷是什麼請求,然後執行相應請求的的方法處理請求,然後跳轉到某個界面或者返回特定的結果

servlet的體系結構:

servlet---接口
 |
 GenericServlet---抽象類
 |
 HttpServlet----抽象類
* GenericServlet:將Servlet接口中其他的方法做了默認空實現,只將service()方法作爲抽象
	* 將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可

* HttpServlet:對http協議的一種封裝,簡化操作
	1. 定義類繼承HttpServlet
	2. 複寫doGet/doPost方法

實現servlet的3種方式

第一種:implements Servlet,實現其Servlet接口

import javax.servlet.*;
import java.io.IOException;

public class Servletdemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

第二種:實現這個接口 extends GenericServlet (這種不支持http協議) 這是servlet的實現類,是一個抽象類

import javax.servlet.*;
import java.io.IOException;

public class Servletdemo extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        
    }
}

第三種:extends HttpServlet(使用第三種方式,普遍也使用這個)是GenericServlet的子類,支持http協議,是http協議的封裝,簡化http操作,同樣是抽象類

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
//注意如果使用實體類要進行序列化
public class Servletdemo extends HttpServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }
    
}

在這裏插入圖片描述

配置servlet

Servlet相關配置:
通過:註解的方式
1. urlpartten:Servlet訪問路徑
1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})
2. 路徑定義規則:
1. /xxx:路徑匹配
2. /xxx/xxx:多層路徑,目錄結構
3. *.do:擴展名匹配

通過:web.xml進行配置

* 執行原理:
1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
2. 查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
3. 如果有,則在找到對應的<servlet-class>全類名
4. tomcat會將字節碼文件加載進內存,並且創建其對象
5. 調用其方法
<?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>demo1Servlet</servlet-name>  &lt;!&ndash;&ndash;&gt;
        <servlet-class>com.student.servlet.Demo1Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo1Servlet</servlet-name>
        <url-pattern>/demoOne</url-pattern>&lt;!&ndash;訪問地址:http://localhost:8080/Webproject_day11/demoOne&ndash;&gt;
    </servlet-mapping>-->


    <!--<servlet>
        <servlet-name>demoServlet2</servlet-name>
        <servlet-class>com.student.servlet.Demo2Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demoServlet2</servlet-name>
        <url-pattern>demo</url-pattern>
--------------------------
        <url-pattern>/*</url-pattern>表示所有的請求都會執行這個servlet
--------------------------
        <url-pattern>*.do</url-pattern>只要是.do結尾的都可以訪問這個servlet
----------------------------
        <url-pattern>/abc/*</url-pattern>&lt;!&ndash;表示/abc下的所有訪問的請求都會執行這個servlet
    </servlet-mapping>-->
<!--    servlet3.0以後可以不使用以上方式
在servlet類中使用註解
@WebServlet(name = "demolServlet",urlPatterns = "/tt")
-->
兩種方式都可以配置servlet,但是如果配置了xml會優先使用xml文件的配置,其次纔會使用註解的形式

<!--    設置啓動頁-->
    <welcome-file-list>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>
</web-app>

通過註解進行配置servlet:當servlet3.0以上的時候才能使用

@WebServlet(name = "demolServlet",urlPatterns = "/demolServlet")

public class Demo1Servlet extends HttpServlet {//HttpServlet是GenericServlet的子類
}

關於xml和註解

@WebServlet(name = "demolServlet",urlPatterns = "/demolServlet")
//當時必須在servlet3.0的時候才能使用
//URLpatterns :必須加/,前端請求時action的值不需要加/
//loadOnStartup = 1 值大於0 ,表示立刻加載,
//urlPatterns 表示給外界請求的地址
//name = "demolServlet" 不同的servlet使用不同的name 根據name的值的首字母排序Tomcat先後加載進服務器此時並沒有觸發servlet的init,(name不能相同,否則會出現404找不到地址),loadOnStartup = 1設置優先執行

servlet的生命週期

init() 方法只執行一次

* Servlet什麼時候被創建?
		* 默認情況下,第一次被訪問時,Servlet被創建
		* 可以配置執行Servlet的創建時機。
			* 在<servlet>標籤下配置
				1. 第一次被訪問時,創建
            		* <load-on-startup>的值爲負數
	            2. 在服務器啓動時,創建
	                * <load-on-startup>的值爲0或正整數
* Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
		* 多個用戶同時訪問時,可能存在線程安全問題。
		* 解決:儘量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對修改值

service() 提供服務的方法,所有的請求與響應都會執行這個方法

  * 每次訪問Servlet時,Service方法都會被調用一次

destroy () 銷燬的方法: 隨着tomcat 的關閉而結束

    * Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
	* 只有服務器正常關閉時,纔會執行destroy方法。
	* destroy方法在Servlet被銷燬之前執行,一般用於釋放資源

servlet與tomcat的關係

servlet 是由tomcat 創建 (服務器啓動的時候,就會創建這個servlet),servlet 是依賴於tomcat

//服務器加載servlet,或者說只認識他,對於服務器,靜態資源HTML servse,dao,動態有servlet
//前端代碼,HTML只認識xml或者通過註解讓服務器找到指定的servlet
// 發送請求 ----服務器上的servlet獲取HTML界面數據
//servlet調用 servers層邏輯處理層,使用servlet傳入的數據,發送給dao層操作數據庫處理數據,
//然後dao把數據庫的結果返會servers,再次邏輯處理數據,然後把數據發送給servlet,然後servlet通過xml或者註解把數據渲染
//渲染界面
//tomcat 運行時,會把程序的servlet全部加載進服務器裏面,但是隻有你請求到指定的servlet 的時候纔會觸發servlet的init方法,
// 如果有多個servlet時,可以使用loadOnStartup = 1 值大於0 ,會在程序執行時立刻加載這個servlet

servlet配置(xml或註解)請求的方式(通配符):

 1./* ==>表示所有的請求都會執行這個servlet    

 2. /abc/*   表示 在abc下所有的 路徑都能夠訪問到這個servlet 

 3  *.do 只要是以.do結尾的都可以訪問

javaEE開發常見錯誤404,405原因:

404 表示路徑找不到

405 請求方法不正確 ==>(一般建議doPost調用doGet()方法)

遊覽器如果不設置請求,默認是使用get請求,所以重寫get和POST方法後,使用get調用POST方法,解決不必要的錯誤

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       
        System.out.println("不管是POST還是get方式我都可以處理");
    }

servlet的源碼預覽:

 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

結論:service 還是執行的是get 與post的方法(),所以開發時直接使用doget,dopost方法,不直接使用servlet()

get與post的區別

get方法:

  • get提交的數據可以緩存到瀏覽器
  • get請求保持到歷史記錄,下次還有獲取到這些數據
  • get是明文提交,不安全
  • get 提交是有長度限制
  • 在開發中get一般用於下載

post方法:

  • post 提交的數據不能緩存到瀏覽器
  • post請求保持到歷史記錄,下次還有獲取不到這些數據
  • 提交的數據不是明文提交
  • post 提交是沒有長度顯示
  • 一般在from表單提交的比較多

servlet獲取前端界面的提交的數據

req.getParameter(“uname”); ==> 參數是前端傳遞過來的name值

登錄實現邏輯:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章