JSP学习日记

2023/11/29 18:05:20

JSP简述

Java Sever Pages----->Java服务器界面 用于前后端结合

jsp为什么淘汰?

由于JSP的前后端耦合性极高,编写代码非常臃肿。前后端的代码放在一起,所以JSP可以看成是已经被淘汰的技术。

为什么还要学jsp?

由于一些公司的项目较老,更新换代成本较高,只能选择不断维护。而维护的同时就需要用到jsp老知识
JSP在编译后也是一个和Java文件,并且会生成class文件,可以打开Tome cat 指定路径查看:

D:\simon\tools\Tomcat\apache-tomcat-8.5.20\work\Catalina\localhost\ROOT\org\apache\jsp
在这里插入图片描述
由此可以得出:

JSP本质上就是一个Servlet

JSP生成Java文件剖析

下面是JSP文件编译后生成的Java文件

// 类声明定义
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {

可以看出 index_jsp继承了HttpJspBase类,继续向上找,发现HttpJspBase继承了JspPage,JspPage继承了Servlet

public interface HttpJspPage extends JspPage {
public interface JspPage extends Servlet {

所以说JSP就是一个Servlet

JSP语法

<!-- HTML注释 -->
<%-- JSP注释 --%>

JSP声明语句: <%!%>
特点:定义全局变量,可以声明方法、类、支持任意Java数据类型

<!-- JSP声明语句 -->
<%! 
    String str = "全局变量";
    static{
    System.out.println("静态代码块");
} %>

JSP表达式:<%=%>
特点:常用于输出内容、插入表达式

<input type="text" name="<%= 变量或表达式 %>" value="<%= 变量或表达式%>">

JSP脚本程序:<%%>
特点:定义局部变量、编写语句 不能定义方法 也可输出内容

<% for (int i = 0; i < 10; i++) { %>
<h1>HELLO WORLD <%= i %></h1>
<% } %>

注释:

<!-- HTML注释 -->
<%-- JSP代码注释 --%>
区别:在网页中查看源代码时:jsp注释不会显示,但HTML注释会显示

JSP指令

Page

  1. 定制错误页面
<%-- 头文件page 声明了页面类型  编码集  语言等 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 显示声明这个是一个错误界面 --%>
<%@ page isErrorPage="true" %> 
<%-- 错误页面也可以在web.xml中声明 如下: --%>
<!--  ERROR Page  -->
    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
    </error-page>
  1. 其他指令如:autoFlush:是否被刷新 import : 导包 …

include

<%-- 提取公共页面   例如网页的头部尾部导航栏 --%>
<%@ include file="./beInclude.jsp" %>
<!-- @include 属于是将另一个页面包含进来  所以一旦出现同名变量就会报错 -->
<!-- --------------- -->
<!-- 利用jsp标签 属于是将页面进行拼接 每个页面中的变量相互独立 -->
<%--  也可以用jsp标签提取公共页  --%>
  <jsp:include page="beInclude.jsp"/>

taglib

标签库 引入:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSP的内置对象

在第一次访问jsp网页时,会由服务器将该jsp文件转换为Java文件并生成字节码文件,在生成的Java文件中会包含经常使用的一些内置对象

// 如下所示
final javax.servlet.jsp.PageContext pageContext; // 上下文
final javax.servlet.ServletContext application;// 存储数据
final javax.servlet.ServletConfig config; // 配置信息
javax.servlet.jsp.JspWriter out = null;  // 输出
final java.lang.Object page = this;   // 当前页面
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
// 除此之外 还包含了
HttpRequest req  // 请求
HttpResponse resp  // 响应
Execption // 异常错误

九大内置对象

  1. PageContext // 可以访问所有的jsp内置对象
// 常用
pageContetx.getRequest()//返回当前页面中的request对象。
pageContetx.getResponse()//使用此方法将返回当前页面中的response对象。
pageContetx.getPage()//此方法返回当前页面中的page对象。
pageContetx.getSession()//返回当前页面中的session对象。
pageContetx.getOut()//返回当前页面中的out对象。
pageContetx.setAttribute(String name)//给指定的属性名设置属性值。
pageContetx.getAttribute(String name)//根据属性名称找到相应的属性值。
pageContetx.findAttribute(String name)//寻找一个属性并返回,如果没有找到则返回一个null。
  1. Request // 请求
request.setAttribute(String name,Object value) //储存此请求中的属性
request.getAttribute(String name) //返回指定属性的属性值
request.getParameter(String name) //返回name指定参数的参数值
request.getParameterValues(String name) //返回包含参数name的所有值的数组
  1. Response
response.getCharacterEncoding() //返回响应用的是何种字符编码
response.getWriter() //返回可以向客户端输出字符的一个对象
response.sendRedirect(java.lang.String location) //重新定向客户端的请求
  1. Session
session.getId()//返回session的ID号
session. setAttribute(String name,Object value)//将value值存在session域中,名字为name
session.getAttribute(String name)//返回与此会话中的指定名称绑定在一起的值,如果没有值绑定在该名称下,则返回null
session.invalidate()//销毁session
  1. out
  2. aplication
application.setAttribute(key,value)//设置应用对象中指定名字的属性值
application.getAttribute(key)//获取应用对象中指定名字的属性值
application.getAttributeNames()//获取应用对象中所有属性的名字 枚举
  1. config
  2. Page
  3. execption

pageContext.setAttribute的作用域

// 只在一个网页中有效
pageContext.setAttribute("name1","张一");
// 只在一个请求中有效  请求转发时将会携带
request.setAttribute("name2","张二");
// 在一次会话中均可读取  打开浏览器到关闭浏览器
session.setAttribute("name3","张三");
// 在服务器中有效  从打开服务器到关闭服务器
application.setAttribute("name4","张四");

使用场景:

  1. request: 客户端向服务端请求的数据,用过之后即销毁。再次请求需要重新加载----> 新闻
  2. Session : 用户向服务器请求得到的数据需要保存,后续还会使用 购物车
  3. application: 用户向服务器发送请求,使用该数据,使用完毕后还可以给其他用户使用

JSP标签

  1. <jsp:forward page="beInclude.jsp">
        <jsp:param name="name" value="张三"/>
        <jsp:param name="age" value="18"/>
      </jsp:forward>
    <%-- 在另一jsp中获取 --%>
    姓名:<%= request.getParameter("name")%>
    年龄:<%= request.getParameter("age")%>
    // 注意处理编码问题
    

EL表达式

全称 Express Language

  • 获取数据
    按照域对象从小到大进行获取,依次是:
    pageContext < request < Session < application

  • 执行运算

  • 获取Web

<%
    pageContext.setAttribute("name","张三");
    request.setAttribute("name","张四");
    session.setAttribute("name","张五");
    application.setAttribute("name","张六");
    List<String> list = new ArrayList<>();
    list.add(0,"张三");
    list.add(1,"张四");
    list.add(2,"张五");
    list.add(3,"张六");
    list.add(4,"张七");
    request.setAttribute("list",list);
%>
<pre>
  获取pageContext作用域中的name: ${pageScope.name}
  获取request作用域中的name: ${requestScope.name}
  获取session作用域中的name: ${sessionScope.name}
  获取application作用域中的name: ${applicationScope.name}
    获取集合指定索引的数据:${list[0]} ${list[4]}
<%--  张三 和  张七  --%>
    获取集合长度:${list.size()}
</pre>

http://www.jnnr.cn/a/154083.html

相关文章

【机器学习项目实战10例】(三):基于K近邻的葡萄酒质量检测项目

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、基于K近邻的葡萄酒质量检测项目二、数据集介绍三、导包四、读取数据五、绘制空间分布六、划分训练集、测试集七、构建K近邻模型八、绘制聚类效果九、网格搜索一、基于K近邻的葡萄酒质量检测项目 葡萄酒数据集是一个经典…

APP逆向案例之(三)sign 参数破解

说明&#xff1a;某新闻APP sign 参数 抓包发现包含内容&#xff1a; url: https://124.*.*.*/api/categorynews/lists 参数&#xff1a; 其中 sign 参数是需要变化的否则访问失败&#xff0c;其余都是固定的 page: 3, size: 10, category: -2, from: -1, lng: 116.363…

Date对象

文章目录Date日期对象Date对象的创建格式化日期3.获取Date总的毫秒数(时间戳)&#xff0c;是距离1970年1月1日过了多少毫秒数。二&#xff1a;常用时间获取方法三&#xff1a;日期设置方法四&#xff1a;时间转字符串菜鸟工具&#xff1a;https://www.runoob.com/jsref/jsref-o…

有监督学习神经网络的回归拟合——基于红外光谱的汽油辛烷值预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Java#27(Arrays)

目录 一.Arrays 操作数组的工具类 二.Lambda表达式 1.注意: 2.省略规则 一.Arrays 操作数组的工具类 方法名 作用 public static String toString(数组) 把数组拼接…

代码随想录65——额外题目【二叉树】:129求根节点到叶节点数字之和、1382将二叉搜索树变平衡、100相同的树、116填充每个节点的下一个右侧节点指针

文章目录1.129求根节点到叶节点数字之和1.1.题目1.2.解答2.1382将二叉搜索树变平衡2.1.题目2.2.解答3.100相同的树3.1.题目3.2.解答4.116填充每个节点的下一个右侧节点指针4.1.题目4.2.解答4.2.1.递归解法4.2.2.迭代方法1.129求根节点到叶节点数字之和 参考&#xff1a;代码随…

机器学习笔记之贝叶斯线性回归(一)线性回归背景介绍

机器学习笔记之贝叶斯线性回归——线性回归背景介绍引言回顾&#xff1a;线性回归场景构建从概率密度函数认识最小二乘法回顾&#xff1a;最小二乘估计回顾&#xff1a;线性回归与正则化关于线性回归的简单小结贝叶斯线性回归贝叶斯方法贝叶斯方法在线性回归中的任务贝叶斯线性…

cocos creator实现浏览星球的功能,附源码

预览效果&#xff1a; 技术要点&#xff1a; 主摄像机的视场轴需要设置为水平。在场景下创建一个空节点用于挂载控制器脚本图片已进行各概念的说明 在“collisionNodeArray”属性下&#xff0c;放置需要点击的星球节点&#xff0c;系统会自己绑定碰撞器。 也可自己提前绑定。 布…

现代密码学导论-16-选择明文攻击和CPA安全

目录 PCA不可区分实验 DEFINITION 3.21 PCA安全的加密方案 LR预言机实验 DEFINITION 3.22 多明文PCA安全的加密方案 THEOREM 3.23 定义3.21和定义3.22等价 PCA不可区分实验 通过运行G(1^n)获得密钥k敌手A被给定输入1^n并拥有访问预言机Enck()的权利&#xff0c;敌手A输出一…

Day12--自定义组件-渲染my-search组件的基本结构

1.自定义搜索组件 我的操作&#xff1a; 1》在uni_modules中右键新建uni_modules插件&#xff1a; 2》看看效果图&#xff1a; ************************************************************************************************************** 2.在分类页面的 UI 结构中&…

Linux进程管理【进程的相关介绍片、ps、 kill 、pstree】【详细整理】

目录进程相关介绍显示系统执行的流程 psps 详解![请添加图片描述](https://img-blog.csdnimg.cn/cd9f10bf36684b419f2f94068afb9a03.png)案例终止进程kill 和 killall基本语法常见选型案例查看进程数pstreepstree [选项]&#xff0c;可以更加直观的来查看进程信息进程相关介绍 …

[计算机毕业设计]远程监督的跨语言实体关系抽取

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

Flutter高仿微信-第52篇-群聊-清空聊天记录

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; //清空聊天记录对话框 void _cleanGroupChatDialog(){Lo…

【机器学习项目实战10例】(二):利用LightGBM实现天气变化的时间序列预测

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、利用LightGBM实现天气变化的时间序列预测二、加载数据三、将数据进行标准化四、形成训练数据五、划分训练集、测试集六、定义模型七、模型训练八、训练集、测试集验证九、网络搜索十、绘制结果一、利用LightGBM实现天气变…

springboot整合其它项目(连接池和监控)

目录 一、整合Druid 1. Druid是什么&#xff1f; 2.如何在Spring Boot中集成Druid连接池和监控&#xff1f; 二、整合Redis 1.集成redis之非注解式开发 2.集成redis之注解缓存开发 一、整合Druid 1. Druid是什么&#xff1f; Druid是Java语言中最好的数据库连接池。…

CyberController手机外挂番外篇:源代码的二次修改

文章目录前言调试过程中的疑问为什么一段时间不使用CyberController&#xff0c;翻译就无法触发了&#xff1f;为什么连接成功了&#xff0c;但却依然无法进行语音识别和翻译&#xff1f;多长时间TCP连接就会挂掉连接正常与断开连接有什么区别&#xff1f;不停进行翻译&#xf…

工业动态界面设计 GLG Toolkit 4.2 Crack-GlgCE.4.2_x64

GLG Toolkit是为开发高级图形的动态界面而设计的框架&#xff1a;不只是简单的按钮和选单&#xff0c;而且是完全动画的图形对象&#xff0c;它能够显示动态数据和作出与用户交互的反应。它不仅是一个能够创建很多“漂亮的图片”绘图工具&#xff0c;而且它的图形引擎允许开发人…

猴子也能学会的jQuery第十期——jQuery元素操作(下)

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

Linux系统编程(四)——signal信号处理

目录 0x01 信号 0x02 信号相关的函数 一、kill函数 二、alarm()函数 三、setitimer() 四、signal() 0x03 信号集 一、信号集的处理过程 ​编辑 二、关于信号集处理的函数 0x04 内核实现信号捕捉的过程 0x05 SIGCHLD信号 0x01 信号 信号是Linux进程间通信的最古老的…

8.3 数据结构——交换排序

基本思想&#xff1a;两两比较&#xff0c;如果发生逆序则交换&#xff0c;直到所有记录都排好序为止。 常见的交换排序&#xff1a;&#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 8.3.1 冒泡排序 基本思想&#xff1a;每趟不断将记录两两比较&…
最新文章