文章目錄
- 認識Web開發
- web 開發的架構:B/S,C/S
- B/S 架構請求原理
- B/S架構:url(統一資源定位符)
- 常見的服務器
- Tomcat
- toamct的目錄結構:
- 開啓服務器:
- web 項目與tomcat的整合
- java web三大組件之 :servlet
- servlet的體系結構:
- 實現servlet的3種方式
- 第一種:implements Servlet,實現其Servlet接口
- 第二種:實現這個接口 extends GenericServlet (這種不支持http協議) 這是servlet的實現類,是一個抽象類
- 第三種:extends HttpServlet(使用第三種方式,普遍也使用這個)是GenericServlet的子類,支持http協議,是http協議的封裝,簡化http操作,同樣是抽象類
- 配置servlet
- 關於xml和註解
- servlet的生命週期
- servlet與tomcat的關係
- servlet配置(xml或註解)請求的方式(通配符):
- javaEE開發常見錯誤404,405原因:
- servlet的源碼預覽:
- get與post的區別
- 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> <!––>
<servlet-class>com.student.servlet.Demo1Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1Servlet</servlet-name>
<url-pattern>/demoOne</url-pattern><!–訪問地址:http://localhost:8080/Webproject_day11/demoOne–>
</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><!–表示/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值