JSP原理以及基本语法

news2024/9/21 10:38:40

1、JSP原理

什么是JSP?

Java Server Pages:Java服务器页面,和Servlet一样是动态Web技术!

和HTML的区别?

  • HTML是静态页面。
  • 在JSP页面中可以嵌入Java代码,为用户提供动态的数据。

JSP 和 Servlet 的关系?

  • JSP最终会被转换为一个Java类,JSP的本质就是一个Servlet!
  • 我的在访问 index_jsp 时,会自动生成一个Java 类 index_jsp,它继承了 HttpJspBase,HttpJspBase 又继承了 HttpServlet。
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements  org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports{
//...
}

1、内置对象

    final javax.servlet.jsp.PageContext pageContext;    //页面上下文对象
    javax.servlet.http.HttpSession session = null;    //session
    final javax.servlet.ServletContext application;    //applicationContext
    final javax.servlet.ServletConfig config;    //servletConfig
    javax.servlet.jsp.JspWriter out = null;    //out
    final java.lang.Object page = this;    //page
    HttpServletRequest    request        //请求
    HttpServletResponse    response        //响应

 2、输出页面前增加的代码

      response.setContentType("text/html;charset=utf-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

3、输出到页面

显示一个hello world和静态页面。

      out.write("  \r\n");
      out.write("  <HTML>\r\n");
      out.write("<body>\r\n");
      out.write("<h1>hello world</h1>\r\n");
      out.write("</body>\r\n");
      out.write("</HTML>\r\n");
      out.write("\r\n");

4、JSP页面内直接调用上面的对象

通过 ${}来调用

5、JSP实现过程

index.jsp-> index_jsp.java -> index_jsp.class`-> Servlet程序

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>

<%
    String name = "李元芳";
%>

hello <%=name%>
</body>
</html>

运行结果:

 2、JSP 基础语法

1、JSP表达式

用来将程序的输出结果输出到客户端

<%--在客户端页面中显示当前时间--%>
<%= new java.util.Date()%>

2、JSP脚本片段

输出1到100的和,JSP脚本片段中的变量都是唯一的,因为它最终会变成一个Servlet类,因此不同代码片段中可以互相访问变量。

<%
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        sum += i;
    }
    out.println("<h1>Sum = "+ sum + "</h1>");
%>

3、全局变量的定义

相当于我们Java类下面的全局变量和方法的声明。

<%!
    private String word = "hello";
    public static void sayHi(String name){
        System.out.println("hello " + name);
    }
%>

4、JSP指令

1、jsp 设置错误页面

语法:<%@ page  %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page errorPage="error/500.jsp" %>

<html>
<head>
</head>
<body>
<%--    制造一个500的错误--%>
<%
    int x = 100/0;
%>
</body>
</html>

 因为我们的服务器代码中有错误,所以会报一个500的错误,我们设置如果当前页面报错就跳转到 500.jsp 中。

2、在 web.xml 中指定错误页面

    <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>

3、公共页面

两种实现方式:

  • <%@ include file="common/header.jsp"%>
  • <jsp:include page="common/header.jsp"/>

        更推荐使用 下面的,因为下面的本质还是三个网页,但上面的本质是将标签合并成一个网页,所以合并后很容易造成变量冲突。

 像这种不管哪个页面上面都是这种公共的头部,我们可以设置公共网页嵌入jsp页面当中。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
    <%-- 原理:将三个页面合并为一个,提取标签 --%>
    <%@ include file="common/header.jsp"%>
    <%-- 效果和上面一样,不过这个的本质还是三个网页 --%>
    <jsp:include page="common/header.jsp"/>
    <hr>
    这里是网页主体
    <hr>

    <%@ include file="common/footer.jsp"%>
</body>
</html>

3、JSP9大内置对象(重点!!!)

  • PageContext        存东西
  • Request        存东西
  • Response
  • Session     存东西
  • Application【ServletContext】存东西
  • config【ServletConfig】
  • out   【JSPWriter】
  • page

测试

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--内置对象--%>

<%
    pageContext.setAttribute("name1","鲁班一号");
    request.setAttribute("name2","鲁班二号");
    session.setAttribute("name3","鲁班三号");
    application.setAttribute("name4","鲁班四号");
%>

<%--Java脚本片段需要使用Java语法的注释 因为它会原封不动低生成到 .JSP.java--%>
<%
    //通过pageContext取出节点的值
    Object name1 = pageContext.findAttribute("name1");  //保存的数据只在一个页面中有效
    Object name2 = pageContext.findAttribute("name2");  //保存的数据值在一次请求中有效,请求转发时会携带这个数据
    Object name3 = pageContext.findAttribute("name3");  //保存的数据值在一次会话中有效,从打开浏览器到关闭浏览器
    Object name4 = pageContext.findAttribute("name4");  保存的数据值在服务器中有效,从打开服务器到关闭服务器
    Object name5 = pageContext.findAttribute("name5");//不存在

%>

<h1>取出的Attribute节点的值</h1>
<%--使用el表达式输出--%>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>

<%--如果不存在会返回 null 但使用el表达式会自动过滤掉它--%>
<%=name5%>

</body>
</html>

使用el表达式

运行结果:

直接使用 <%=%>显示变量

运行结果:

 在另一个新页面中访问新页面的节点Attribute的值

<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    //通过pageContext取出PageContextDemo01.jsp 中节点的值
    Object name1 = pageContext.findAttribute("name1");  //保存的数据只在一个页面中有效
    Object name2 = pageContext.findAttribute("name2");  //保存的数据值在一次请求中有效,请求转发时会携带这个数据
    Object name3 = pageContext.findAttribute("name3");  //保存的数据值在一次会话中有效,从打开浏览器到关闭浏览器
    Object name4 = pageContext.findAttribute("name4");  保存的数据值在服务器中有效,从打开服务器到关闭服务器
    Object name5 = pageContext.findAttribute("name5");//不存在

%>
<h1>取出PageContextDemo01.jsp 的Attribute节点的值</h1>
<%--使用el表达式输出--%>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>

</body>
</html>

运行结果: 

pageContext.setAttribute(String s,Object o,int scope)

 上面我们是通过不同的内置对象来实现不同的数据的作用域,在JSP中,其实还有一种只需要通过PageContext对象就可以设置多种作用域的方法。

//scope: 作用域
public void setAttribute(String name, Object attribute, int scope) {
        switch(scope) {
        case 1:
            this.mPage.put(name, attribute);
            break;
        case 2:
            this.mRequest.put(name, attribute);
            break;
        case 3:
            this.mSession.put(name, attribute);
            break;
        case 4:
            this.mApp.put(name, attribute);
            break;
        default:
            throw new IllegalArgumentException("Bad scope " + scope);
        }

    }

其中第三个参数代表创建 Attribute节点的同时,指定数据的作用域,1 代表当前页面,2 代表请求时生效,3 代表一次会话中有效,4 代表服务器中有效 。

public abstract class PageContext extends JspContext {
    public static final int PAGE_SCOPE = 1;
    public static final int REQUEST_SCOPE = 2;
    public static final int SESSION_SCOPE = 3;
    public static final int APPLICATION_SCOPE = 4;

//...
}

在 JSP 中获取数据,并指定作用域等级。

<%
    pageContext.setAttribute("name3","kk",PageContext.PAGE_SCOPE);
%>

总结

作用域等级:pageContext--->request--->session--->application。

pageContext 实现请求转发

<%

    //转发
    pageContext.forward("/index.jsp");
    //等同于
    request.getRequestDispatcher("/index.jsp").forward(request,response);

%>

使用场景

pageContext、request、session和application都可以实现存储数据到Attribute节点,但是适用场景有所不同:

  • pageContext 保存的数据只在当前页面生效,所以很少使用。
  • request 保存的数据值在一次请求中有效,请求转发时会携带这个数据。适用于用户请求完就没用的数据,比如新闻。
  • session 保存的数据值在一次会话中有效,从打开浏览器到关闭浏览器。用户用完一会还有用,比如购物车。
  • application 保存的数据值在服务器中有效,从打开服务器到关闭服务器。一个用户用完了,其它用户还可能用,比如网页聊天数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

枚举一个进程中的所有线程

在 Win32 开发中&#xff0c;如果需要获取程序运行过程中的一些较为底层的信息&#xff0c;你可能需要使用到 Tool Helper 库。但我愿意称之它为 Win32 中的 “害群之马”。何解&#xff1f; Tool Helper 库在 16 位 Windows 时代就已经存在了&#xff0c;这个库主要用来提供一…

今天给我的Ubuntu服务器挂在了一个4T的硬盘却只能识别到2T,原来是因为这!涨知识了

前言 今天买的4T机械硬盘到了&#xff0c;准备给我的服务器加装上&#xff0c;用来作为Nextcloud的存储硬盘。把硬盘安装好后就迫不及待的进行挂载&#xff0c;挂载的操作倒是挺顺利的&#xff0c;但是无论怎么操作Ubuntu系统识别到的大小居然都是2T&#xff0c;最后没办法&am…

chatgpt赋能python:开方在Python中的用法

开方在Python中的用法 开方是数学中常见的一种运算&#xff0c;用于求一个数的平方根。在Python中&#xff0c;开方运算可以通过使用math模块中的sqrt函数来实现。本文将介绍开方运算的概念、Python中的应用以及一些常见问题的解决方法。 开方的概念 开方是指&#xff0c;对…

chatgpt赋能python:在Python中运行程序的方法介绍

在Python中运行程序的方法介绍 Python是一种广泛使用的编程语言&#xff0c;也是人工智能和数据科学领域的首选。在这篇SEO文章中&#xff0c;我们将介绍Python中运行程序的几种方法。 1. 在Python环境中运行程序 Python环境是一个Python解释器及其标准库的集合。为了在Pyth…

Redis7【⑥ Redis复制(replica)】

Redis复制 Redis 复制&#xff08;Replication&#xff09;是 Redis 的一项核心功能&#xff0c;用于将一个 Redis 数据库的所有数据复制到另一个 Redis 实例上。Redis 复制可以提高系统的可用性、可靠性和扩展性&#xff0c;使得在发生故障时可以快速地恢复数据。 Redis 复制…

【TiDB v7.1.0】资源管控调研及评测

作者&#xff1a; angryart 原文来源&#xff1a; https://tidb.net/blog/ad24240a 多租户是什么 有语云&#xff0c;食在广州&#xff0c;玩在杭州&#xff0c;死在柳州&#xff0c;广东人除了天上飞的飞机不吃&#xff0c;地上走的坦克不吃&#xff0c;其它的什么都吃&am…

Mybatis面试题--MyBatis一级缓存,二级缓存

Mybatis的一级、二级缓存用过吗&#xff1f; 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存&#xff0c;其存储作用域为 Session&#xff0c;当Session进行flush或close之后&#xff0c;该Session中的所有Cache就将清空&#xff0c;默认打开一级缓存 二级缓存 是基于n…

Python将多维列表「拉伸」为一维列表的10种方式

来源&#xff1a;投稿 作者&#xff1a;Fairy 编辑&#xff1a;学姐 在Python编程中&#xff0c;列表是一种常用的数据类型。当我们遇到了一个嵌套列表&#xff0c;如果想将它扁平化为一维列表&#xff0c;就可以使用下面10种方法之一来实现这个需求。 1. 使用两层循环遍历 l…

【记录】实践场景

Apache Doris 在京东搜索实时 OLAP 探索与实践 https://doris.apache.org/zh-CN/blog/JD_OLAP/ 通过对比开源的几款实时OLAP引擎&#xff0c;我们发现doris和clickhouse能够满足我们的需求&#xff0c;但是clickhouse的并发度太低是个潜在的风险&#xff0c;而且clickhouse的数…

已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。

错误提示&#xff1a; 一般只有下面几种方法 百度经验解决方法 http://jingyan.baidu.com/article/90bc8fc859b481f653640cac.html http://jingyan.baidu.com/article/25648fc1bfd4a29190fd0067.html 2.第二种方法 检测问题所在&#xff1a; 下载LeoMoon CPU-V 检查一下CP…

小程序本地生活

2023年7月1号 感觉就是视频要快点看不完 不然哪天接口又失效了 Page({/*** 页面的初始数据*/data: {// 存放轮播图的数据swiperList:[],// 存放九宫格的数据gridList:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getSwiperList()this.getGridList()},// 获…

【GIS】阿里AI Earth选择内置地图

说明 aie.Map&#xff0c;构造一个地图组件Map对象&#xff0c;用于可视化渲染计算结果。坐标系固定为EPSG:4326。 阿里AI Earth中&#xff0c;坐标系默认为EPSG:4326 效果 import aie aie.Authenticate() aie.Initialize() my_province aie.FeatureCollection(China_Provin…

【Python】Python基础笔记

Python基础笔记 数据的输入和输出 print("数据") # 这是数据的输出 name input() # 这是数据的输入&#xff0c;并将输入的数据赋值给name。而且无论输入的何种类型的数据&#xff0c;最终的结果都是 字符串 类型的数据pint 输出不换行&#xff1a; # print 输出…

结合ace编辑器实现MapboxGL热力图样式在线配置

概述 MapboxGL热力图的配置参数并不多&#xff0c;但是有时候为了或得一个比较好用的热力图配置参数&#xff0c;我们不得不改代码再预览&#xff0c;显得尤为麻烦&#xff0c;为方便配置&#xff0c;实现实时预览&#xff0c;本文使用ace实现了一个热力图样式在线配置页面。 …

MSF之信息收集及漏洞利用

MSF之信息收集及漏洞利用 一、Metasploit简介二、Metasploit安装三、安装postgresql数据库四、KaIi-msfdb-Postgresql报错排查处理五、Metasploit-启动六、Metasploit-目录结构六、Metasploit-模块七、Metasploit-信息收集7.1、db_nmap/nmap7.2、Metasploit auxiliary7.2.1、端…

【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)

本篇文章包含的内容 一、步进电机的结构和工作原理1.1 步进控制系统的组成1.2 步进电机简介1.3 步进电机的分类1.4 步进电机的工作原理1.4.1 单极性步进电机&#xff08;5线4相&#xff09;1.4.2 双极性步进电机&#xff08;4线2相&#xff09;1.4.3 细分器驱动原理 1.5 步进电…

hcia回顾复习

一、OSI七层参考模型 OSI/RM 开放式系统互联参考模型 由ISO ---- 国际标准化组织 — 1979提出 核心思想 分层 :上层协议再下层协议提供服务的基础上再提供增值服务。 应用层 — 提供各种应用服务.可以将抽象语言转换为编码 .应用程序 APP&#xff1a;通过人机交互提供&#xff…

Win10打字输入法不显示输入框怎么办?

Win10的打字输入法是我们日常计算机使用中必不可少的工具之一&#xff0c;然而&#xff0c;有时候在使用过程中可能会遇到打字输入法不显示输入框的问题&#xff0c;这给我们的输入和操作带来了很大的困扰&#xff0c;如果您也遇到了这个问题&#xff0c;不要担心&#xff0c;以…

Linux--获取某个区间文本的指令:head和tail

Linux--获取文本前n行的指令&#xff1a;head 语法&#xff1a; head 选项 文件名 功能&#xff1a; head 用来显示档案的开头至标准输出中&#xff0c;默认head命令打印其相应文件的开头10行。 选项&#xff1a; -n <行数> 显示的行数 示例&#xff1a; ①生成默…

【UE5 Cesium】05-Cesium for Unreal 在子关卡中添加Actor

上一篇&#xff1a;【UE5 Cesium】04-Cesium for Unreal 将不同地区的倾斜摄影作为不同子关卡 步骤 首先将关卡切换到“DenverRooftop” 添加一个“立方体” 将关卡切换到“Globe” 然后再向场景中添加一个“椎体” 此时如果我们将关卡切换到“Boston”&#xff0c;只能看到“…