首頁 > 軟體

Javaweb實現完整個人部落格系統流程

2022-03-30 16:00:14

一、專案背景

在學習完JavaWeb相關知識後,有了基礎能力就想通過完成一個Javaweb專案來回顧和加強已經學過的知識,並且希望在這個過程中發現自己的不足並加以改正。
由於之前一直都在CSDN上分享自己的學習過程,對CSDN部落格系統的功能有了一定的瞭解,因此便嘗試完成了個人部落格系統。

二、專案功能

1.使用者登入:

2.使用者主頁:

3.檢視全文:

4.寫文章:

5.登出回到登入頁面:

三、專案的基本流程

1.準備工作

pom.xml中引入的依賴包

<dependencies>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>

    <!-- Servlet依賴包:官方提供的servlet標準 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <!-- 開發編譯時需要這個依賴包,執行時不需要 -->
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
    
	<!-- 資料繫結包,提供JAva物件與JSON資料格式進行序列化 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.3</version>
    </dependency>
    
    <!--    引入單元測試框架,方便我們做測試    -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.1</version>
    </dependency>
</dependencies>

引入Jackson依賴是為了進行序列化、反序列化的操作
作用:使資料和物件之間可以相互轉換,保證資料的完整性

Jackson是一個Java用來處理JSON格式資料的類庫,效能非常好,經常被用來JSON序列化(將物件轉換為JSON字串)和反序列化(將JSON字串轉換為指定的資料型別)

序列化和反序列化操作:

public class WebUtil {

    //判斷是否登入,通過請求物件獲取session,如果session存在且登入時
    // 儲存的鍵為user,值是使用者物件,這個資料存在,就表示已登入
    //返回user:已登入就返回session中儲存的使用者,未登入返回null
    public static User checkLogin(HttpServletRequest req){
        User user = null;
        //如果從tomcat儲存的session的map資料結構中,獲取session,false表示獲取不到,返回null
        HttpSession session = req.getSession(false);
        if(session!=null){
            user = (User)session.getAttribute("user");
        }
        return user;
    }

    //這個物件可以使用單例
    private static ObjectMapper M = new ObjectMapper();

    //反序列化:轉換一個輸入流中包含的json字串為一個java物件
    //使用泛型:傳一個什麼型別給我,就返回一個該型別的物件
    public static <T> T read(InputStream is,Class<T> clazz){
        try {
            return M.readValue(is,clazz);
        } catch (IOException e) {
            throw new RuntimeException("json反序列化出錯",e);
        }
    }

    //序列化:將一個任意型別的java物件,轉換為一個json字串
    public static String write(Object o){
        try {
            return M.writeValueAsString(o);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("json序列化出錯",e);
        }
    }

2.資料庫設計

1.建立所需表:

  • user(使用者表)
  • acticle(文章表)

2.設計與之對應的資料庫實體類:

3.資料庫連線工具:

//資料庫工具類:提供獲取資料庫連線,釋放資源的統一程式碼
public class DBUtil {
    //靜態變數,是類載入的時候初始化,只執行一次
    private static MysqlDataSource ds;
    //一個程式,連線一個資料庫,只需要一個連線池,其中儲存了多個資料庫連線物件
    //1.獲取連線池,內部使用,不開放
    private static DataSource getDataSource(){
        //ds類載入的時候,初始化為null,方法使用的時候,每次都判斷一下
        if(ds==null){//判斷為空,就建立及初始化屬性
            ds=new MysqlDataSource();
            ds.setURL("jdbc:mysql://127.0.0.1:3306/blog");
            ds.setUser("root");
            ds.setPassword("010124");
            ds.setUseSSL(false);//不安全連線,如果不設定,也不影響,只是有警告
            ds.setCharacterEncoding("UTF-8");
        }
        return ds;
    }

    //2.獲取資料庫連線物件:開放給外部的jdbc程式碼使用
    public static Connection getConnection(){
        try {
            return getDataSource().getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("獲取資料庫連線出錯,可能是url,賬號密碼寫錯了",e);
        }
    }
    
    //3.釋放資源
    //查詢操作需要釋放三個資源,更新操作(插入,修改,刪除)只需要釋放前兩個資源
    public static void close(Connection c, Statement s, ResultSet r){
        try {
            if(r!=null) r.close();
            if(s!=null) s.close();
            if(c!=null) c.close();
        } catch (SQLException e) {
            throw new RuntimeException("釋放資料庫資源出錯",e);
        }
    }

    //提供更新操作方便的釋放資源功能
    public static void close(Connection c, Statement s){
        close(c,s,null);
    }

    public static void main(String[] args) {
        System.out.println(getConnection());
    }
}

4.使用者表和文章表的CRUD操作(Dao類):

3.準備前端頁面

1.把之前寫好的前端靜態頁面部署到webapp目錄下

2.封裝ajax:

在前後端互動中我們需要用到ajax進行資料互動
把之前封裝好的ajax函數拷貝過來,放到一個單獨的js檔案中,方便後續使用

function ajax(args){//var ajax = function(){}
    let xhr = new XMLHttpRequest();
    // 設定回撥函數
    xhr.onreadystatechange = function(){
        // 4: 使用者端接收到響應後回撥
        if(xhr.readyState == 4){
            // 回撥函數可能需要使用響應的內容,作為傳入引數
            args.callback(xhr.status, xhr.responseText);
        }
    }
    xhr.open(args.method, args.url);
    //如果args中,contentType屬性有內容,就設定Content-Type請求頭
    if(args.contentType){//js中,if判斷,除了判斷boolean值,還可以判斷字串,物件等,有值就為true
        xhr.setRequestHeader("Content-Type", args.contentType);
    }
    //如果args中,設定了body請求正文,呼叫send(body)
    if(args.body){
        xhr.send(args.body);
    }else{//如果沒有設定,呼叫send()
        xhr.send();
    }
}

3.設計一個類:用於返回給前端ajax回撥

//設計一個類,用於返回給前端ajax回撥
public class JsonResult {
    private boolean ok;//表示執行一個操作是否成功
    private Object data;//操作成功,且是一個查詢操作,需要返回一些資料給前端

	//同樣省略getter、setter和toString
}

4.實現前端匹配的Servlet所需功能

5.專案難點

  • 實現使用者不登入不允許存取主頁內容並且重定向到登入頁面,其次使用者不登入的情況下存取某個介面也是非法的,也要重定向到登入頁面
  • 文章釋出後要將新的一篇文章插入到資料庫中,檢視全文要將markdown格式的資料轉為HTML
  • 登入成功也要建立session並儲存使用者資訊以供後面使用

到此這篇關於Java實現完整個人部落格系統流程的文章就介紹到這了,更多相關Java 個人部落格系統內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com