JSP原理以及基本语法

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;    //sessionfinal javax.servlet.ServletContext application;    //applicationContextfinal javax.servlet.ServletConfig config;    //servletConfigjavax.servlet.jsp.JspWriter out = null;    //outfinal java.lang.Object page = this;    //pageHttpServletRequest    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.hqwc.cn/news/5045.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前后端分离,通用分页js处理模板

功能 **可实现一个页面多个ajax无刷新分页列表** **可解决页面数量非常多的问题** 效果&#xff1a; 截图&#xff1a; 步骤&#xff1a; 第一步&#xff1a;创建一个index.html引入 <script src"./jquery-3.7.0.js"></script><link rel"st…

华为云GaussDB,能否成为数据库国产化替代的“更优选择”?

没有一个行业比数据库更需要长期主义&#xff0c;而在践行长期主义的道路上&#xff0c;国内数据库厂商中华为是不可忽视的存在。 近日&#xff0c;Gartner Peer Insights《Voice of the Customer for Cloud Database Management Systems&#xff0c;2023》报告发布&#xff0…

JMeter HTTP请求的详细指南,还不知道的快来看

目录 JMeter HTTP请求简介 什么是JMeter HTTP请求&#xff1f; 如何使用JMeter的HTTP请求&#xff1f; JMeter HTTP请求配置 创建JMeter HTTP请求 JMeter HTTP请求实例 结论 JMeter HTTP请求简介 在JMeter中&#xff0c;服务器名称和它的路径对于检查请求是否到达了正确…

10W+前端面试题面试资料八股文

点击下方链接获取全部内容文档题目及其答案: 10W前端面试题&面试资料&八股文题目及其答案 https://m.tb.cn/h.5a7v237?tkQeVPdsoKwr4 CZ3457 部分题目如下&#xff1a; 1. call丶apply丶bind区别及源码实现&#xff08;手写&#xff09; 不同点&#xff1a; call…

(二)线程的六种状态及上下文切换

&#xff08;二&#xff09;线程的六种状态及上下文切换 2.1 操作系统中线程的状态及切换2.2 Java 中线程的六种状态01、NEW&#xff08;线程尚未启动&#xff09;02、RUNNABLE&#xff08;运行中&#xff09;03、BLOCKED&#xff08;阻塞状态&#xff09;04、WAITING&#xff…

Linux--共同访问的公共目录不允许a用户删除b用户目录或文件:粘滞位 -t

情景&#xff1a; ①当多个用户共享同一个目录&#xff0c;需要在该目录下&#xff0c;进行读写、创建文件 ②但是自己只能删除自己的&#xff0c;而不能删除别人的&#xff08;w:可以互删的&#xff0c;但是不满足条件&#xff09; 语法&#xff1a; chmod t 目录名 注意…

Java(六):Eureka项目搭建、数据请求

Eureka项目搭建、数据请求 Eureka简介Eureka项目创建1、新建Maven项目2、只保留Maven项目的依赖文件3、创建子模块&#xff08;Eureka服务模块&#xff09;4、修改pom.xml5、创建并修改配置文件6、添加Eureka注解7、运行8、创建其他服务9、修改pom.xml10、创建并修改配置文件11…

Docker-compose的使用

目录 Docker-compose 简介 docker-compose的安装 docker-compose.yaml文件说明 compose的常用命令 总结 Docker-compose 简介 Docker-compose 是用于定义和运行多容器的 Docker 应用程序的工具。可以使用YAML文件来配置应用程序的服务。&#xff08;通俗讲是可以通过yml文…

【Spring Cloud系列】- Eureka使用详解

【Spring Cloud系列】- Eureka使用详解 文章目录 【Spring Cloud系列】- Eureka使用详解一、概述二、Eureka简介三、Eureka结构与作用Eureka结构图Eureka采用CS&#xff08;Client/Server,客户端/服务器&#xff09;架构&#xff0c;它包括以下两大组件 四、Eureka集群及与应用…

stable-diffusion 预训练模型汇总

目前各个github上各个库比较杂乱&#xff0c;故此做些整理方便查询 Stable UnCLIP 2.1 New stable diffusion finetune (Stable unCLIP 2.1, Hugging Face) at 768x768 resolution, based on SD2.1-768. This model allows for image variations and mixing operations as d…

Rust语言从入门到入坑——(11)面向对象

文章目录 0、引入1、封装2、继承3、多态4、引用 0、引入 Rust 不是面向对象的编程语言&#xff0c;但是可以实现面向对象方法&#xff1a;封装与继承&#xff0c;以及不完全的多态 1、封装 "类"往往是面向对象的编程语言中常用到的概念。"类"封装的是数据…

Windows 解决cmd/dos窗口中文乱码问题

文章目录 一、问题描述二、解决方案1. 更改DOS窗口代码页方式1&#xff1a;更改dos窗口代码页&#xff08;临时有效&#xff09;方式2&#xff1a;修改注册表CodePage项&#xff08;永久有效&#xff09;方式3&#xff1a;修改 .lnk 快捷方式的文件属性&#xff08;永久有效&am…