背后的魔术师----jsp

在这里插入图片描述

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。

文章目录

  • 前言
  • 一、什么是JSP?
  • 二、如何学习jsp:
  • 三.JSP基础知识
    • JSP脚本元素
  • 四.简单的基于jsp的小项目
  • 总结


前言

想象一下,你在一家餐厅(网站),有很多工作人员(不同的技术和组件)共同协作,以便为顾客(用户)提供一顿美妙的用餐体验。在这个餐厅中,JSP(JavaServerPages)就像是那些在厨房里做出美食的厨师。顾客通过菜单(浏览器)下单(发送请求),然后厨师根据菜单上的食物项(网页),使用各种食材和调料(数据),通过一系列烹饪步骤(服务器端处理)来准备食物(生成动态内容)。
顾客坐在餐桌旁,不需要知道厨房里究竟发生了什么,他们只需要看到最终端上来的菜肴(最终的HTML页面)。厨师们使用各种烹饪工具(JSTL标签、自定义标签)来更高效地准备食物,这样做既保证了食物(网页内容)的质量,又简化了烹饪过程。厨师们的秘诀在于,他们不会在顾客面前准备这些食物,而是在厨房(服务器端)里完成这些工作,保持饭店(网站)的整洁和专业形象。
各种精心制作的烹饪秘方(EL表达式)可以帮助厨师们更快地准备食物,例如,直接告诉他们:“给我一份牛排,附带蔬菜和土豆泥”来代替传统的食谱说明。这样,厨师们就可以避免繁杂的步骤,直接从仓库(应用程序数据)中获取原料,然后制作出顾客所需的菜肴。
因此,JSP就像是背后的魔术师,让所有的请求像拉动魔法师的帽子一样,神奇地转换为含有丰富内容和功能的网页,而顾客无需知道其中的秘密,他们只需要享受这些按需定制的、即时呈现的网络“美食”。


那就开始介绍一下这个几年前非常火爆的魔术师吧

一、什么是JSP?

JSP 是 JavaServer Pages 的缩写,它是一种用于开发动态网页的服务器端技术。JSP 允许开发人员在 HTML 页面中嵌入 Java 代码,通过使用特殊的 JSP 标签来实现,特别是 <% %> 脚本元素。
当客户端(比如一个网络浏览器)请求 JSP 页面时,服务器处理这个 JSP 文件,执行其中嵌入的 Java 代码,并将结果转换成普通的 HTML,然后发送回客户端。JSP 使得网页内容可以动态地根据用户请求或数据源的数据而更改,而不是静态不变。

二、如何学习jsp:

对于新手小白来说,如何入门是个难题,对于jsp还是非常迷茫,不知道从哪里开始,那我就帮大家整理一下学习思路:
1.学习Java基础:因为JSP基于Java语言,所以先要具备Java语言的基本知识,包括了解面向对象的概念以及Java的基本语法。
2.学习HTML和CSS:因为JSP用于生成网页,所以需要了解如何编写HTML代码和使用CSS来进行网页布局和样式设计。
3.学习Servlet:JSP在服务端运行,并且与Servlet技术紧密关联。学习Servlet将帮助你更好地理解JSP页面是如何运行的。
4.直接学习JSP

  • 学习JSP的基础知识,理解JSP的生命周期。
  • 学习在JSP页面中使用Java代码的基本规则。
  • 学习JSP标签库(Tag Library),这是JSP开发中常用的一个特性。

5.学习JSP标准标签库(JSTL):JSTL是一个非常流行的标签库,它提供了一套用于常见任务的自定义标签,使得JSP代码更加简洁和易于维护。
6.学习JSP表达式语言(EL):EL允许简化访问数据和其他的Java EE平台功能。

三.JSP基础知识

1.JSP概念和原理

  • JSP是一种动态网页技术,它允许将Java代码嵌入到HTML页面中。
  • 了解JSP的工作原理,它是如何被编译为Servlet,以及如何处理客户端的请求和生成响应。

2.JSP生命周期

  • 初始化阶段:加载JSP并调用jspInit()方法进行初始化。
  • 处理请求阶段:对每个请求调用_jspService()方法处理请求并生成响应。
  • 销毁阶段:调用jspDestroy()方法进行清理工作.

3.JSP指令(Directives)

  • <%@ page … %>:定义与整个页面相关的属性,如脚本语言、缓存需求、错误处理页面等。
  • <%@ include … %>:包含其他文件到当前JSP页面。
  • <%@ taglib … %>:声明使用的标签库,如JSTL。

4.JSP脚本元素

  • 脚本片断:<% … %>,用于声明变量和方法或编写任意Java代码。
  • 表达式:<%= … %>,用于输出变量或表达式到页面上。
  • 声明:<%! … %>,用于声明JSP页面中的变量和方法。

5.JSP内置对象

  • request:代表客户端的请求。
  • response:代表对客户端的响应。
  • session:代表用户的会话。
  • application:代表整个Web应用的环境。
  • 其他对象,如 out(用于输出响应到客户端),config,pageContext 等。

6.JSP注释:使用<%-- … --%>来添加不在客户端显示的注释。
7.JSP动作(Actions)

  • jsp:include:在当前页面包含另一个页面的内容,与指令include的区别在于它是在请求时处理的。
  • jsp:forward:将请求转发到另一个页面。
  • jsp:param:用于给jsp:include和jsp:forward等动作标签传递参数。

8.错误处理

  • 创建错误页面,并使用page指令中的 errorPage 和 isErrorPage 属性来配置。

9.JSP表达式语言(EL)和JSTL

  • 学习使用EL简化对JavaBean属性、集合的访问。
  • 使用JSTL标签库来实现循环、条件判断、国际化等。

10.JSP自定义标签

  • 创建自定义标签库并使用标签来简化JSP页面上的代码。

JSP脚本元素

JSP(JavaServer Pages)中的脚本元素主要有三种类型,它们提供了将Java代码嵌入到HTML页面中的能力。
1.脚本片断(Scriptlets):
语法:<% code %>
描述:脚本片断用于在JSP页面中嵌入任何有效的Java代码。这些代码在请求被处理时执行,并且可以访问JSP内置对象。
示例:

<% 
       String name = "张三";
       // 在页面中进行逻辑处理
       if(name != null) {
           out.println("Hello, " + name);
       }
   %>

2.表达式(Expressions):
语法:<%= expression %>
描述:表达式用于在JSP页面中输出一个Java表达式的值。当页面请求处理到这一点时,表达式的结果被转换成字符串并直接嵌入到生成的HTML页面中。表达式中不需要包含分号。
示例:

 Hello, <%= name %>!

3.声明(Declarations)
语法:<%! declaration %>
描述:声明用于在JSP页面中定义变量或者方法。声明的代码被放置在转换后的Servlet类的类级别,因此在声明中定义的变量和方法可以被脚本片断和其他JSP页面结构所使用。
示例:

 <%!
       // 声明一个方法
       public String getGreeting(String name) {
           return "Hello, " + name;
       }
   %>

四.简单的基于jsp的小项目

例如:一个小型的个人博客系统,在这里用户可以查看博客列表。下面是如何用JSP和Servlet来实现这个功能的大致代码和结构说明

步骤1:创建项目结构
一个典型的JSP项目会包含至少两个主要的组件:JSP文件和一个Servlet。结构可能看起来像这样:

BlogProject
│
└───src
│   └───com
│       └───myblog
│           └───servlets
│               │   BlogServlet.java
│               
└───WebContent
    │   index.jsp
    └───WEB-INF
        │   web.xml

步骤2:写Servlet处理逻辑 (BlogServlet.java)

package com.myblog.servlets;

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

// 这个Servlet用于模拟后端业务逻辑,它会把博客文章列表发送给JSP页面进行显示

public class BlogServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 模拟从数据库中获取数据
        List<String> blogs = new ArrayList<>();
        blogs.add("欢迎来到我的博客!");
        blogs.add("JSP项目简介");
        blogs.add("今日技术分享");

        // 把获取的博客列表数据添加到请求中
        request.setAttribute("blogList", blogs);

        // 请求转发给JSP页面处理
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }
}

步骤3:编写web.xml配置Servlet (web.xml)

<web-app>
  <servlet>
    <servlet-name>BlogServlet</servlet-name>
    <servlet-class>com.myblog.servlets.BlogServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>BlogServlet</servlet-name>
    <url-pattern>/blog</url-pattern>
  </servlet-mapping>
</web-app>

步骤4:创建JSP页面 (index.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>个人博客</title>
</head>
<body>
    <h1>个人博客列表</h1>
    <ul>
        <%-- 使用JSP标准标签库(JSTL)来遍历显示博客列表 --%>
        <c:forEach var="blog" items="${blogList}">
            <li>${blog}</li>
        </c:forEach>
    </ul>
</body>
</html>

在这个例子中,用户访问/blog URL时,BlogServlet会被触发。Servlet从模拟数据库中获取博客文章列表,然后把列表作为属性设置到请求对象中,并将请求转发给index.jsp页面。index.jsp页面使用JSP标准标签库(JSTL)来遍历列表,并显示每篇博客的标题。这里只是一个非常简单的示例,实际项目中通常会涉及到更复杂的逻辑和结构。


总结

关于jsp的知识我们介绍到这里,还有很多有关的问题我们后面会继续学习.希望大家可以从本篇博客中学会如何入门,对小白来说可能有了学习地方向不会害怕去接受新事物.

感谢大家抽出宝贵的时间来阅读博主的博客,新人博主,感谢大家关注点赞,祝大家未来的学习工作生活一帆风顺,加油!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(四十四)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

Linux编译实时内核和打补丁

目录 1.Linux内核2.实时内核3.编译实时内核3.1 准备3.2 获取内核源码3.3 编译3.4 设置GRUB确保启动到实时内核 4.给内核打补丁5.安装新的内核 1.Linux内核 https://github.com/torvalds/linux Linux内核是Linux操作系统的核心部分&#xff0c;它是操作系统的基本组成部分&…

研发日记,Matlab/Simulink避坑指南(七)——数据溢出钳位Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(三)——向上取整Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑…

棋盘(来源:第十四届蓝桥杯省赛JavaA/C/研究生组 , 第十四届蓝桥杯省赛PythonC组)

小蓝拥有 nn大小的棋盘&#xff0c;一开始棋盘上全都是白子。 小蓝进行了 m 次操作&#xff0c;每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色&#xff0c;黑色棋子变为白色)。 请输出所有操作做完后棋盘上每个棋子的颜色。 输入格式 输入的第…

Qt扩展-QXlsx读写Excel配置使用

QXlsx读写Excel配置使用 一、概述1. 功能概述2. 其他维护 二、安装1. 下载源码2. 配置项目3. 测试代码4. 运行结果 一、概述 项目介绍&#xff1a;https://qtexcel.github.io/QXlsx/Example.html GitHub&#xff1a;https://github.com/QtExcel/QXlsx/tree/master QXlsx 是一个…

【算法】闇の連鎖(树上差分,LCA)

题目 传说中的暗之连锁被人们称为 Dark。 Dark 是人类内心的黑暗的产物&#xff0c;古今中外的勇者们都试图打倒它。 经过研究&#xff0c;你发现 Dark 呈现无向图的结构&#xff0c;图中有 N 个节点和两类边&#xff0c;一类边被称为主要边&#xff0c;而另一类被称为附加边…

C++设计模式介绍:优雅编程的艺术

物以类聚 人以群分 文章目录 简介为什么有设计模式&#xff1f; 设计模式七大原则单一职责原则&#xff08;Single Responsibility Principle - SRP&#xff09;开放封闭原则&#xff08;Open/Closed Principle - OCP&#xff09;里氏替换原则&#xff08;Liskov Substitution …

【C++修行之道】STL(初识list、stack)

目录 一、list 1.1list的定义和结构 以下是一个示例&#xff0c;展示如何使用list容器: 1.2list的常用函数 1.3list代码示例 二、stack 2.1stack的定义和结构 stack的常用定义 2.2常用函数 2.3stack代码示例 一、list 1.1list的定义和结构 list的使用频率不高&#…

常见的核函数

在机器学习中&#xff0c;特别是在支持向量机&#xff08;SVM&#xff09;和其他基于核的方法中&#xff0c;核函数是一种用来计算数据点在高维空间中相对位置的方法。核函数能够使得算法在不显式地映射数据到高维空间的情况下&#xff0c;仍然能够处理线性不可分的数据。常见的…

RPC教程 6.负载均衡

1.负载均衡策略 假设有多个服务实例&#xff0c;而每个实例都提供相同的功能&#xff0c;为了提高整个系统的吞吐量&#xff0c;每个实例部署在不同的机器上。客户端可以选择任意一个实例进行调用&#xff0c;获取想要的结果。那如何选择呢&#xff1f;取决于负载均衡的策略。…

【WPF.NET开发】WPF中的双向功能

本文内容 FlowDirectionFlowDocumentSpan 元素非文本元素的 FlowDirection数字替换 与其他任何开发平台不同&#xff0c;WPF 具有许多支持双向内容快速开发的功能&#xff0c;例如&#xff0c;同一文档中混合了从左到右和从右到左的数据。 同时&#xff0c;WPF 也为需要双向功…

JVM基础知识汇总篇

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

企业计算机中了360后缀勒索病毒怎么办,360后缀勒索病毒解密流程

企业计算机服务器在生产运营过程中发挥着巨大作用&#xff0c;为企业带来极大便利&#xff0c;存储着企业的重要核心数据&#xff0c;但同时也成为众多勒索病毒攻击的目标。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了360后缀勒索…

多文件开发

当所有的类都写在main.m这个源文件之中、将不利于后期的维护和团队开发 推荐的方式 把1个类写在1个模块之中&#xff0c;而1个模块至少包含两个文件 h头文件 1.写的类声明因为要用到Foundation框架中的类NS0 bject所以在这个头文件中要引入 Foundationa 2.框架的头文件 3.然后…

qemu搭建arm64 linux kernel环境

一、环境准备 ubuntu 22.04 内核源码&#xff1a;linux-6.6.1 &#xff08;直接上最新版&#xff09; 下载链接&#xff1a;The Linux Kernel Archives 交叉编译工具链&#xff1a; sudo apt-get install gcc-12-aarch64-linux-gnu 具体能用的版本gcc-XX-arch64-linux-gnu…

python_ACM模式《剑指offer刷题》链表2

题目&#xff1a; 例如 面试tips&#xff1a; 询问有无时间复杂度或空间复杂度的限制。 思路&#xff1a; 本题的本质就是复杂链表的深拷贝 1. 暴力解法 → 第一次遍历原链表时构建一个复制了next的新链表&#xff0c;第二次遍历原链表&#xff0c;对每个原链表的节点的ran…

幻兽帕鲁服务器多少钱?4核16G支持32人在线吗?

4核16G服务器是幻兽帕鲁Palworld推荐的配置&#xff0c;阿里云和腾讯云均推出针对幻兽帕鲁的4核16G服务器&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。云服务器吧yunfuwuqiba.com分享…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

node.js Redis SETNX命令实现分布式锁解决超卖/定时任务重复执行问题

Redis SETNX 命令背后的原理探究 当然&#xff0c;让我们通过一个简单的例子&#xff0c;使用 Redis CLI&#xff08;命令行界面&#xff09;来模拟获取锁和释放锁的过程。 在此示例中 获取锁: # 首先&#xff0c;设置锁密钥的唯一值和过期时间(秒) 127.0.0.1:6379> SET …

ChatGPT 官方中文页面上线

根据页面显示&#xff0c;OpenAI 现已推出 ChatGPT 的多语言功能 Alpha 版测试&#xff0c;允许用户选择不同语言的界面进行交互。 如下图所示&#xff0c;ChatGPT 会检测系统当前所使用的语言&#xff0c;并提示用户进行语言切换。 用户也可通过设置页面选择其他语言。目前&a…