day24-伺服器端渲染技術02

来源:https://www.cnblogs.com/liyuelian/archive/2022/11/27/16928697.html
-Advertisement-
Play Games

伺服器端渲染技術02 11.EL表達式 11.1EL表達式介紹 EL表達式全稱:Expression Language,是表達式語言 EL表達式主要是代替jsp頁面的表達式腳本 EL表達式輸出數據時,比jsp的表達式腳本簡潔 EL表達式基本語法:${key} 底層其實走的還是jsp表達式腳本,可以理 ...


伺服器端渲染技術02

11.EL表達式

11.1EL表達式介紹

  1. EL表達式全稱:Expression Language,是表達式語言

  2. EL表達式主要是代替jsp頁面的表達式腳本

  3. EL表達式輸出數據時,比jsp的表達式腳本簡潔

  4. EL表達式基本語法:${key}

    底層其實走的還是jsp表達式腳本,可以理解為就是一個語法糖

11.2EL表達式快速入門

el_qs.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el表達式的快速入門</title>
</head>
<body>
<h1>el表達式的快速入門</h1>
<%
    request.setAttribute("name","星星之火,可以燎原");
%>
<%--
    1.如果name是null,用request.getAttribute("name")返回的就是null字元串
    2.如果name是null,用el表達式返回的則是空串 ""
--%>
<h3>1.jsp 表達式腳本</h3>
名字:<%=request.getAttribute("name")%><br/>
<h3>2.el 表達式</h3>
名字:${name}<br/>
</body>
</html>
image-20221126175436250

註意:

  1. EL表達式在輸出null時,輸出的是空串""

  2. jsp腳本在輸出null時,輸出的是 “null” 字元串

image-20221126175619276

11.3EL常用輸出形式

EL表達式常用輸出Bean的普通屬性,數組屬性,List集合屬性和map集合屬性

應用實例

book.java:

package com.li.entity;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Book {
    private String name;//書名
    private String[] writer;//作者
    private List<String> reader;//讀者
    private Map<String,String> topics;//評價

    public String getName() {
        return name;
    }

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

    public String[] getWriter() {
        return writer;
    }

    public void setWriter(String[] writer) {
        this.writer = writer;
    }

    public List<String> getReader() {
        return reader;
    }

    public void setReader(List<String> reader) {
        this.reader = reader;
    }

    public Map<String, String> getTopics() {
        return topics;
    }

    public void setTopics(Map<String, String> topics) {
        this.topics = topics;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", writer=" + Arrays.toString(writer) +
                ", reader=" + reader +
                ", topics=" + topics +
                '}';
    }
}

el_output.jsp:

<%@ page import="com.li.entity.Book" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el表達式輸出數據演示</title>
</head>
<body>
<h1>el表達式輸出數據演示</h1>
<%
    //創建一個Book對象初始化,並放入相關屬性
    Book book = new Book();
    book.setName("昆蟲總動員");
    book.setWriter(new String[]{"jack", "tomas"});
    ArrayList<String> readers = new ArrayList<>();
    readers.add("小李");
    readers.add("小王");
    book.setReader(readers);
    //創建topics
    HashMap<String, String> topics = new HashMap<>();
    topics.put("topic1", "這是我看過的最好的動畫片");
    topics.put("topic2", "不錯的電影~~");
    book.setTopics(topics);

    //把book放入到request域對象中
    request.setAttribute("bookKey", book);
%>
book對象:${bookKey}<br/><br/>

book.name=${bookKey.name}<br/><br/>

<%--這裡輸出的是數組對象,因為數組沒有重寫toString方法--%>
book.writer=${bookKey.writer}<br/><br/>

第一個作者book.writer[0]=${bookKey.writer[0]}<br/><br/>

<%--這裡可以輸出具體的值,因為list底層重寫了toString方法--%>
book.readers=${bookKey.reader}<br/><br/>

<%--第二個讀者book.readers[1]=${bookKey.reader.get(1)}<br/>--%>
第二個讀者book.readers[1]=${bookKey.reader[1]}<br/><br/>

book.topics=${bookKey.topics}<br/><br/>

<%--map不能以索引的方式來取值--%>
第一個評價=${bookKey.topics.get("topic1")}<br/><br/>

第一個評價=${bookKey.topics["topic1"]}
</body>
</html>
image-20221126183418404

11.4EL運算操作符

EL的運算操作符和java基礎的操作符在概念和用法上都是一樣的,只是形式上有些變化。

  1. 基本語法:${運算表達式}

  2. 關係運算

    image-20221126184648121
  3. 邏輯運算

    image-20221126184716846
  4. 算術運算

    image-20221126184741241

應用實例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el運算符</title>
</head>
<body>
<h1>el運算符</h1>
<%
    request.setAttribute("num1", 90);
    request.setAttribute("num2", 30);
%>
num1+num2=${num1+num2}<br/>
num1>num2?=${num1>num2}<br/>
</body>
</html>
image-20221126185358669

11.5EL的empty運算

  1. empty運算可以判斷一個數是否為空,如果為空,返回true,否則返回false
  2. 以下幾種情況為空:
    • 值為null
    • 值為空串時
    • 值是Object類型數據,但長度為零時
    • list集合,元素個數為零時
    • map集合,元素個數為零時

應用實例

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el empty的運算</title>
</head>
<body>
<%
    request.setAttribute("k1", null);//null
    request.setAttribute("k2", "");//空串
    request.setAttribute("k3", new Object[]{});//為空的Object數組
    request.setAttribute("k4", new ArrayList<>());//為空的list集合
    request.setAttribute("k5", new HashMap<>());//為空的map集合
%>
k1是否為空=${empty k1}<br/>
k2是否為空=${empty k2}<br/>
k3是否為空=${empty k3}<br/>
k4是否為空=${empty k4}<br/>
k5是否為空=${empty k5}<br/>
</body>
</html>
image-20221126190307314

11.6EL的三元運算

  1. 表達式1?表達式2:表達式3

  2. 如果表達式1的值為真,返回表達式2的值,反之返回表達式3的值

    image-20221126190610775

11.7EL的11個隱含/內置對象

image-20221126190833117

下麵以pageScope,requestScope,sessionScope,applicationScope四個常用的隱含對象為例子演示。

演示el常用的四個隱含對象(域對象)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>演示el的四個常用的隱含對象(域對象)</title>
</head>
<body>
<h2>演示el的四個常用的隱含對象(域對象)</h2>
<%
    request.setAttribute("k1", "request-k1數據");
    pageContext.setAttribute("k1", "pageContext-k1數據");
    session.setAttribute("k1", "session-k1數據");
    application.setAttribute("k1", "application-k1數據");
%>
<h3>1.jsp腳本方式獲取</h3>
<%=request.getAttribute("k1")%>
<h3>2.el方式來獲取域對象的數據</h3>
request域中的k1=${requestScope.k1}<br/>
pageContext域中的k1=${pageScope.k1}<br/>
session域中的k1=${sessionScope.k1}<br/>
application域中的k1=${applicationScope.k1}<br/>
</body>
</html>
image-20221126192219036

11.7.1pageContext對象的使用

  • 我們可以通過pageContext.request.xxx來獲取和http協議相關的信息:

    通過request對象來獲取和HTTP協議相關的數據:

    1. request.getScheme() 它可以獲取請求的協議
    2. request.getServerName() 獲取請求的伺服器 ip 或功能變數名稱
    3. request.getServerPort() 獲取請求的伺服器埠號
    4. getContextPath() 獲取當前工程路徑
    5. request.getMethod() 獲取請求的方式(GET 或 POST)
    6. request.getRemoteHost() 獲取客戶端的 ip 地址
    7. session.getId() 獲取會話的唯一標識

例子

image-20221126192927968
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext 對象的使用</title>
</head>
<body>
<h1>pageContext 對象的使用</h1>
<%--
  //通過 request 對象來獲取和 HTTP 協議相關的數據
  request.getScheme() 它可以獲取請求的協議
  request.getServerName() 獲取請求的伺服器 ip 或功能變數名稱
  request.getServerPort() 獲取請求的伺服器埠號
  getContextPath() 獲取當前工程路徑
  request.getMethod() 獲取請求的方式(GET 或 POST)
  request.getRemoteHost() 獲取客戶端的 ip 地址
  session.getId() 獲取會話的唯一標識
--%>
<hr/>
協議: ${ pageContext.request.scheme }<br>
伺服器 ip:${ pageContext.request.serverName }<br>
伺服器埠:${ pageContext.request.serverPort }<br>
工程路徑:${ pageContext.request.contextPath }<br>
請求方法:${ pageContext.request.method }<br>
客戶端 ip 地址:${ pageContext.request.remoteHost }<br>
會話 id :${ pageContext.session.id }<br>

<h3>使用 jsp 表達式腳本獲取如上信息</h3>
ip 地址: <%=request.getRemoteHost() %><br>
會話 id :<%=request.getRequestedSessionId()%><br>
...

<h3>使用 el 表達式形式獲取信息-簡化寫法</h3>
<%
    //可以將request對象放到pageContext屬性中,通過key可以很方便地取出,從而簡化寫法
    pageContext.setAttribute("req", request);
%>
ip 地址: ${req.remoteHost} <br>
獲取請求方法: ${req.method} <br>
客戶端 ip 地址:${ req.remoteHost }<br>
...
</body>
</html>
image-20221126193731450

12.JSTL

12.1JSTL介紹

  1. JSTL(Java server pages standarded tag library,即JSP標準標簽庫。

  2. EL表達式是為了替換jsp中的表達式腳本,JSTL是為了替換代碼腳本<%%>,這樣可以使jsp頁面變得更加簡潔。

  3. JSTL由五個標簽庫組成:

    image-20221126194224976

  4. 使用JSTL,需要導入相關的jar包:

    下載連接:https://tomcat.apache.org/download-taglibs.cgi

    image-20221126195131691

12.2快速入門

  1. 將兩個jar包直接複製粘貼到web應用程式的WEB-INF\lib目錄下,add as library

    image-20221126195318622
  2. 在jsp頁面的引入標簽,要放在文件第一行

    image-20221126195629830
  3. 導入jstl jar包後,要重新發佈web工程,否則不識別jstl

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jstl的快速入門</title>
</head>
<body>
<h1>jstl的快速入門</h1>
<%--
    1.c: if ...標簽類似
    2.if(10>2){
        out.println("xxx")
    }
--%>
<c:if test="${10>2}">
    <h2>10>2成立~~~</h2>
</c:if>
</body>
</html>
image-20221126200823058

12.3core核心庫

12.3.1<c:set />標簽

例子:<c:set scope="request" var="k1" value="v1"/>

<c:set/> set標簽可以往域中保存數據

  1. 等價於 域對象.setAttribute(key,value);
  2. scope 屬性設置保存到哪個域
    • page表示PageContext域(預設值)
    • request表示Request域
    • session表示Session域
    • application表示ServletContext域
  3. var 屬性設置 key 是什麼
  4. value 屬性設置值

例子

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>c:set標簽的使用</title>
</head>
<body>
<h1>c:set標簽的使用</h1>
<%
    //原來的寫法
    //request.setAttribute("email","[email protected]");
%>
<%--jstl的寫法--%>
<c:set scope="request" var="name" value="tomas"> </c:set>

<%--c:set-name的值:${name} 或者--%>
c:set-name的值:${requestScope.name}
</body>
</html>
image-20221126203603115

12.3.2<c:if />標簽

例子:<c:if test="10>2">hello< /c:if>

<c:if />

  1. if標簽用來做if判斷
  2. test屬性表示判斷的條件(用EL表達式輸出)

例子

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>c:if標簽使用</title>
</head>
<body>
<h2>c:if標簽使用</h2>
<c:set scope="request" var="num1" value="20"/>
<c:set scope="request" var="num2" value="10"/>
<c:if test="${num1>num2}">
    <h3>${num1}>${num2}</h3>
</c:if>
</body>
</html>
image-20221126204707838

12.3.3<c:choose >標簽

介紹:多路判斷。跟switch...case...default非常接近

例子

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>c:choose標簽的使用</title>
</head>
<body>
<%
    request.setAttribute("scope", 59);

    pageContext.setAttribute("k1", "pageContext-k1");
    request.setAttribute("k1", "request-k1");
    session.setAttribute("k1", "session-k1");
    application.setAttribute("k1", "application-k1");
%>
<%--如果這樣寫:${requestScope.scope} 就是明確指定從request域對象取出數據  --%>
<%--如果這樣寫:${scope} 就按照下麵的域範圍從小到大的開始找
        pageContext ->request-> session->application
  --%>
k1=${k1}
<hr>
<h1>c:choose標簽的使用</h1>
<c:choose>
    <c:when test="${requestScope.scope > 80}">
        <h3>${scope}-成績優秀!</h3>
    </c:when>
    <c:when test="${requestScope.scope > 60}">
        <h3>${scope}-成績及格!</h3>
    </c:when>
    <c:otherwise>
        <h3>${scope}-成績不及格,繼續努力!</h3>
    </c:otherwise>
</c:choose>
</body>
</html>
image-20221126210844648

12.3.4<c:forEach />標簽

介紹:c:forEach標簽用來遍歷輸出,主要有4種形式

  • 普通遍歷輸出i到j
  • 遍曆數組
  • 遍歷Map
  • 遍歷List

例子

<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.li.entity.Monster" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>c:forEach標簽</title>
</head>
<body>
<h1>c:forEach標簽</h1>
<hr>
<h2>第一種遍歷方式:從i到j</h2>
<ul>
    <%--
        1.遍歷1到5
        2.begin屬性設置開始的索引,end屬性設置結束的索引
        3.var屬性表示迴圈的變數(也就是當前正在遍歷到的數據)
        4.等價於 for(int i = 1; i < = 5; i++){}
        5.預設情況情況下,i的值每次會遞增 1
        6.可以使用step屬性來設置增量
     --%>
    <c:forEach begin="1" end="5" var="i">
        <li>排名=${i}</li>
    </c:forEach>
</ul>
<hr>
<h2>第二種遍歷方式:遍曆數組</h2>
<%
    request.setAttribute("sports", new String[]{"打籃球", "乒乓球"});
%>
<%--
    1.item屬性指定要遍歷的集合/數組
    2.var 自定義變數,每次取出的數據會存放到該變數中
    3.等價於 for(Object item:arr){}
    相當於每迴圈一次,就在items指定的數組中,
    取出一個數據存放到var自定義的變數中,
    直至取完數據就退出迴圈
    --%>
<c:forEach items="${requestScope.sports}" var="sp">
    運動名稱=${sp}<br/>
</c:forEach>
<hr>
<h2>第三種遍歷方式:遍歷Map</h2>
<%
    HashMap<String, Object> map = new HashMap<>();
    map.put("key1", "北京");
    map.put("key2", "上海");
    map.put("key3", "天津");
    request.setAttribute("cities", map);
%>
<%--
    1.item:遍歷的map集合
    2.var:遍歷到的數據
    3.entry.key:取出key
    4.entry.value:取出值
--%>
<c:forEach items="${requestScope.cities}" var="city">
    城市信息=${city.key}--${city.value}<br/>
</c:forEach>

<hr>
<h2>第四種遍歷方式:遍歷List</h2>
<%
    ArrayList<Monster> monsters = new ArrayList<>();
    monsters.add(new Monster(100, "小妖怪", "巡山的"));
    monsters.add(new Monster(200, "大妖怪", "做飯的"));
    monsters.add(new Monster(300, "老妖怪", "打掃位置的"));
    request.setAttribute("monsters", monsters);
%>
<%--
    items 表示遍歷的集合
    var 表示遍歷到的數據
    begin 表示遍歷的開始索引值 ,從 0 開始計算
    end 表示結束的索引值
    step 屬性表示遍歷的步長值
    varStatus 屬性表示當前遍歷到的數據的狀態,可以得到 step,begin,end 等屬性值
--%>
<c:forEach items="${requestScope.monsters}" var="monster">
    妖怪信息=${monster.id}-${monster.name}-${monster.skill}<br/>
</c:forEach>
</body>
</html>
image-20221126215316493

13.練習

需求分析:使用jsp+servlet+jstl+el完成查詢-顯示案例,需求如下:

  1. 點擊超鏈接,可以顯示所有的妖怪信息
  2. 要求顯示的數據在servlet中準備,並放入到request域對象中
  3. 擴展,如果要求增加根據薪水sal條件過濾,怎麼處理?

image-20221126215708667 image-20221126215721462

練習

思路:

query.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: li
  Date: 2022/11/27
  Time: 0:07
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>query</title>
</head>
<body>
<h1>查詢妖怪</h1>
<form action="/jsp/queryServlet" method="post">
    請輸入查詢的最低工資:<input type="text" name="sal"/><br/><br/>
    <input type="submit" value="點擊查詢"/>
</form>
</body>
</html>

QueryServlet:

package com.li.servlet;

import com.li.entity.Monster;
import com.utils.WebUtils;

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

@WebServlet(name = "QueryServlet", urlPatterns = "/queryServlet")
public class QueryServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("QueryServlet was run...");
        //所有妖怪的數據
        ArrayList<Monster> allMonsters = new ArrayList<>();
        allMonsters.add(new Monster(100, "小妖怪", "巡山的", 345.7));
        allMonsters.add(new Monster(200, "大妖怪", "做飯的", 1345.7));
        allMonsters.add(new Monster(300, "老妖怪", "打掃位置的", 11345.7));

        //獲取篩選條件
        String selectSal = request.getParameter("sal");
        //String轉成double
        double selectNum = WebUtils.parseDouble(selectSal, 0);
        //篩選
        //用來放篩選數據的list
        ArrayList<Monster> vaildMonsters = new ArrayList<>();
        for (Monster monster : allMonsters) {
            if (monster.getSal() >= selectNum) {
                vaildMonsters.add(monster);
            }
        }
        //將合法數據放到域對象中
        request.setAttribute("vaildMonsters", vaildMonsters);
        //請求轉發到顯示頁面
        request.getRequestDispatcher("/hw/view.jsp").forward(request, response);
    }
}

Monster:

package com.li.entity;

public class Monster {
    private Integer id;
    private String name;
    private String skill;
    private double sal;

    public Monster(Integer id, String name, String skill, double sal) {
        this.id = id;
        this.name = name;
        this.skill = skill;
        this.sal = sal;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    public double getSal() {
        return sal;
    }

    public void setSal(double sal) {
        this.sal = sal;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                ", sal=" + sal +
                '}';
    }
}

WebUtils:

package com.utils;

public class WebUtils {
    public static double parseDouble(String strNum, int defaultVal) {
        try {
            return Double.parseDouble(strNum);
        } catch (NumberFormatException e) {
            System.out.println(strNum + "不能轉成整數");
        }
        return defaultVal;
    }
}

view.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: li
  Date: 2022/11/27
  Time: 0:13
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>view</title>
</head>
<body>
<h1>顯示妖怪信息</h1>
<table border="1px" width="300px">
    <tr>
        <td>id</td>
        <td>name</td>
        <td>job</td>
        <td>sal</td>
    </tr>
    <c:forEach items="${requestScope.vaildMonsters}" var="monster">
        <tr>
            <td>${monster.id}</td>
            <td>${monster.name}</td>
            <td>${monster.skill}</td>
            <td>${monster.sal}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>
image
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下高度靈活的FreeMarker鏈接文件模板機制。 痞子衡之前寫過一篇文章 《MCUXpresso IDE下工程鏈接文件配置管理與自動生成機制》,這篇文章介紹了 MCUXpresso IDE 在鏈接文件管理設 ...
  • Multipass 是由Ubuntu官方提供,在Linux,MacOS和Windows上快速生成Ubuntu虛擬機的工具。它提供了一個簡單但功能強大的CLI,可讓我們在本地快速進入Ubuntu系統環境並使用Linux命令,亦可以在本地電腦創建自己的迷你型雲伺服器。總的來說就是在本地創建Ubuntu... ...
  • 一 引言 前段時間自己實現了ansible對接操作系統升級腳本,現將整個項目記錄如下,如果項目中存在問題或優化的點,請幫忙指正。本項目運行在RedHat Linux系統。 在我們生產環境中,操作系統的升級由系統升級、伺服器重啟以及vmtools安裝三部分組成。本次項目的目標有兩點: (1) ansi ...
  • 摘要:近日,經過全球知名獨立認證機構SGS Brightsight實驗室的安全評估,華為雲GaussDB企業級分散式資料庫內核獲得全球權威信息技術安全性評估標準CC EAL4+級別認證 本文分享自華為雲社區《國內唯一!GaussDB拿下的安全認證CC EAL4+究竟有多難?》,作者:GaussDB ...
  • # HTTPS server server { listen 443; server_name ************.com; ssl on; ssl_certificate cert/************.com.pem; ssl_certificate_key cert/******** ...
  • 一、數據類型存儲 在JavaScript中存在兩大數據類型:基本類型、引用類型。 基本數據類型存放在棧中,是一段簡單的數據段,數據大小確定,記憶體空間大小可以分配,是直接按值存放的,可以按值訪問。 引用數據類型存放在堆中,變數在棧中保存的是指向堆記憶體的地址值,這個地址值指向對應的對象類型,訪問堆記憶體中 ...
  • 摘要:在競爭如此激烈的當下,作為一名IT新人,怎麼才能讓HR眼前一亮,從萬千簡歷中脫穎而出成為最亮的那個崽呢? 本文分享自華為雲社區《【一行代碼秒上雲】連夜自建網站背刺我的求職對手們 !》,作者:AppCloud小助手。 前言 在競爭如此激烈的當下,作為一名IT新人,怎麼才能讓HR眼前一亮,從萬千簡 ...
  • Apache-Commons-* 字元串 判斷字元串是否為空白字元串 以前判斷字元串是否為空: if ((name == null) || (name.isEmpty())){} 使用 apache-common-lang3 的 StringUtils: void testIsBlank() { / ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...