使用JSP踩過的坑

雖然說jsp已經過時了,但是有時維護比較老的項目還是需要的。

下面說下,我使用jsp踩過的坑:

1.關于打印輸出

在jsp中輸出使用

out.println("hello");

而不是

System.out.println("hello");

如果在定義函數部分需要打印輸出,需要注入JspWriter個對象。

<%! // 示例方法:模擬獲取用戶信息的方法String getUserInfo(String token, JspWriter out) {// 你的實際邏輯return "username";}
%>
<%String user = getUserInfo(token, out);
%>

2.關于頁面跳轉

response.sendRedirect(url);

如果使用該函數進行跳轉,有個問題需要注意:就是現在很多應用都是單頁面應用(SPA),如果遇到URL路徑中有“#”的情況下,服務端會忽略掉“#”后面的片段再進行跳轉,這樣會導致無法跳轉到正常的頁面上。

這時候建議使用前端跳轉,例如:

<!-- 統一由前端跳轉 -->
<script>
window.location.href = '<%= redirectUrl %>';
</script>

3.關于return

在java代碼部分,如果提前return,那么不止后面java代碼的命令不會被執行了,連前端代碼也不會被執行了。jsp頁面會終止所有輸出。

之前我一直以為只會終止java代碼部分,不會終止前端代碼部分。導致前端代碼一直沒被執行,排查了好久,才將問題排除出來。

4.參數獲取

request.getParameter 方法可以 統一獲取請求中的參數值,不論是通過 GET 還是 POST 方式提交的請求。

  • 對于 GET 請求:參數在 URL 的查詢字符串中(即 ?name=value 那部分)。
  • 對于 POST 請求:如果是表單提交,參數通常在請求體中。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>獲取參數示例</title>
</head>
<body>
<%// 獲取名為paramName的參數值String paramValue = request.getParameter("paramName");if (paramValue != null && !paramValue.isEmpty()) {out.println("參數值為: " + paramValue);} else {out.println("沒有提供參數或者參數為空。");}
%>
</body>
</html>

5.關于<%! %><% %>

之前我一直以為兩個標簽是一個意思,所以把代碼放一起像js那樣使用,把聲明和調用按順序排下來。后來發現代碼不生效,才發現兩者是兩碼事。

<%! %>:這個標簽用于聲明類級別的變量和方法。任何在<%! %>標簽內定義的內容都會被插入到由JSP生成的Servlet類的主體中,但位于類的任意一個方法之外。這意味著你可以在<%! %>標簽內聲明實例變量、靜態變量以及方法。

<% %>:這個標簽被稱為JSP Scriptlet,允許你在JSP頁面中嵌入Java代碼段。Scriptlet中的代碼會被直接插入到由JSP生成的Servlet類的_jspService()方法中。這意味著任何在Scriptlet中聲明的變量都是局部變量,僅在該Scriptlet的作用域內有效。

總結來說,<%! %>用于聲明在整個JSP頁面范圍內都可以訪問的方法或變量(即類級別),而<% %>則用于編寫具體的Java代碼塊,這些代碼塊將作為Servlet的服務方法的一部分被執行(即方法級別)。兩者的主要區別在于它們定義的位置和作用范圍。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81296.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis集群創建時手動指定主從關系的方法

適用場景&#xff1a; 創建主從關系時默認參數 --cluster-replicas 1 會自動分配從節點。 為了能精確控制 Redis Cluster 的主從拓撲結構&#xff0c;我們通過 Redis Cluster 的手動分片功能來實現 一、手動指定主從關系的方法 使用 redis-cli --cluster-replicas 0 先創建純…

ROS合集(七)SVIn2聲吶模塊分析

文章目錄 一、整體思想二、具體誤差建模流程三、總結明確&#xff08;預測值與觀測值&#xff09;四、選點邏輯五、Sonar 數據處理流水線1. ROS Launch 配置&#xff08;imagenex831l.launch&#xff09;2. SonarNode 節點&#xff08;sonar_node.py&#xff09;3. Subscriber …

Python爬蟲實戰:研究PySpider框架相關技術

1. 引言 1.1 研究背景與意義 網絡爬蟲作為互聯網數據采集的重要工具,在信息檢索、輿情分析、市場調研等領域發揮著重要作用。隨著互聯網信息的爆炸式增長,如何高效、穩定地獲取所需數據成為了一個關鍵挑戰。PySpider 作為一款功能強大的 Python 爬蟲框架,提供了豐富的功能…

《大模型開源與閉源的深度博弈:科技新生態下的權衡與抉擇》

開源智能體大模型的核心魅力&#xff0c;在于它構建起了一個全球開發者共同參與的超級協作網絡。想象一下&#xff0c;來自世界各個角落的開發者、研究者&#xff0c;無論身處繁華都市還是偏遠小鎮&#xff0c;只要心懷對技術的熱愛與追求&#xff0c;就能加入到這場技術狂歡中…

大數據模型對陌生場景圖像的識別能力研究 —— 以 DEEPSEEK 私有化部署模型為例

摘要 本研究聚焦于已訓練的大數據模型能否識別未包含在樣本數據集中的陌生場景圖像這一問題&#xff0c;以 DEEPSEEK 私有化部署模型為研究對象&#xff0c;結合機器學習理論&#xff0c;分析模型識別陌生場景圖像的影響因素&#xff0c;并通過理論探討與實際應用場景分析&…

STM32——從點燈到傳感器控制

STM32基礎外設開發&#xff1a;從點燈到傳感器控制 一、前言 本篇文章總結STM32F10x系列基礎外設開發實例&#xff0c;涵蓋GPIO控制、按鍵檢測、傳感器應用等。所有代碼基于標準庫開發&#xff0c;適合STM32初學者參考。 二、硬件準備 STM32F10x系列開發板LED模塊有源蜂鳴器…

[特殊字符] 使用增量同步+MQ機制將用戶數據同步到Elasticsearch

在開發用戶搜索功能時&#xff0c;我們通常會將用戶信息存儲到 Elasticsearch&#xff08;簡稱 ES&#xff09; 中&#xff0c;以提高搜索效率。本篇文章將詳細介紹我們是如何實現 MySQL 到 Elasticsearch 的增量同步&#xff0c;以及如何通過 MQ 消息隊列實現用戶信息實時更新…

MyBatis緩存機制全解析

在MyBatis中&#xff0c;緩存分為一級緩存和二級緩存&#xff0c;它們的主要目的是減少數據庫的訪問次數&#xff0c;提高查詢效率。下面簡述這兩種緩存的工作原理&#xff1a; 一、 一級緩存&#xff08;SqlSession級別的緩存&#xff09; 一級緩存是MyBatis默認開啟的緩存機…

【短距離通信】【WiFi】WiFi7關鍵技術之4096-QAM、MRU

目錄 3. 4096-QAM 3.1 4096-QAM 3.2 QAM 的階數越高越好嗎&#xff1f; 4. MRU 4.1 OFDMA 和 RU 4.2 MRU 資源分配 3. 4096-QAM 摘要 本章主要介紹了Wi-Fi 7引入的4096-QAM對數據傳輸速率的提升。 3.1 4096-QAM 對速率的提升 Wi-Fi 標準一直致力于提升數據傳輸速率&a…

【二刷力扣】【力扣熱題100】今天的題目是:283.移動零

題目&#xff1a; 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸…

機器學習中的多GPU訓練模式

文章目錄 一、數據并行&#xff08;Data Parallelism&#xff09;二、模型并行&#xff08;Model Parallelism&#xff09;1. 模型并行2. 張量并行&#xff08;Tensor Parallelism&#xff09; 三、流水線并行&#xff08;Pipeline Parallelism&#xff09;四、混合并行&#x…

《JavaScript 性能優化:從原理到實戰的全面指南》

《JavaScript 性能優化&#xff1a;從原理到實戰的全面指南》 一、JavaScript 性能優化基礎理論 在深入探討 JavaScript 性能優化技術之前&#xff0c;我們需要明白JavaScript 的執行機制和性能瓶頸產生的根本原因。JavaScript 是一種單線程、非阻塞的腳本語言&#xff0c;其…

選擇合適的Azure數據庫監控工具

Azure云為組織提供了眾多服務&#xff0c;使其能夠無縫運行應用程序、Web服務和服務器部署&#xff0c;其中包括云端數據庫部署。Azure數據庫能夠與云應用程序實現無縫集成&#xff0c;具備可靠、易擴展和易管理的特性&#xff0c;不僅能提升數據庫可用性與性能&#xff0c;同時…

9.4在 VS Code 中配置 Maven

在 VS Code 中配置 Maven 需要完成 Maven 環境安裝 一、安裝 Maven&#xff08;如果未安裝&#xff09; 下載 Maven 訪問 Apache Maven 官網&#xff0c;下載最新版本的 Maven&#xff08;如apache-maven-3.9.9-bin.zip&#xff09;。 解壓文件 將下載的 ZIP 文件解壓到本地目…

影刀自動化流程復用技巧:流程復用

草莓時刻會創建一個新的空白流程。但是很多時候需要復用過往基礎流程&#xff0c;在此基礎上進行修改即可。而而不是重新創建基礎流程。 為了解決這個問題&#xff0c;我們需要了解一下影刀流程的基礎結構。 影刀流程基礎結構概覽 影刀自動化流程的基礎結構主要包括幾個關鍵組…

理論篇六:如何在Webpack中實現持久化緩存?

在 Webpack 中實現持久化緩存可以顯著提升構建速度,尤其是在大型項目中。以下是 7 種核心策略 及其詳細配置方法: 一、文件哈希命名(Content Hash) 確保文件內容變化時哈希值才改變,利用瀏覽器緩存。 // webpack.config.js output: {filename: [name].[contenthash:8].j…

C++單例模式與線程安全

C單例模式的線程安全實踐與優化-CSDN博客 https://www.zhihu.com/question/56527586/answer/2344903391 C11中的單例模式 在C11及更高版本中&#xff0c;可以使用std::call_once和std::once_flag來確保單例實例的線程安全初始化。這種方法不需要顯式地使用互斥鎖&#xff0c…

UE5 圖片導入,拖到UI上變色

UE5會自動把藍色的圖片當成法線貼圖處理&#xff0c;非常傻逼 雙擊出問題的圖片&#xff0c;右側面板將壓縮設置從法線改回默認

服務器安裝xfce桌面環境并通過瀏覽器操控

最近需要運行某個瀏覽器的腳本&#xff0c;但是服務器沒有桌面環境&#xff0c;無法使用&#xff0c;遂找到了KasmVNC&#xff0c;并配合xfce實現低占用的桌面環境&#xff0c;可以直接使用瀏覽器進行操作 本文基于雨云——新一代云服務提供商的Debian11服務器操作&#xff0c;…

Python函數全面解析:從基礎到高級特性

文章目錄 Python函數全面解析&#xff1a;從基礎到高級特性一、函數基礎概念1. 什么是函數&#xff1f;2. 函數的組成部分 二、函數的參數傳遞1. 參數類型對比2. 參數傳遞示例 三、函數的作用域作用域示例global和nonlocal關鍵字 四、函數的屬性和方法1. 函數的特殊屬性2. 函數…