国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

這篇具有很好參考價值的文章主要介紹了JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1. 基礎(chǔ)概念

1.1 BS架構(gòu)和CS架構(gòu)

1.2 Tomcat圖解

2.TomCat

2.1 IDEA配置web項目和tomcat

2.2?idea啟動TomCat因為端口號失敗的問題

3.Servlet使用流程

3.1 Servlet簡單圖解

3.2 Servlet導(dǎo)入依賴

?3.3 編寫Servlet和add.html

3.4 試著使用Jdbc和Dao層連接水果庫存數(shù)據(jù)庫

0. 基礎(chǔ)結(jié)構(gòu)的代碼

1. 數(shù)據(jù)庫表創(chuàng)建

2. 根據(jù)水果javabean和JDBC寫出FruitDaoJDBC

3. 重寫此時servlets下的AddServlet

4.Servlet細節(jié)知識點

4.1 Servlet設(shè)置編碼字符集

4.2 Servlet繼承關(guān)系

1. 繼承關(guān)系

2. 相關(guān)方法

4.3?Servlet生命周期

1.生命周期

2. 默認情況

3. Servlet初始化時機

4. Servlet在容器中是單例的,是線程不安全的

4.4 HTTP協(xié)議

1. HTTP基礎(chǔ)概念

2. 請求報文

3. 響應(yīng)報文

4.5 會話

1.Http是無狀態(tài)的

??2. 會話跟蹤技術(shù)

3. session保存作用域

4.6 服務(wù)器內(nèi)部轉(zhuǎn)發(fā)以及客戶端重定向

1. 服務(wù)器內(nèi)部轉(zhuǎn)發(fā)?編輯?

2. 客戶端重定向

4.7 Thymeleaf視圖技術(shù)

1. thymeleaf的部分標簽

4.8 保存作用域

1. request:一次請求響應(yīng)范圍

2. session:一次會話范圍有效

3. application: 一次應(yīng)用程序范圍有效

4. 補充:相對路徑和絕對路徑?

4.9 水果管理系統(tǒng)項目(更新功能)

4.10 水果管理系統(tǒng)項目(刪除功能)

4.11 水果管理系統(tǒng)項目(增加功能)?

4.12 水果管理系統(tǒng)項目(分頁功能)?

4.13 水果管理系統(tǒng)項目(關(guān)鍵字查詢功能)?


1. 基礎(chǔ)概念

1.1 BS架構(gòu)和CS架構(gòu)

CS:客戶端服務(wù)器架構(gòu)模式

優(yōu)點︰充分利用客戶端機器的資源,減輕服務(wù)器的負荷

(一部分安全要求不高的計算任務(wù)存儲任務(wù)放在客戶端執(zhí)行,不需要把所有的計算和存儲都在服務(wù)器端執(zhí)行,從而能夠減輕服務(wù)器的壓力,也能夠減輕網(wǎng)絡(luò)負荷)

缺點∶需要安裝;升級維護成本較高

BS∶瀏覽器服務(wù)器架構(gòu)模式

優(yōu)點︰客戶端不需要安裝;維護成本較低

缺點∶所有的計算和存儲任務(wù)都是放在服務(wù)器端的,服務(wù)器的負荷較重﹔在服務(wù)端計算完成之后把結(jié)果再傳輸給客戶端,因此客戶端和服務(wù)器端會進行非常頻繁的數(shù)據(jù)通信,從而網(wǎng)絡(luò)負荷較重

1.2 Tomcat圖解

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

2.TomCat

2.1 IDEA配置web項目和tomcat

創(chuàng)建一個java項目之后,右鍵項目文件夾,選擇添加框架支持,然后選擇javaee中的web即可添加web項目

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

在IDAE右上方選擇編輯配置

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

點擊加入工件,然后加入

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

服務(wù)器這里填寫tomcat的根目錄

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

2.2?idea啟動TomCat因為端口號失敗的問題

1099被占用,可以進入cmd控制臺,然后進行搜索被占用的進程,然后將它關(guān)閉

netstat -aon | find "1099"

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

tasklist | find "5680"

在任務(wù)管理器中找到對應(yīng)的這個進程然后關(guān)閉。?

但是有可能出現(xiàn)搜索占用1099端口號但并沒有任何進程占用的情況,這種時候,可以進行關(guān)閉hyper-v然后重啟電腦并重新打開

1. 關(guān)閉hyper-v 它會詢問是否立即重啟,必須進行重啟

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

2. 排除ipv4動態(tài)端口占用 startport 起始端口 numberofports 端口數(shù)

netsh int ipv4 add excludedportrange protocol=tcp startport=1099 numberofports=1

3.?啟動hyper-v后重啟電腦

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

3.Servlet使用流程

3.1 Servlet簡單圖解

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

3.2 Servlet導(dǎo)入依賴

我們使用AddServlet去承接add操作,需要繼承自HttpServlet包,但是這個包在tomcat下,需要我們在idea的項目結(jié)構(gòu)里面導(dǎo)入tomcat依賴

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

?3.3 編寫Servlet和add.html

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

我們需要完成一個,用戶通過tomcat服務(wù)器訪問add.html,通過add.html下的表單,輸入對應(yīng)的信息,這個操作在表單的聲明中action = add,當我們提交表單信息的時候,服務(wù)器收取到這個post請求,通過servlet的mapping找到對應(yīng)action=add映射的servlet映射名稱對應(yīng)同名的servlet,然后找到它所聲明類的絕對路徑,通過這個路徑下的類中重寫父類HttpServket的doPost方法,將用戶Post請求下的要求按照我們所寫的方法進行操作

1. 用戶發(fā)請求,action=add
2. 項目中,web.xml中找到url-pattern = /add? -----> 第12行
3. 找第11行的servlet-name = AddServlet
4. 找和servlet-mapping中servlet-name一致的servlet 找到第7行
5. 找第八行的servlet-class -> com.fanxy.servlets.AddServlet
6. 用戶發(fā)送的是post請求(method = post) 因此tomcat會執(zhí)行AddServlet中的doPost方法

add.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="add" method="post">
    <label for="fname">名稱:</label>
    <input type="text" name="fname" id="fname" required><br>

    <label for="price">價格:</label>
    <input type="text" name="price" id="price" required><br>

    <label for="fcount">庫存:</label>
    <input type="text" name="fcount" id="fcount" required><br>

    <label for="remark">備注:</label>
    <input type="text" name="remark" id="remark" required><br>

    <input type="submit" value="添加">
</form>
</body>
</html>

com.fanxy.servlets.AddServlet類

public class AddServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String fname = request.getParameter("fname");
        Integer price = Integer.parseInt(request.getParameter("price"));
        Integer fcount = Integer.parseInt(request.getParameter("fcount"));
        String remark = request.getParameter("remark");

        System.out.println("fname = "+ fname);
        System.out.println("price = "+ price);
        System.out.println("fcount = "+ fcount);
        System.out.println("remark = "+ remark);
    }
}

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-name>AddServlet</servlet-name>
        <servlet-class>com.fanxy.servlets.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AddServlet</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>
</web-app>

3.4 試著使用Jdbc和Dao層連接水果庫存數(shù)據(jù)庫

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

如果想中途想導(dǎo)入包,需要刪除out下的artifacts和production下的子文件夾,然后導(dǎo)入到項目外部的包,然后在項目結(jié)構(gòu)里面的problem的fix中添加入web項目

0. 基礎(chǔ)結(jié)構(gòu)的代碼

Fruit的javabean

public class Fruit {
    private Integer fid ;
    private String fname ;
    private Integer price ;
    private Integer fcount ;
    private String remark ;

    public Fruit(){}

    public Fruit(Integer fid, String fname, Integer price, Integer fcount, String remark) {
        this.fid = fid;
        this.fname = fname;
        this.price = price;
        this.fcount = fcount;
        this.remark = remark;
    }


    public Integer getFid() {
        return fid;
    }

    public void setFid(Integer fid) {
        this.fid = fid;
    }

    public String getFname() {
        return fname;
    }

    public void setFname(String fname) {
        this.fname = fname;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public Integer getFcount() {
        return fcount;
    }

    public void setFcount(Integer fcount) {
        this.fcount = fcount;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return fid + "\t\t" + fname + "\t\t" + price +"\t\t" + fcount +"\t\t" + remark ;
    }
}

FruitDAO的抽象接口

public interface FruitDAO {
    //查詢庫存列表
    List<Fruit> getFruitList() throws Exception;

    //新增庫存
    boolean addFruit(Fruit fruit) throws SQLException;

    //修改庫存
    boolean updateFruit(Fruit fruit) throws SQLException;

    //根據(jù)名稱查詢特定庫存
    Fruit getFruitByFname(String fname) throws Exception;

    //刪除特定庫存記錄
    boolean delFruit(String fname) throws SQLException;
}

1. 數(shù)據(jù)庫表創(chuàng)建

CREATE DATABASE fruitdb charset utf8;
USE fruitdb ;
CREATE TABLE `t_fruit` (
  `fid` int(11) NOT NULL AUTO_INCREMENT,
  `fname` varchar(20) NOT NULL,
  `price` int(11) DEFAULT NULL,
  `fcount` int(11) DEFAULT NULL,
  `remark` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`fid`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;

insert  into `t_fruit`(`fid`,`fname`,`price`,`fcount`,`remark`)
values
(1,'紅富士',5,16,'紅富士也是蘋果!'),
(2,'大瓜',5,100,'王校長的瓜真香'),
(3,'南瓜',4,456,'水果真好吃'),
(4,'苦瓜',5,55,'苦瓜很好吃'),
(5,'蓮霧',9,99,'蓮霧是一種神奇的水果'),
(6,'羊角蜜',4,30,'羊角蜜是一種神奇的瓜'),
(7,'啃大瓜',13,123,'孤瓜');

2. 根據(jù)水果javabean和JDBC寫出FruitDao
JDBC數(shù)據(jù)庫連接技術(shù)學(xué)習(xí)筆記https://blog.csdn.net/weixin_44981126/article/details/130424791

public class FruitDao extends BaseDao implements FruitDAO {

    @Override
    public List<Fruit> getFruitList() throws Exception {
        List<Fruit> fruits = executeQuery(Fruit.class, "select * from t_fruit;");
        return fruits;
    }

    @Override
    public boolean addFruit(Fruit fruit) throws SQLException {
        String sql = "INSERT INTO t_fruit(fid, fname, price, fcount, remark) values(0, ?, ?, ?, ?);";
        int count = executeUpdate(sql, fruit.getFname(), fruit.getPrice(),
                fruit.getFcount(), fruit.getRemark());
        return count > 0;
    }

    @Override
    public boolean updateFruit(Fruit fruit) throws SQLException {
        String sql = "UPDATE t_fruit SET fcount = ? WHERE fid = ?;";
        int count = executeUpdate(sql, fruit.getFcount(), fruit.getFid());
        return count > 0;
    }

    @Override
    public Fruit getFruitByFname(String fname) throws Exception {
        String sql = "SELECT * FROM t_fruit WHERE fname = ?";
        List<Fruit> fruits = executeQuery(Fruit.class, sql, fname);
        if(fruits != null && fruits.size() > 0) {
            return fruits.get(0);
        }
        return null;
    }

    @Override
    public boolean delFruit(String fname) throws SQLException {
        String sql = "DELETE FROM t_fruit WHERE fname LIKE ? ;";
        int count = executeUpdate(sql, fname);
        return count > 0;
    }
}

3. 重寫此時servlets下的AddServlet

public class AddServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {

        request.setCharacterEncoding("UTF-8");
        String fname = request.getParameter("fname");
        Integer price = Integer.parseInt(request.getParameter("price"));
        Integer fcount = Integer.parseInt(request.getParameter("fcount"));
        String remark = request.getParameter("remark");

        FruitDao fruitDao = new FruitDao();
        boolean flag = false;
        try {
            flag = fruitDao.addFruit(new Fruit(1, fname, price, fcount, remark));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        System.out.println(flag ? "添加成功!" : "添加失敗!");
    }
}

1. 新建項目 - 新建模塊
2. 在模塊中添加web
3. 創(chuàng)建artifact - 部署包
4. lib - artifact
? ?先有artifact,后來才添加的mysql.jar。此時,這個jar包并沒有添加到部署包中
? ?那么在projectSettings中有一個Problems中會有提示的,我們點擊fix選擇add to...
? ?另外,我們也可以直接把lib文件夾直接新建在WEB-INF下。
? ?這樣不好的地方是這個lib只能是當前這個moudle獨享。如果有第二個moudle我們需要再次重復(fù)的新建lib。
5. 在部署的時候,修改application Context。然后再回到server選項卡,檢查URL的值。
? ?URL的值指的是tomcat啟動完成后自動打開你指定的瀏覽器,然后默認訪問的網(wǎng)址。
? ?啟動后,報錯404.404意味著找不到指定的資源。
? ?如果我們的網(wǎng)址是:http://localhost:8080/pro01/ , 那么表明我們訪問的是index.html.
? ?我們可以通過<welcome-file-list>標簽進行設(shè)置歡迎頁(在tomcat的web.xml中設(shè)置,或者在自己項目的web.xml中設(shè)置)
6. 405問題。當前請求的方法不支持。比如,我們表單method=post , 那么Servlet必須對應(yīng)doPost。否則報405錯誤。
7. 空指針或者是NumberFormatException 。因為有價格和庫存。如果價格取不到,結(jié)果你想對null進行Integer.parseInt()就會報錯。錯誤的原因大部分是因為 name="price"此處寫錯了,結(jié)果在Servlet端還是使用request.getParameter("price")去獲取。
8. <url-pattern>中以斜杠開頭

4.Servlet細節(jié)知識點

4.1 Servlet設(shè)置編碼字符集

POST提交方式:在繼承HttpServlet的類中接受request的信息之前,先進行如下設(shè)置

request.setCharacterEncoding("UTF-8");

get提交方式,tomcat8之前設(shè)置比較麻煩, tomcat8之后無需設(shè)置:

String fname = request.getParameter("fname");
byte[] = bytes = fname.getBytes("iso-8859-1");
fname = new String(bytes, "UTF-8");

4.2 Servlet繼承關(guān)系

1. 繼承關(guān)系

javax.servlet.Servlet 接口

|----------javax.servlet.GenericServlet 抽象類

? ? ? ? ? ? ? ? |----------javax.servlet.http.HttpServlet 抽象類

2. 相關(guān)方法

javax.servlet.Servlet 接口:

? ? ?|---1. void init(config) - 初始化方法

? ? ?|---2. void service(request, response) - 服務(wù)方法 抽象的

? ? ?|---3. void destory() -?銷毀方法

?????javax.servlet.GenericServlet 抽象類

? ? ? ? ? ?|---1. void service(request, response) - 仍然是抽象的

? ? ? ?javax.servlet.http.HttpServlet 抽象類

? ? ? ? ? ? ?|---1. void service(request, response) - 不是抽象的,當有請求過來的時候,service方

?????????????|? ? 法會自動響應(yīng)(其實是tomcat容器調(diào)用的)在HttpSrvlet中我們會去分析請求的方

?????????????|? ? 式:到底是get,post,head還是delete等等? 然后決定調(diào)用哪個do開頭的方法,

? ? ? ? ? ? ?|? ? 那么在HttpServlet中這些do方法默認都是405的實現(xiàn)風(fēng)格-要我們子類去實現(xiàn)對應(yīng)

?????????????|? ? 的方法,否則默認會報405錯誤,因此我們新建Servlet時,我們才會考慮請求方法? ? ???

? ? ? ? ? ? ? ? ?|----1.1 String method = req.getMethod() - 獲得請求的方式

? ? ? ? ? ? ? ? ?|----1.2?各種 if 判斷,根據(jù)請求方式的不同,決定調(diào)哪個do方法

? ? ? ? ? ? ? ? ?|----1.3?在HttpServlet這個抽象類中,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")) {
    this.doPut(req, resp);
}

4.3?Servlet生命周期

1.生命周期:

從出生到死亡的過程就是生命周期,對應(yīng)Servlet的三個方法:init(),service(),destroy()?

2. 默認情況:

第一次接收到請求的時候,這個Servlet會進行實例化(調(diào)用構(gòu)造方法),初始化(調(diào)用init( )),然后服務(wù)(調(diào)用service( )

通過案例我們發(fā)現(xiàn):Servlet實例tomcat只會創(chuàng)建一個,所有的請求都是這個實例去響應(yīng),默認情況下,第一次請求時,tomcat才會去實例化(通過反射創(chuàng)建),初始化,然后再服務(wù)

好處:提高系統(tǒng)啟動速度

壞處:第一次啟動時耗時太長

如果應(yīng)該提高系統(tǒng)啟動速度應(yīng)該按此方法設(shè)置,當前默認情況就是這樣。如果要提高響應(yīng)速度,應(yīng)該設(shè)置Servlet初始化時機

3. Servlet初始化時機

默認第一次接受請求時實例化,初始化

我們也可以通過<load-on-startup>來設(shè)置servlet啟動的先后順序,數(shù)字越小啟動越靠前,最小為0

4. Servlet在容器中是單例的,是線程不安全的

單例:所有的請求都是同一個實例去響應(yīng)

線程不安全:一個線程需要根據(jù)這個實例中的某個成員變量值做邏輯判斷,但是在中間某個時機,另一個線程改變了這個值,導(dǎo)致前面的線程會進行錯誤的行為

啟發(fā):盡量不要在Servlet中定義成員變量,如果不得不定義成員變量

1. 不要修改成員變量的值

2. 不要根據(jù)成員變量的值進行邏輯判斷

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

4.4 HTTP協(xié)議

HTTP詳細筆記https://heavy_code_industry.gitee.io/code_heavy_industry/pro001-javaweb/note/note004-HTTP.html

1. HTTP基礎(chǔ)概念

HTTP:Hyper?Text?Transfer?Protocol超文本傳輸協(xié)議。HTTP最大的作用就是確定了請求和響應(yīng)數(shù)據(jù)的格式。瀏覽器發(fā)送給服務(wù)器的數(shù)據(jù):請求報文;服務(wù)器返回給瀏覽器的數(shù)據(jù):響應(yīng)報文。

HTTP是無狀態(tài)的,請求響應(yīng)包含兩個部分:請求和響應(yīng)

2. 請求報文

請求包含三個部分:

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

1.請求行 (一般包含:1.請求的方式 2.請求的URL 3.請求的協(xié)議,一般都是HTTP1.1)

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

2.請求消息頭(包含了客戶端告訴瀏覽器的信息,比如:瀏覽器型號,版本,能接受內(nèi)容的類型,給你發(fā)的內(nèi)容的類型,內(nèi)容的長度等等)

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

3. 請求體

三種情況:

get方式,沒有請求體,但有queryString

post方式,有請求體,form data

json格式,有請求體,request payload

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

3. 響應(yīng)報文

響應(yīng)也包含三個部分:

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

1.響應(yīng)狀態(tài)行 (一般包含:1.響應(yīng)的協(xié)議,一般都是HTTP1.1 2.響應(yīng)狀態(tài)碼 3.響應(yīng)狀態(tài))?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

2.響應(yīng)消息頭(包含了服務(wù)器告訴客戶端的信息,比如:內(nèi)容的媒體類型,編碼,內(nèi)容的長度等等)

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

3. 響應(yīng)體?

服務(wù)器返回的數(shù)據(jù)主體,有可能是各種數(shù)據(jù)類型。

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

4.5 會話

1.Http是無狀態(tài)的

1. HTTP 無狀態(tài) :服務(wù)器無法判斷這兩次請求是同一個客戶端發(fā)過來的,還是不同的客戶端發(fā)過來的
2. 無狀態(tài)帶來的現(xiàn)實問題:第一次請求是添加商品到購物車,第二次請求是結(jié)賬;如果這兩次請求服務(wù)器無法區(qū)分是同一個用戶的,那么就會導(dǎo)致混亂
3. 通過會話跟蹤技術(shù)來解決無狀態(tài)的問題

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?2. 會話跟蹤技術(shù)

1. 客戶端第一次發(fā)請求給服務(wù)器,服務(wù)器獲取session,獲取不到,則創(chuàng)建新的,然后響應(yīng)給客戶端
2. 下次客戶端給服務(wù)器發(fā)請求時,會把sessionID帶給服務(wù)器,那么服務(wù)器就能獲取到了,那么服務(wù)器就判斷這一次請求和上次某次請求是同一個客戶端,從而能夠區(qū)分開客戶端

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

3. 常用的API:
? ? ? ? ? request.getSession() -> 獲取當前的會話,沒有則創(chuàng)建一個新的會話
? ? ? ? ? request.getSession(true) -> 效果和不帶參數(shù)相同
? ? ? ? ? request.getSession(false) -> 獲取當前會話,沒有則返回null,不會創(chuàng)建新的

? ? ? ? ? session.getId() -> 獲取sessionID
? ? ? ? ? session.isNew() -> 判斷當前session是否是新的
? ? ? ? ? session.getMaxInactiveInterval() -> 返回session的非激活間隔時長,默認1800秒
? ? ? ? ? session.setMaxInactiveInterval()?-> 設(shè)置session的非激活間隔時長,默認1800秒
? ? ? ? ? session.invalidate() -> 強制性讓會話立即失效

? ? ? ? ? ....

3. session保存作用域

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》??1.session保存作用域是和具體的某一個session對應(yīng)的
? ? ? 2. 常用的API:
? ? ? ? void session.setAttribute(key, value)?-> 向當前session保存作用域保存一個對應(yīng)key為value的數(shù)據(jù)
? ? ? ? Object session.getAttribute(key)?-> 獲取當前session中key對應(yīng)的value值
? ? ? ? void removeAttribute(key)?-> 刪除當前session中key對應(yīng)的value值

4.6 服務(wù)器內(nèi)部轉(zhuǎn)發(fā)以及客戶端重定向

1. 服務(wù)器內(nèi)部轉(zhuǎn)發(fā)JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

request.getRequestDispatcher("...").forward(request,response);

- 一次請求響應(yīng)的過程,對于客戶端而言,內(nèi)部經(jīng)過了多少次轉(zhuǎn)發(fā),客戶端是不知道的
- 地址欄沒有變化

2. 客戶端重定向

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

response.sendRedirect("....");

- 兩次請求響應(yīng)的過程。客戶端肯定知道請求URL有變化
- 地址欄有變化 302重定向

4.7 Thymeleaf視圖技術(shù)

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

這里和前面的webmoudule1類似,使用水果數(shù)據(jù)庫,使用尚硅谷jdbcUtilsV2和BaoseDao重寫FruitDao,然后引入一些簡單的css,imgs和index.html文件。同時添加thymeleaf的jar包到庫中,并添加到組件。

Thymeleaf詳細筆記https://heavy_code_industry.gitee.io/code_heavy_industry/pro001-javaweb/note/note006-Thymeleaf.html

1. thymeleaf的部分標簽

1) 使用步驟: 添加thymeleaf的jar包

2) 新建一個Servlet類ViewBaseServlet (從上面的鏈接復(fù)制)

新建ViewBaseServlet(有兩個方法)

3) 在web.xml添加配置(從上面的鏈接復(fù)制)

配置兩個<context-param> : view-prefix , view-suffix

這里 / 代表web根目錄

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

4) 使得我們的Servlet繼承ViewBaseServlet

//Servlet從3.0版本支持注解方式的注冊
@WebServlet("/index")
public class IndexServlet extends ViewBaseServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        FruitDao fruitDao = new FruitDao();
        List<Fruit> fruitList = fruitDao.getFruitList();
        HttpSession session = req.getSession();
        session.setAttribute("fruitList", fruitList);
        //此處的視圖名稱是  index
        //那么thymeleaf會將這個 邏輯視圖名稱 對應(yīng)到 物理視圖 名稱上
        //邏輯視圖名稱 : index
        //物理視圖名稱 : view-prefix + 邏輯視圖名稱 + view-suffix
        //真實的視圖名稱是:    /        index     .html
        super.processTemplate("index", req, resp);
    }
}

運用thymeleaf中的部分標簽: <th:if> , <th:unless> , <th:each> , <th:text>重寫index.html文件,即可完成把Servlet中通過session會話獲取到的數(shù)據(jù)庫數(shù)據(jù)存放的fruitlist,然后我們的Servlet寫了存儲作用域的句子,把它放入session作用域,我們html寫入mxlns:th:http://www.thymeleaf.org的html下,寫thymeleaf語法標簽即可

<html xmlns:th="http://www.thymeleaf.org">
	<head>
		<meta charset="utf-8">
		<link rel="stylesheet" href="css/index.css">
	</head>
	<body>
		<div id="div_container">
			<div id="div_fruit_list">
				<table id="tbl_fruit">
					<tr>
						<th class="w20">名稱</th>
						<th class="w20">單價</th>
						<th class="w20">庫存</th>
						<th>操作</th>
					</tr>
					<tr th:if="${#lists.isEmpty(session.fruitList)}">
						<td colspan="4">對不起,庫存為空</td>
					</tr>
					<tr th:unless="${#lists.isEmpty(session.fruitList)}" th:each="fruit : ${session.fruitList}">
						<td th:text="${fruit.fname}">蘋果</td>
						<td th:text="${fruit.price}">5</td>
						<td th:text="${fruit.fcount}">20</td>
						<td><img src="imgs/del.jpg" class="delImg"/></td>
					</tr>
				</table>
			</div>
		</div>
	</body>
</html>

4.8 保存作用域

原始情況下,保存作用域我們可以認為有四個: page(頁面級別,現(xiàn)在幾乎不用) , request(一次請求響應(yīng)范圍) , session(一次會話范圍) , application(整個應(yīng)用程序范圍)

1. request:一次請求響應(yīng)范圍

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

這里使用demo01和demo02進行request保存作用域的判定,發(fā)現(xiàn)同一個request保存作用域在當前request下有效??蛻舳酥囟ㄏ蛞驗榘l(fā)起了新的request導(dǎo)致無法取到之前保存的數(shù)據(jù),而服務(wù)端內(nèi)部轉(zhuǎn)發(fā),因為沒有產(chǎn)生新的request,所以可以取到,但是客戶端以為保存在demo01下,其實保存在demo02下,服務(wù)器內(nèi)部幫助完成了轉(zhuǎn)發(fā)任務(wù)

2. session:一次會話范圍有效

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?使用session進行作用域的保存,可以發(fā)現(xiàn)無論是重定向還是服務(wù)器內(nèi)部轉(zhuǎn)發(fā)都可以獲取到,只要是用一個session內(nèi)即可?

3. application: 一次應(yīng)用程序范圍有效

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?即便不同的瀏覽器訪問demo05都可以獲得作用域保存的數(shù)據(jù)?

4. 補充:相對路徑和絕對路徑?

從根目錄一直寫到文件的路徑寫法是絕對路徑,從當前文件為目錄起點,利用 .. / 寫的路徑是相對路徑。

<base href="http://localhost:8080/pro10/" /> 的作用是:當前頁面上的所有路徑都以此路徑為基礎(chǔ),默認寫別的絕對路徑,可以從這個路徑下來當作絕對路徑的起點

在thymeleaf中,th:href="@{}" 和上面的base設(shè)置相同

例如可以: <link th:href="@{/css/shopping.css}">

4.9 水果管理系統(tǒng)項目(更新功能)

加入鏈接編輯Servlet,給水果加入鏈接,點水果名稱跳轉(zhuǎn)到edit.do的Servlet下,完成數(shù)據(jù)編輯,但是直接加超鏈接會因為thymeleaf的標簽覆蓋,導(dǎo)致里面的超鏈接被覆蓋我們寫的thymeleaf的數(shù)據(jù),所以我們只需要把thymeleaf的表達式放到超鏈接就行

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?為了使得我們對網(wǎng)頁的相應(yīng)水果進行操作,我們實際情況下會在鏈接中填入 ?fid=xxx

為了使得我們填入對應(yīng)信息可以選擇相對應(yīng)的水果,需要給html的水果欄的href修改參數(shù),但thymeleaf無法判斷字符串和參數(shù),根據(jù)thymeleaf語法需要修改為:

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

但是我們參數(shù)數(shù)量多的情況下,這樣比較繁瑣,可以按語法如下寫(不寫問號,用小括號加鍵值對的書寫來進行,如果參數(shù)不止一個,只需要用逗號作為分隔符,填入新的鍵值對):

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

為了使用到fid我們需要進行字符串判斷

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

因為我們經(jīng)常要進行這樣的判斷,這個方法不如封裝到utils下作為StringUtil??

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

同時為了Dao層的FruitDao能根據(jù)fid查詢到對應(yīng)的水果信息,我們可以給基礎(chǔ)的FruitDAO接口加入一個抽象的getFruitById方法,然后在繼承BaseDao和實現(xiàn)FruitDAO接口的FruitDao重寫父接口的這個方法,完成Dao層方法的封裝?

?JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》??此時我們的EditServlet方法寫為,我們渲染到edit頁面,所以我們需要重寫一個edit.html的頁面

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》??這里按thymeleaf的語法,把request作用域保存的fruit的信息放入我們編輯頁面的文本框中

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》??此時效果圖如下

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?但是每個屬性都需要加fruit前綴,很冗余,我們只需要在祖先節(jié)點使用thymeleaf語法寫入th:object="${fruit}",那么我們所有的后代節(jié)點只需要寫th:value="*{屬性值}"即可用*代表祖先節(jié)點聲明的變量

同時我們需要把這個輸入的內(nèi)容存儲到一個表單,以更新的方式進行修改我們的數(shù)據(jù),所以我們把table寫入一個表單中,action為 post

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

此時只需要重寫update.do對應(yīng)的Servlet類?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?但我們查詢數(shù)據(jù)應(yīng)該是按主鍵查詢會快,但是主鍵此時沒查,我們可以查詢,但是沒必要給用戶看到主鍵或者修改主鍵,所以我們可以在edit.html中寫入查詢主鍵的input,但是使用type為hidden,這個時候用戶端就不會顯式的呈現(xiàn)這一個輸入框,但是我們從后臺拿到了主鍵fid,同時這里可以把th:object寫到form中,還可以使用th:value="*{屬性值}",如果不移動,就只能通過${}的書寫方式

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》??然后重寫FruitDao的更新方法,使用在upDateServlet中的FruitDao的private實例對象,調(diào)用它這個方法,把我們從edit.html發(fā)送過來的表單數(shù)據(jù)提取并更新到數(shù)據(jù)庫中

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

?但是此時還是有問題的,我們修改數(shù)據(jù)發(fā)現(xiàn),頁面的數(shù)據(jù)沒有變化,但是查看數(shù)據(jù)庫,發(fā)現(xiàn)數(shù)據(jù)庫的數(shù)據(jù)已經(jīng)修改了,這是為什么呢?其實processTemplate的作用相當于服務(wù)器重定向,這個時候獲取的數(shù)據(jù)還是Session的數(shù)據(jù),此時的Session的數(shù)據(jù)還是之前查到的數(shù)據(jù),沒有把更新的數(shù)據(jù)放入

super.processTemplate("index", req, resp);

?我們?yōu)榱四軌虿榈叫碌男畔?,可以使用客戶端重定向,讓客戶端發(fā)一個新的請求給IndexServlet,重新獲取fruitList,然后覆蓋到Session中,這樣就可以顯示新的數(shù)據(jù)了。

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?

4.10 水果管理系統(tǒng)項目(刪除功能)

首先想要實現(xiàn)點擊右側(cè)刪除圖標的數(shù)據(jù)庫數(shù)據(jù)刪除功能

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

改寫index.html的img部分,加入thymeleaf表達式,調(diào)用一會要給Dao層添加的delFruit方法?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

但是字符串拼接的方式可讀性差,其實根據(jù)thymeleaf語法可以使用 | 單豎線去括起來,這樣未有${}包裹的部分就會被識別為字符串

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?瀏覽器控制臺可以看到已經(jīng)做到了提取對應(yīng)的id,因為我們之前寫了隱藏域提取到對應(yīng)fruit的fid

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

但這個js函數(shù)我們還沒寫,所以補上路徑并在對應(yīng)位置寫js方法?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

顯然我們應(yīng)該再補充寫上對應(yīng)操作的Servlet:del.do,這里可能會疑惑為什么不像之前一樣在onclick之后直接寫對應(yīng)的servlet,非要寫一個js,這是因為需要給客戶一個彈窗,這個是前端的層面,后端無法做到這樣的操作

在此之前我們先在FruitDAO抽象接口寫一個根據(jù)Fid刪除記錄的抽象方法,讓繼承于BaseDao實現(xiàn)這個接口的我們自己寫的FruitDao重寫相應(yīng)的方法即可

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

下為FruitDao(我們自己寫的)?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》這里我們需要在DelServlet類重寫doGet方法,這里記住,除了表單的request是Post,其他的操作一般都是Get請求,有了前面的經(jīng)驗,我們這里也使用客戶端重定向讓客戶端查詢到最新的數(shù)據(jù)庫數(shù)據(jù),而不是之前Session作用域的內(nèi)容?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?為了防止未在artifacts里面構(gòu)建js文件夾,可以刪除再重啟項目,或者點上面的工具錘?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》此時就可以完成刪除操作

4.11 水果管理系統(tǒng)項目(增加功能)?

首先我們需要在我們的index.html下添加一個超鏈接,讓我們能夠點擊跳轉(zhuǎn)到add.html下,完成加入的操作

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

這里add的操作類似我們的edit頁面,可以復(fù)制重命名后進行修改?

<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="css/add.css">
</head>
<body>
<div id="div_container">
    <div id="div_fruit_list">
        <p class="center f30">增加水果庫存信息</p>
        <form th:action="@{/add.do}" method="post">
            <table id="tbl_fruit" th:object="${fruit}">
                <tr>
                    <th class="w20">名稱:</th>
                    <!--                <td><input type="text" name="fname" th:value="${fruit.fname}"/></td>-->
                    <td><input type="text" name="fname"/></td>
                </tr>
                <tr>
                    <th class="w20">單價:</th>
                    <td><input type="text" name="price" /></td>
                </tr>
                <tr>
                    <th class="w20">庫存:</th>
                    <td><input type="text" name="fcount"/></td>
                </tr>
                <tr>
                    <th class="w20">備注:</th>
                    <td><input type="text" name="remark"/></td>
                </tr>
                <tr>
                    <th colspan="2">
                        <input type="submit" value="添加">
                    </th>
                </tr>
            </table>
        </form>
    </div>
</div>
</body>
</html>

顯然我們應(yīng)該給這個表單發(fā)送的目標Servlet add.do寫一個類AddServlet來實現(xiàn)添加的功能,這個功能顯然也應(yīng)該操作Dao層去對數(shù)據(jù)庫進行操作,所以我們按類似上面的操作,給FruitDao中寫入這個方法

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》類AddServlet(add.do)實現(xiàn)添加的功能

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

此時出了bug,輸入添加的數(shù)據(jù),首先沒有跳轉(zhuǎn)回index頁面,同時數(shù)據(jù)庫也沒有添加,仔細看前面的add.html,我們在表單中使用了th:action="@{/add.do}

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

但是我們最初訪問的index頁面的超鏈接,直接訪問的add.html靜態(tài)頁面,所以根本沒有進入addServlt,也就自然我們的操作僅僅是給服務(wù)器發(fā)送數(shù)據(jù),但是也不會添加,還保留在原來的頁面,因為thymeleaf語法是必須經(jīng)過super.processTemplet()渲染的。靜態(tài)頁面它無法識別我們寫的th代碼是什么意思,也就無法進入我們的addServlet

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?所以我們應(yīng)該把本身的add.html的action直接改為add.do

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

為什么我們之前編輯操作就可以?因為編輯操作我們是直接進入的EditServlet

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?而Servlet中已經(jīng)使用thymeleaf渲染過了

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》為什么我們之前刪除操作也可以?因為刪除操作我們通過index的Servlet下渲染的index.html頁面下的thymeleaf進入js函數(shù),通過函數(shù)使得我們跳轉(zhuǎn)到del.do的Servlet下,然后借助這個Servlet下寫了的渲染函數(shù)完成了操作,然后提交的表單完成了數(shù)據(jù)庫操作

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

至此,添加功能也完成了?

4.12 水果管理系統(tǒng)項目(分頁功能)?

想要完成每頁顯示五條數(shù)據(jù)的分頁,所以我們的最頂層接口應(yīng)該添加一個重載的,查詢指定頁碼的方法

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

同時在子類FruitDao中實現(xiàn)它?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

此時index的Servlet下我們就可以填入?yún)?shù),讓我們顯示頁數(shù)了,默認填入1,訪問第一頁的數(shù)據(jù)?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》然后我們需要加入換頁的功能,在index.html的table下,加入四個按鈕完成未來要完成的操作

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》為了完成我們按鈕的功能,首先我們需要在index的Servlet下獲取當前頁碼,并可以進行頁碼的轉(zhuǎn)化,同時為了讓我們會話過程中,能夠保持相同頁碼,我們把頁碼放入session作用域

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

然后稍微補充一下我們之前的按鈕,我們可以把當前頁碼傳入一個js方法,實現(xiàn)到達指定的頁碼JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》此時可以完成基本的頁碼上下頁和首頁,但是到-1頁會報錯,數(shù)據(jù)庫越界,到后面沒有內(nèi)容的頁碼會顯示沒有數(shù)據(jù),這顯然需要加入合法性的驗證

我們先實現(xiàn)尾頁的操作,需要我們加入一個Dao層的方法,返回當前有多少條記錄

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

然后我們在index的Servlet下需要查詢到總頁數(shù),傳入session,方便我們調(diào)用,同時為了計算總頁數(shù),我們應(yīng)該理解應(yīng)該向上取整去除每頁的規(guī)定頁數(shù),所以可以加入一個4的偏移量,完成向上取整的操作

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

此時徹底完成了尾頁跳轉(zhuǎn)

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

但是此時其實會報錯500,因為我們最初封裝的JDBCUtilsV2是用反射的方式把搜索到的字段賦值給我們javabean寫的屬性,然后以類的形式存儲在List中,這里我們沒法調(diào)用Object的內(nèi)部屬性值,因為是私有的,并且我們也不知道獲取的Count(*)是什么類型(其實是Long)

這里老師用的Jdbc和我的不同,所以我在javabean中封裝了一個類專門用來承接這個Long屬性的值,然后再提取出來進行return

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

FruitDao類,查詢方法

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》?換頁的非法判斷,通過thymeleaf的頁數(shù)判斷和按鈕的disable屬性

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》至此,正式完成了換頁和分頁的功能?

4.13 水果管理系統(tǒng)項目(關(guān)鍵字查詢功能)?

首先在index.html下加入表單,完成基礎(chǔ)的入口?

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

考慮到我們這個查詢的邏輯本質(zhì)和indexServlet沒什么區(qū)別,只是搜索的時候增加了模糊查詢的限制,同時這是表單查詢,使用的是Post,可以直接還使用index的Servlet,給它添加寫一個doPost的方法,但是業(yè)務(wù)邏輯相同,僅僅是入口不同,以及多了限制,我們不妨直接在doPost內(nèi)部調(diào)用doGet把request和response傳入,然后改寫doGet的邏輯

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

為了區(qū)分到底是否使用關(guān)鍵字查詢,老師這里提供一個思路,給form表單加入隱藏域,form表單在提交過程中也會被帶入index的Servlet,如果通過req.getParameter()獲取到不為空的隱藏域參數(shù),說明使用了關(guān)鍵字查詢

JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》

同時為了防止出現(xiàn)我們換頁后進行查詢,錯用了session之前已經(jīng)會保存的跳頁的頁碼值,所以我們需要增加億點點邏輯判斷

//Servlet從3.0版本支持注解方式的注冊
@WebServlet("/index")
public class IndexServlet extends ViewBaseServlet {

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        HttpSession session = req.getSession();
        Integer pageNum = 1;

        String oper = req.getParameter("oper");
        //如果oper不為空,說明通過表單的查詢按鈕點擊過來的
        //如果oper為空,說明通過其他的操作進入

        String keyword = null;
        if(StringUtil.isNotEmpty(oper) && "serach".equals(oper)){
            //說明是點擊表單查詢發(fā)送過來的請求
            //此時,pageNum應(yīng)該還原為1 , keyword應(yīng)該從請求參數(shù)獲取
            pageNum = 1;
            keyword = req.getParameter("keyword");
            if(StringUtil.isEmpty(keyword)){
                keyword = "";
            }
            session.setAttribute("keyword", keyword);
        } else {
            //說明此處是通過頁面按鈕跳轉(zhuǎn)的,或者從網(wǎng)頁直接輸入網(wǎng)址
            //keyword應(yīng)該從session作用域獲取
            String pageNumStr = req.getParameter("pageNum");
            if(StringUtil.isNotEmpty(pageNumStr)){
                pageNum = Integer.parseInt(pageNumStr);
            }
            Object keywordObj = session.getAttribute("keyword");
            if(keywordObj!= null){
                keyword = keywordObj.toString();
            }else {
                keyword = "";
            }
        }

        //保存頁碼到session作用域
        session.setAttribute("pageNum", pageNum);

        //保存水果庫存到session作用域
        FruitDao fruitDao = new FruitDao();
        List<Fruit> fruitList = fruitDao.getFruitList(pageNum);
        session.setAttribute("fruitList", fruitList);

        //保存總頁碼到session作用域
        int fruitCount = fruitDao.getFruitCount();
        int pageCount = (fruitCount + 5 - 1) / 5;
        session.setAttribute("pageCount", pageCount);

        //此處的視圖名稱是  index
        //那么thymeleaf會將這個 邏輯視圖名稱 對應(yīng)到 物理視圖 名稱上
        //邏輯視圖名稱 : index
        //物理視圖名稱 : view-prefix + 邏輯視圖名稱 + view-suffix
        //真實的視圖名稱是:    /        index     .html
        super.processTemplate("index", req, resp);
    }
}

并且讓我們查詢頁數(shù)和查詢庫存的Dao層函數(shù)增加一個keyword參數(shù),Sql語句增加一個條件,這里要記住我們寫Sql語句要填寫?,而為了滿足LIKE的語句條件,需要給參數(shù)部分用字符串拼接“%”?

    @Override
    public List<Fruit> getFruitList(String keyword, Integer pageNum){
        String sql = "SELECT * FROM t_fruit WHERE fname LIKE ? OR remark LIKE ? LIMIT ? , 5;";
        List<Fruit> fruits = null;
        try {
            fruits = executeQuery(Fruit.class, sql,"%"+keyword+"%", "%"+keyword+"%", (pageNum - 1) * 5);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return fruits;
    }
    @Override
    public int getFruitCount(String keyword) {

        String sql = "SELECT COUNT(*) AS fruitCount FROM t_fruit WHERE fname LIKE ? OR remark LIKE ?;";
        List<FruitData> counts = null;
        try {
            counts = super.executeQuery(FruitData.class, sql, "%" + keyword + "%", "%" + keyword + "%");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return Integer.parseInt(counts.get(0).getFruitCount().toString());
    }

?至此,水果管理系統(tǒng)的整體功能已經(jīng)被我們使用Servlet+Thymeleaf和JDBC完成了

下一部分就是代碼優(yōu)化和MVC部分了文章來源地址http://www.zghlxwxcb.cn/news/detail-437375.html

到了這里,關(guān)于JavaWeb《后端內(nèi)容:1. Tomcat - Servlet - Thymeleaf》的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 2023-JavaWeb最新整理面試題-TCP、Tomcat、Servlet、JSP等

    2023-JavaWeb最新整理面試題-TCP、Tomcat、Servlet、JSP等

    1、1xx(臨時響應(yīng)) 2、2xx(成功) 3、3xx(重定向):表示要完成請求需要進一步操作 4、4xx(錯誤):表示請求可能出錯,妨礙了服務(wù)器的處理 5、5xx(服務(wù)器錯誤):表示服務(wù)器在嘗試處理請求時發(fā)生內(nèi)部錯誤 舉例: 200:成功,Web服務(wù)器成功處理了客戶端的請求。 301:永

    2024年02月16日
    瀏覽(26)
  • JavaWeb:Servlet、ServletContext、HttpServletResponse、HttpServletRequest 的詳細內(nèi)容

    JavaWeb:Servlet、ServletContext、HttpServletResponse、HttpServletRequest 的詳細內(nèi)容

    Servlet 是 Sun 公司開發(fā)動態(tài) Web 的一門技術(shù),在這些 API 中提供了一個接口就是:Servlet,開發(fā)一個 Servlet 程序需要 兩個步驟 : 編寫一個類,實現(xiàn) Servlet 接口; 把開發(fā)好的 java 類部署到 Web 服務(wù)器中。 把實現(xiàn)了 Servlet 接口的 Java 程序叫做 Servlet 。 創(chuàng)建一個普通的 Maven 項目,注

    2024年02月03日
    瀏覽(21)
  • [JavaWeb]【五】web后端開發(fā)-Tomcat && SpringBoot解析

    [JavaWeb]【五】web后端開發(fā)-Tomcat && SpringBoot解析

    目錄 一 介紹Tomcat ?二 基本使用 2.1 解壓綠色版 2.2 啟動TOMCAT 2.3 關(guān)閉TOMCAT 2.4 常見問題? 2.5 修改端口號 ?2.6 部署應(yīng)用程序 三 SpringBootWeb入門程序解析 前言:tomcat與SpringBoot解析 ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2024年02月12日
    瀏覽(19)
  • 基于javaweb+mysql的jsp+servlet學(xué)生成績管理系統(tǒng)(管理員、教師、學(xué)生)(java+jsp+servlet+javabean+mysql+tomcat)

    基于javaweb+mysql的jsp+servlet學(xué)生成績管理系統(tǒng)(管理員、教師、學(xué)生)(java+jsp+servlet+javabean+mysql+tomcat)

    基于javaweb+mysql的jsp+servlet學(xué)生成績管理系統(tǒng)(管理員、教師、學(xué)生)(java+jsp+servlet+javabean+mysql+tomcat) 運行環(huán)境 Java≥8、MySQL≥5.7、Tomcat≥8 開發(fā)工具 eclipse/idea/myeclipse/sts等均可配置運行 適用 課程設(shè)計,大作業(yè),畢業(yè)設(shè)計,項目練習(xí),學(xué)習(xí)演示等 功能說明 管理員:個人信息、課程

    2024年02月02日
    瀏覽(56)
  • 一個簡單的前后端交互——登錄注冊頁面(升級版)idea代碼篇(2:Maven:Javaweb項目)使用MyBatis:Mapper,servlet+Tomcat

    一個簡單的前后端交互——登錄注冊頁面(升級版)idea代碼篇(2:Maven:Javaweb項目)使用MyBatis:Mapper,servlet+Tomcat

    前言:本篇前后端交互實現(xiàn)代碼 。詳細項目搭建見上篇 先貼一張登錄界面和包結(jié)構(gòu): ? 1.Mapper 2.pojo 3.util 4.web 5.Login.html 6.CSS 我的企業(yè)版過期了,不能演示跳轉(zhuǎn)頁面了。但測過沒問題。

    2024年02月11日
    瀏覽(25)
  • javaweb使用Thymeleaf 最凝練的CRUD項目-中

    javaweb使用Thymeleaf 最凝練的CRUD項目-中

    ①目標 瀏覽器訪問index.html,通過首頁Servlet,渲染視圖,顯示首頁。 ②思路 ③代碼 [1]創(chuàng)建PortalServlet Servlet代碼: [2]創(chuàng)建portal.html ①目標 在目標頁面顯示所有士兵信息,士兵信息是從數(shù)據(jù)庫查詢出來的 ②思路 ③代碼 [1]ModelBaseServlet 創(chuàng)建這個基類的原因是:我們希望每一個模

    2024年02月17日
    瀏覽(10)
  • JavaWeb期末大作業(yè) Javaweb項目 Javaweb Servlet html

    JavaWeb期末大作業(yè) Javaweb項目 Javaweb Servlet html

    1.進入之后是一個分頁查詢所有數(shù)據(jù)的內(nèi)容? 該頁面有基礎(chǔ)的增刪改查? 還有分頁查詢? 批量刪除 ?進行條件查詢? 有什么不對的地方歡迎提出? 謝謝 ?2.增刪改查 1.添加 添加成功 2.刪除? 將剛才添加的OPPO刪除 3.修改? ? ?4.查詢的話就是主頁查詢所有? 頁面所用的是分頁查詢

    2024年02月10日
    瀏覽(22)
  • JavaWeb學(xué)習(xí)------Servlet

    JavaWeb學(xué)習(xí)------Servlet

    目錄 JavaWeb學(xué)習(xí)------Servlet Servlet 生命周期 Servlet 生命周期 ?Servlet 方法介紹 ?Servlet 體系結(jié)構(gòu) Servlet 體系結(jié)構(gòu) ?Servlet urlPattern配置 Servlet urlPattern配置 ?XML 配置方式編寫 Servlet ?XML 配置方式編寫 Servlet ? 快速入門 ? Servlet 執(zhí)行流程 Servlet 生命周期 對象的生命周期指一個對象

    2024年02月02日
    瀏覽(21)
  • JavaWeb之Servlet

    JavaWeb之Servlet

    在介紹之前需要了解網(wǎng)絡(luò)通信的三要素: IP:電子設(shè)備(計算機)在網(wǎng)絡(luò)中的唯一標識。 端口:應(yīng)用程序在計算機中的唯一標識。 0~65536 傳輸協(xié)議:規(guī)定了數(shù)據(jù)傳輸?shù)囊?guī)則 而先前的JavaWeb的前篇了解HTML,CSS,以及JavaScript的使用,靜態(tài)資源和動態(tài)資源的分化,都是基于本地緩存的

    2024年02月11日
    瀏覽(15)
  • JavaWeb-初識Servlet

    JavaWeb-初識Servlet

    1. Servlet簡介 2. Tomcat安裝配置 3. Servlet項目搭建 4. Servlet項目運行 Servlet是什么 Java Servlet 是運行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務(wù)器上的數(shù)據(jù)庫或應(yīng)用程序之間的中間層。使用 Servlet 可以收集來自網(wǎng)頁表單的用戶

    2024年02月08日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包