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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...