創建第一個屬於自己的JavaWeb小程式吧

来源:https://www.cnblogs.com/xiaoxiblog/archive/2023/03/05/17180633.html
-Advertisement-
Play Games

需要使用的 技術 工具: idea 2022 開發工具 MySql 5.6 資料庫工具 Apache Tomcat 8.5.85 web應用部署工具 主要功能有: 用戶登錄 用戶註冊 展示列表信息 涉及到的知識: Servlet JDBC 過濾器 先打開資料庫 創建一個資料庫 然後 創建對應的表結構 ...


需要使用的 技術 工具:

  1. idea 2022  開發工具
  2. MySql 5.6  資料庫工具
  3. Apache Tomcat 8.5.85   web應用部署工具

主要功能有:

  1. 用戶登錄
  2. 用戶註冊
  3. 展示列表信息

涉及到的知識:

  1. Servlet
  2. JDBC
  3. 過濾器

先打開資料庫 創建一個資料庫 然後 創建對應的表結構

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `pwd` varchar(255) NOT NULL,
  `sex` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `info` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
 
INSERT INTO `user` VALUES ('1', '123', '123', '', '北京', '123');
INSERT INTO `user` VALUES ('2', '111, '111', '', '北京', '123123');

 

然後打開 idea 創建以下 幾個目錄:

com.filter   //過濾器 解決中文字元集亂碼
com.util     //資料庫連接工具類
com.entity   //實體類
com.dao      //數據操作類
com.servlet   //servlet類

 

 

 

在filter下新建一個EncodingFilter用來解決中文字元集亂碼,需要實現Filter介面,並且重寫doFilter函數

package com.filter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
public class EncodingFilter implements Filter{
    public EncodingFilter(){
        System.out.println("過濾器構造");
    }
    public void destroy() {
        System.out.println("過濾器銷毀");
    }
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8"); //將編碼改為utf-8
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request, response);
    }
 
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("過濾器初始化");
    }
 
}

 

 

 

 

 然後到web.xml下進行對EncodingFilter相應的 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">

    <!--  設置編碼格式  -->
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.filter.EncodingFilter</filter-class><!--全路徑 從根包開始一直到類名-->
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern> <!--* 為過濾所有-->
    </filter-mapping>

    <!--  設置首頁為登錄頁 首頁從預設的 index.jsp 換成 login.jsp  -->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

</web-app>

 

在util下新建一個DBconn類用來處理對資料庫的連接操作(用戶名和密碼需要對照自己的資料庫進行更改)

package com.util;

import java.sql.*;

public class DBConnection {
    //定義連接資料庫的屬性
    private static String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    private static String url = "jdbc:mysql://localhost:3306/demo";

    // 用戶 密碼
    private static String username = "root";
    private static String pwd = "123456";
    private static Connection conn = null;

    static ResultSet rs = null;
    static PreparedStatement ps =null;
    
    public static void init(){
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(url,username,pwd);
        } catch (Exception e) {
            System.out.println("init [SQL驅動程式初始化失敗!]");
            e.printStackTrace();
        }
    }

    public static int addUpdDel(String sql){
        int i = 0;
        try {
            PreparedStatement ps =  conn.prepareStatement(sql);
            i =  ps.executeUpdate();
        } catch (SQLException e) {
            System.out.println("資料庫增刪改異常");
            e.printStackTrace();
        }
        return i;
    }

    public static ResultSet selectSql(String sql){
        try {
            ps =  conn.prepareStatement(sql);
            rs =  ps.executeQuery(sql);
        } catch (SQLException e) {
            System.out.println("資料庫查詢異常");
            e.printStackTrace();
        }
        return rs;
    }

    public static void closeConn(){
        try {
            conn.close();
        } catch (SQLException e) {
            System.out.println("資料庫關閉異常");
            e.printStackTrace();
        }
    }
}

在entity下新建一個User實體類 對應資料庫中的每個欄位

package com.entity;

public class User {
    private int id;
    private String name;
    private String pwd;
    private String sex;
    private String address;
    private String info;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

在dao下新建一個UserDao介面  以及對應的方法實現類 規範開發 需要使用 介面及實現類

UserDao.java

package com.dao;

import com.entity.User;

import java.util.List;

public interface UserDao {
    public boolean login(String name,String pwd);//登錄
    public boolean register(User user);//註冊
    public List<User> getUserAll();//返回用戶信息集合
    public boolean delete(int id) ;//根據id刪除用戶
    public boolean update(int id,String name, String pwd,String sex, String home,String info) ;//更新用戶信息
}

在寫一個 UserDaoImpl.java     實現UserDao介面,及未實現的方法

package com.dao;

import com.entity.User;
import com.util.DBConnection;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao {
    DBConnection DBconn = new DBConnection();

    // 註冊用戶
    @Override
    public boolean register(User user) {
        boolean flag = false;
        DBconn.init();
        int i =DBconn.addUpdDel("insert into user(name,pwd,sex,address,info) " +
                "values('"+user.getName()+"','"+user.getPwd()+"','"+user.getSex()+"','"+user.getAddress()+"','"+user.getInfo()+"')");
        if(i>0){
            flag = true;
        }
        DBconn.closeConn();
        return flag;
    }

    // 查詢 登錄用戶是否存在
    @Override
    public boolean login(String name, String pwd) {
        boolean flag = false;
        try {
            DBconn.init();
            ResultSet rs = DBconn.selectSql("select * from user where name='"+name+"' and pwd='"+pwd+"'");
            while(rs.next()){
                if(rs.getString("name").equals(name) && rs.getString("pwd").equals(pwd)){
                    flag = true;
                }
            }
            DBconn.closeConn();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }

    // 獲取用戶
    @Override
    public List<User> getUserAll() {
        List<User> list = new ArrayList<User>();
        try {
            DBconn.init();
            ResultSet rs = DBconn.selectSql("select * from user");
            while(rs.next()){
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                user.setPwd(rs.getString("pwd"));
                user.setSex(rs.getString("sex"));
                user.setAddress(rs.getString("address"));
                user.setInfo(rs.getString("info"));
                list.add(user);
            }
            DBconn.closeConn();
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    // 更新用戶數據
    @Override
    public boolean update(int id, String name, String pwd, String sex, String home, String info) {
        boolean flag = false;
        DBconn.init();
        String sql ="update user set name ='"+name
                +"' , pwd ='"+pwd
                +"' , sex ='"+sex
                +"' , home ='"+home
                +"' , info ='"+info+"' where id = "+id;
        int i =DBconn.addUpdDel(sql);
        if(i>0){
            flag = true;
        }
        DBconn.closeConn();
        return flag;
    }

    // 刪除用戶
    @Override
    public boolean delete(int id) {
        boolean flag = false;
        DBconn.init();
        String sql = "delete  from user where id="+id;
        int i =DBconn.addUpdDel(sql);
        if(i>0){
            flag = true;
        }
        DBconn.closeConn();
        return flag;
    }


}

在servlet下創建DengluServlet用來實現對用戶登錄的操作 ,實現Servlet具體內容,然後需要去WEB_INF下的web.xml去配置servlet

package com.servlet;

import com.dao.UserDao;
import com.dao.UserDaoImpl;

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

@WebServlet(name = "signinServlet", value = "/signinServlet")
public class Signin extends HttpServlet { // serverlet 需要繼承 HttpServerlet  並重寫doGet和doPost方法
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request, response);  //將信息使用doPost方法執行   對應jsp頁面中的form表單中的method
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name"); //得到jsp頁面傳過來的參數
        String pwd = request.getParameter("pwd");

        UserDao ud = new UserDaoImpl();

        if(ud.login(name, pwd)){
            request.setAttribute("xiaoxi", "歡迎用戶"+name); //向request域中放置信息
            request.getRequestDispatcher("/success.jsp").forward(request, response);//轉發到成功頁面
        }else{
            response.sendRedirect("index.jsp"); //重定向到首頁
        }

    }
}

兩點要註意的地方:

一:getParameter與getAttribute兩者的區別

request.setAttribute("xiaoxi", "歡迎用戶"+name);//向request域中放置信息 ( 鍵值對的形式) 名字為xiaoxi 內容為"歡迎用戶"+name

request.getAttribute("xiaoxi");//得到request域中放置名字為xiaoxi的信息

request.getParameter("name");//得到request域的參數信息(得到jsp頁面傳過來的參數)

getAttribute表示從request範圍取得設置的屬性,必須要先setAttribute設置屬性,才能通過getAttribute來取得,設置與取得的為Object對象類型 。

getParameter表示接收參數,參數為頁面提交的參數,包括:表單提交的參數、URL重寫(就是xxx?id=1中的id)傳的參數等,因此這個並沒有設置參數的方法(沒有setParameter),而且接收參數返回的不是Object,而是String類型

二:轉發與重定向的區別

(1).重定向的執行過程:Web伺服器向瀏覽器發送一個http響應--》瀏覽器接受此響應後再發送一個新的http請求到伺服器--》伺服器根據此請求尋找資源併發送給瀏覽器。它可以重定向到任意URL,不能共用request範圍內的數據。
(2).重定向是在客戶端發揮作用,通過新的地址實現頁面轉向。
(3).重定向是通過瀏覽器重新請求地址,在地址欄中可以顯示轉向後的地址。
(4).轉發過程:Web伺服器調用內部方法在容器內部完成請求和轉發動作--》將目標資源發送給瀏覽器,它只能在同一個Web應用中使用,可以共用request範圍內的數據。
(5).轉發是在伺服器端發揮作用,通過forward()方法將提交信息在多個頁面間進行傳遞。
(6).轉發是在伺服器內部控制權的轉移,客戶端瀏覽器的地址欄不會顯示出轉向後的地址。

在servlet下創建一個ZhuceServlet用來實現用戶註冊的操作

package com.servlet;

import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.entity.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LogonServlet", value = "/LogonServlet")
public class Logon extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name"); //獲取jsp頁面傳過來的參數
        String pwd = req.getParameter("pwd");
        String sex = req.getParameter("sex");
        String address = req.getParameter("address");
        String info = req.getParameter("info");

        User user = new User(); //實例化一個對象,組裝屬性
        user.setName(name);
        user.setPwd(pwd);
        user.setSex(sex);
        user.setAddress(address);
        user.setInfo(info);

        UserDao ud = new UserDaoImpl();

        if( ud.register(user) ){
            req.setAttribute("username", name);  //向req域中放置參數
            req.setAttribute("xiaoxi", "註冊成功");
            req.getRequestDispatcher("/login.jsp").forward(req, resp);  //轉發到登錄頁面
        }else{
            resp.sendRedirect("login.jsp");//重定向到首頁
        }
    }
}

在servlet下創建SearchallServlet用來返回資料庫中所有用戶信息  Searchall.java

package com.servlet;

import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.entity.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet(name = "SearchallServlet", value = "/SearchallServlet")
public class Searchall extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        UserDao ud = new UserDaoImpl();
        List<User> userAll = ud.getUserAll();
        req.setAttribute("userAll", userAll);
        req.getRequestDispatcher("/showall.jsp").forward(req, resp);
    }
}

 

在servlet下創建DeleteServlet用來刪除用戶操作  DeleteServlet.java

package com.servlet;

import com.dao.UserDao;
import com.dao.UserDaoImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "DeleteServlet", value = "/DeleteServlet")
public class Delete extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        int userId = Integer.parseInt(id);

        UserDao ud = new UserDaoImpl();

        if(ud.delete(userId)){
            req.setAttribute("xiaoxi", "刪除成功");
            req.getRequestDispatcher("/Searchall").forward(req, resp);
        }else{
            resp.sendRedirect("index.jsp");
        }
    }
}

在servlet下創建UpdateServlet操作用來更新用戶信息  UpdateServlet.java



package com.servlet;


import com.dao.UserDao;
import com.dao.UserDaoImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "UpdateServlet", value = "/UpdateServlet")
public class Update extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        int userId = Integer.parseInt(id);

        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        String sex = req.getParameter("sex");
        String home = req.getParameter("home");
        String info = req.getParameter("info");

        System.out.println("------------------------------------"+userId);

        UserDao ud = new UserDaoImpl();

        if(ud.update(userId, name, pwd, sex, home, info)){
            req.setAttribute("xiaoxi", "更新成功");
            req.getRequestDispatcher("/Searchall").forward(req, resp);
        }else{
            resp.sendRedirect("index.jsp");
        }
    }
}

 

配置servlet 

<?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">

    <!--  設置編碼格式  -->
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.filter.EncodingFilter</filter-class><!--全路徑 從根包開始一直到類名-->
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern> <!--* 為過濾所有-->
    </filter-mapping>


    <servlet><!--servlet類路徑配置-->
        <servlet-name>LogonServlet</servlet-name>
        <servlet-class>com.servlet.Logon</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>SigninServlet</servlet-name>
        <servlet-class>com.servlet.Signin</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>SearchallServlet</servlet-name>
        <servlet-class>com.servlet.Searchall</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>DeleteServlet</servlet-name>
        <servlet-class>com.servlet.Delete</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>UpdateServlet</servlet-name>
        <servlet-class>com.servlet.Update</servlet-class>
    </servlet>

    <!--配置Servlet 類-->
    <servlet-mapping>
        <servlet-name>LogonServlet</servlet-name>
        <url-pattern>/LogonServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>SigninServlet</servlet-name>
        <url-pattern>/SigninServlet</	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目實現01 1.功能01-搭建Vue前端工程 1.1需求分析 使用Vue3的腳手架vue-cli工具,創建ssm的前端項目基礎開發環境 Vue-cli主要的功能是自動生成Vue的項目模板,提高開發效率 1.2代碼實現 1.2.1搭建vue工程 以下命令使用管理員許可權 (1)先下載node.js L ...
  • VL45 非同步FIFO 很經典的手撕題,這道題要求產生的格雷碼要在本時鐘域中打一拍,其實不打也沒關係。 主要要記住 1、bin2gray的方法:右移一位與移位前異或; 2、格雷碼比較方法:空:讀指針格雷碼和寫指針同步過來的格雷碼相同;滿:寫指針格雷碼高兩位與讀指針同步過來的格雷碼正好相反,低位相同。 ...
  • 職工工資管理系統程式中新增臨時員工的功能 這個職工工資管理系統基本功能都十分完善,代碼也都比較簡潔,運行效率也很高,沒有什麼直接能改的功能,所以我基於現在許多大學生找兼職、臨時工的現象,增添了臨時員工的工資系統,可以方便公司、企業等更加完善公司的財務系統。也方便公司為臨時員工發放工資。 代碼段一是原 ...
  • 雙指針 同向雙指針 能夠實現跳躍尋找,適用於尋找含有某一特性區間,比如最長相同區間,最長不重覆區間 不重覆區間可以用一個數組t[N]來表示,如果其中元素大於1,說明有重覆 int res=0,j=0; for(int i=0;i<n;i++) { t[a[i]]++;//記錄個數 while(j<i ...
  • 一、標識符 標識符是指定義的具有特殊意義的詞,例如變數、常量、函數名等等,任何一門語言中都對自己的標識符有特殊定義的規則。在 Go 語言中,標識符由字母數字和下劃線組成,並且只能以字母和下劃線開頭,例如: 數字、字母和下劃線組成:123、abc _ 只能以字母和下劃線開頭:abc123、_sysVa ...
  • 靜態類和非靜態類 靜態類只能是內部類,外部類不能用static修飾,內部類可以使用static修飾。 創建方式: 外部類.靜態內部類 對象名=外部類.new 靜態內部類(); 外部類 對象名= new 外部類(); 外部類.非靜態內部類 對象名1 = 對象名.new 非靜態內部類(); 抽象類是否可 ...
  • 1.java開發工具的構成 (1)JVM即java虛擬機,用於解釋翻譯java生成的自解碼文件,因為java中有了這個,才能實現java語言跨平臺運行java自解碼文件 (2)JRE即java運行環境,它是由JVM和java系統類庫構成,JRE是能保證java代碼能夠準確無誤在裝了JRE機器上運行, ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址:https://github.c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...