JavaWeb系列十二: 服务器端渲染技术(JSP) 上

跟着韩老师学java

  • 1. JSP基本介绍
    • 1.1 JSP快速入门
    • 1.2 JSP(Java Server Pages)运行原理
    • 1.3 page指令介绍
    • 1.4 JSP脚本
      • 1.4.1 声明脚本
      • 1.4.2 表达式脚本
      • 1.4.3 java代码脚本
    • 1.5 jsp注释
    • 1.6 jsp内置对象
    • 1.7 JSP四大域对象
      • 1.7.1 域对象实例
      • 1.7.2 注意事项
    • 1.8 JSP请求转发标签
    • 1.9 作业布置

在这里插入图片描述

1. JSP基本介绍

e

  1. JSP全称是Java Server Pages, 即Java的服务器页面, 就是服务器端渲染技术
  2. JSP这门技术的最大的特点是, 写JSP就像在写HTML
  3. 相比html而言, html只能为用户提供静态数据, 而JSP(Java Server Pages)技术允许在页面中嵌套java代码, 为用户提供动态数据
  4. 相比Servlet而言, Servlet很难对数据进行排版, 而JSP(Java Server Pages)除了可以用java代码产生动态数据的同时, 也很容易对数据进行排版
  5. JSP技术基于Servlet, 可以理解成就是Servlet

1.1 JSP快速入门

新建javaweb项目,可以参考👉

  1. 新建java项目
    在这里插入图片描述
  2. 引入web框架
    在这里插入图片描述
    在这里插入图片描述
  3. 新建lib目录->导入servlet-api.jar, jsp-api.jar
    在这里插入图片描述
  4. 在web工程路径下新建jsp
    在这里插入图片描述
  5. 配置Tomcat
    在这里插入图片描述
  6. 运行结果
    在这里插入图片描述
    在这里插入图片描述
  7. 注意事项和细节
    jsp->(java server pages) 页面不能像HTML页面, 直接用浏览器运行, 只能是浏览器通过Tomcat来访问jsp页面
  8. 如何设置jsp模板
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2 JSP(Java Server Pages)运行原理

  1. jsp(java server pages)页面本质是一个Servlet程序(本质就是java程序).
  2. 第1次访问jsp(java server pages)页面的时候, Tomcat服务器会把jsp页面解析成一个java源文件, 并且对它编译为.class字节码程序. 参考sum.jsp对应的sum_jsp.java和sum_jsp.class文件
  1. sum_jsp.java是sum.jsp对应的servlet
  2. sum_jsp.class是对应的字节码文件
  3. 这两个文件在tomcat启动时的Using CATALINA_BASE: 目录下
    在这里插入图片描述
    比如:C:\Users\97896\AppData\Local\JetBrains\IntelliJIdea2022.3\tomcat\934373ca-74e2-42fa-87e8-55ee0332e30c\work\Catalina\localhost\jsp\org\apache\jsp
    在这里插入图片描述
    在这里插入图片描述
    要想查看HttpJspBase的类图关系, 要引入jasper.jar包
    在这里插入图片描述

总结:
3. sum.jsp->sum_jsp.java
4. sum_jsp 继承 HttpJspBase
5. HttpJspBase 继承了 HttpServlet
6. 结论: sum.jsp本质就是servlet
7. 因为sum_jsp 类还继承了 HttpJspBase, 所以就有更强的功能

1.3 page指令介绍

<%@ page contentType=“text/html; charset=utf-8” languange=“java” %>

  1. language表示jsp翻译后是什么语言文件, 但是只支持java, 其它的不支持
  2. contentType表示jsp返回的数据类型, 对应源码中response.setContentType()的参数值
  3. pageEncoding属性 表示当前jsp页面文件本身的字符集
  4. import属性跟java源码中的一样, 用于导包, 导类

1.4 JSP脚本

1.4.1 声明脚本

  1. 声明脚本的格式: <%! 声明java代码 %>
  2. 作用: 定义jsp需要的属性, 方法, 静态代码块和内部类…
    在这里插入图片描述
    对应的statement_jsp 类
    在这里插入图片描述

1.4.2 表达式脚本

  1. 表达式脚本的格式是: <%=表达式%>
  2. 表达式脚本的作用是: 在jsp(java server pages)页面上输出数据
  3. 脚本中的表达式不能以分号结束
    在这里插入图片描述
    在这里插入图片描述

1.4.3 java代码脚本

  1. 代码脚本的语法是: <% java代码 %>
  2. 代码脚本的作用是: 可以在jsp页面中(用java)编写我们需要的功能
  3. 可以由多个代码脚本块组合完成一个完整的java语句
  4. 代码脚本还可以和表达式脚本一起组合使用, 在jsp(java server pages)页面上输出数据
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.zzw.entity.Monster" %><%--Created by IntelliJ IDEA.User: 赵志伟Version: 1.0--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>代码脚本</title>
</head>
<body>
<h1>演示代码脚本</h1>
<%//创建ArrayList, 存放Monster对象ArrayList<Monster> monsters = new ArrayList<>();monsters.add(new Monster("铁扇公主", 3000, "芭蕉扇"));monsters.add(new Monster("白骨精", 2000, "魅惑"));
%>
<table border="1px"><tr><th>编号</th><th>名字</th><th>年龄</th><th>技能</th></tr><%for (int i = 0; i < monsters.size(); i++) {Monster monster = monsters.get(i);%><tr><td><%=i+1%></td><td><%=monster.getName()%></td><td><%=monster.getAge()%></td><td><%=monster.getKill()%></td></tr><%}%>
</table>
</body>
</html>

对应的javacode_jsp 类
在这里插入图片描述

1.5 jsp注释

在这里插入图片描述

1.6 jsp内置对象

  1. JSP内置对象(即已经创建好的对象, 直接使用 英文名-inbuild), 是指Tomcat在翻译jsp页面成为Servlet后, 内部提供的九大对象, 叫内置对象
  2. 内置对象, 可以直接使用, 不需要手动定义
  1. out 向客户端输出数据 out.println(“”);
    在这里插入图片描述
    在这里插入图片描述
  2. request 客户端的http请求
    在这里插入图片描述
    在这里插入图片描述
  1. response 响应对象
    在这里插入图片描述
    在这里插入图片描述
  2. session 会话对象
    在这里插入图片描述
    在这里插入图片描述
  3. application 对应ServletContext
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. pageContext (jsp独有) jsp页面的上下文, 是一个域对象, 可以setAttribute(), 作用范围只是本页面
    在这里插入图片描述
    在这里插入图片描述
  5. exception异常对象, 使用比较少(jsp独有) getMessage()
  6. page对象(jsp独有) 代表jsp这个实例本身在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  7. config 对应ServletConfig在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

1.7 JSP四大域对象

  1. pageContext(域对象, 存放的数据只能在当前页面使用)
    在这里插入图片描述
  2. request(域对象, 存放的数据在一次request请求中有效, 数据和request对象绑定)
    在这里插入图片描述
  3. session(域对象, 存放的数据在一次会话中有效)
    在这里插入图片描述
  4. application(域对象, 存放的数据在整个web应用运行期间有效, 范围更大)
    在这里插入图片描述

1.7.1 域对象实例

  1. 请求转发
    在这里插入图片描述
    在这里插入图片描述
  2. 重定向
    在这里插入图片描述
    在这里插入图片描述
  3. 打开一个新的浏览器定位scope2.jsp
    在这里插入图片描述

1.7.2 注意事项

  1. 域对象是可以向Map一样存取数据的对象. 四个域对象功能一样, 不同的是它们对数据的存储范围
  2. 从存储范围(作用域范围看) pageContext < request < session < application

1.8 JSP请求转发标签

在这里插入图片描述

1.9 作业布置

calServlet

tips:

  1. Java中, 整数运算除数为0会抛异常;
  2. 浮点类型的除法运算除数为0会得到Infinity, 表示无限大, 运算并不会抛异常, 判断一个数是否是无限大, 用Double.isInfinite();
  3. 如果在浮点类型的除法运算中, 被除数和除数都为0, 会得到NaN, 即非数字, NaN不等于任何值, 要判断是否是NaN, 用Double.isNaN()
public class CalServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String num1 = request.getParameter("num1");String num2 = request.getParameter("num2");String oper = request.getParameter("oper");String regStr = "^[+-]?([1-9]\\d*|0)$";if (Pattern.matches(regStr, num1) && Pattern.matches(regStr, num2)) {double num_1 = WebUtils.parseDouble(num1, 0);double num_2 = WebUtils.parseDouble(num2, 0);double result = 0;request.setAttribute("oper", oper);if ("+".equals(oper)) {result = num_1 + num_2;} else if ("-".equals(oper)) {result = num_1 - num_2;} else if ("*".equals(oper)) {result = num_1 * num_2;} else if ("/".equals(oper)) {result = num_1 / num_2;if (Double.isInfinite(result)) {request.setAttribute("num2Error", "除数不能为零");request.getRequestDispatcher("/cal/cal.jsp").forward(request, response);} else if (Double.isNaN(result)) {request.setAttribute("num1Error", "被除数不能为零");request.setAttribute("num2Error", "除数不能为零");request.getRequestDispatcher("/cal/cal.jsp").forward(request, response);}}//String.format:格式化字符串String format = String.format("%s %s %s = %s", num1, oper, num2, result);request.setAttribute("result", format);System.out.println(format);request.getRequestDispatcher("/cal/result.jsp").forward(request, response);} else {request.setAttribute("error", "数据格式不正确");request.getRequestDispatcher("/cal/cal.jsp").forward(request, response);}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

cal.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String path = application.getContextPath();%>
<html>
<head><title>计算页面</title><script type="text/javascript">function register() {var num1 = document.getElementById("num1").value;var num2 = document.getElementById("num2").value;var regStr = /^[+-]?([1-9]\d*|0)$/;if (!regStr.test(num1)) {var span_1 = document.getElementById("span_1");span_1.hidden = false;return false;}if (!regStr.test(num2)) {alert("num2数字错误");return false;}return true;};if (<%=request.getAttribute("error") != null%>) {alert("<%=request.getAttribute("error")%>");}window.onload = function () {if (<%=request.getAttribute("num2Error") != null%>) {var span_2 = document.getElementById("span_2");span_2.hidden = false;}if (<%=request.getAttribute("num1Error") != null%>) {var span_1 = document.getElementById("span_1");span_1.hidden = false;}}</script>
</head>
<body>
<form action="<%=path%>/calServlet" onsubmit="return register()">num1: <input type="text" id="num1" name="num1"><span id="span_1" hidden>num1错误:<%=request.getAttribute("num1Error")%></span><br/>num2: <input type="text" id="num2" name="num2"><span id="span_2" hidden>num2错误:<%=request.getAttribute("num2Error")%></span><br/>运算符号: <select name="oper"><option value="+">+</option><option value="-">-</option><option value="*">*</option><option value="/">/</option>
</select><br/><input type="submit" value="提交计算"/>
</form>
</body>
</html>

result.jsp
在这里插入图片描述

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

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

相关文章

MYSQL 将某个字段赋值当前时间

如 我们需要将use_time 赋值为当前时间&#xff1a; 准备三条数据 &#xff1a; 执行sql &#xff0c;2种当前时间赋值函数&#xff0c;1种关键字赋值 &#xff1a; update test_info SET use_timeNOW() WHERE id 1; update test_info SET use_timeCURRENT_TIMESTAMP() …

基于飞腾腾云S2500的ATS部署及调优指南(反向代理篇)

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

场外期权一级交易商都有哪些?和二级交易商有什么区别?

今天带你了解场外期权一级交易商都有哪些&#xff1f;和二级交易商有什么区别&#xff1f;目前&#xff0c;个人投资者无法直接进行场外个股期权投资&#xff0c;而是需要通过专业机构进行询价交易下单。 场外期权业务一级交易商分别为&#xff0c;广发证券、国泰君安、华泰证…

Java学习笔记(一)Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质、课后练习

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质还有几道课后练习详细介绍以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 …

中小学校共用电脑通过安当SLA产品配置实现开机控制

中小学校公用电脑实现电脑开机控制的必要性主要体现在以下几个方面&#xff1a; 1. 增强安全性&#xff1a; 公用电脑由于使用频繁&#xff0c;容易被未经授权的用户访问&#xff0c;可能存在数据泄露或恶意软件植入的风险。通过实现电脑开机控制&#xff0c;学校可以确保只有…

【jdk】jdk11 jdk17 jdk21的新特性

前言&#xff1a;按照博主的个人理解&#xff0c;一般来说 除了jdk8时代 说jdk8的新特性是特指jdk8这一个版本的特性&#xff0c;之后例如jdk11 jdk17新特性 都是泛特性 什么意思呢&#xff1f; 比如jdk11新特性&#xff0c;一般是指jdk9——jdk11 这一个泛版本的所有新特性&am…

加速度传感器采集时无效数据的产生及消除

1.现象 这是振动传感器的原始采样信号&#xff0c;它有一个明显的上升沿&#xff0c;这个上升沿&#xff0c;看时间轴标尺&#xff0c;大概持续了至少50ms&#xff0c;它是从哪里来的呢&#xff1f; 加速度传感器一般是由恒流源驱动的。而恒流源的原始电源输入是个经由电源模…

RabbitMQ使用交换机进行消息转发

使用交换机进行转发到队列 第一步&#xff1a;创建队列 第二步&#xff1a;创建交换机 第三步&#xff1a;交换机绑定队列 第四步&#xff1a;修改消息生产者发送业务 第五步&#xff1a;修改消息接收者业务代码 RabbitListener(queues "fanout.queue1")public vo…

linux服务器没外网源码安装glibc-2-28

linux服务器没外网源码安装glibc-2-28 所需源码包&#xff0c;其中gcc文件夹不需要&#xff0c;其它tar包都需要 tar.gz的解压方式 #tar -zxvf 包名 tar.xz的解压方式 #tar -xf 包名 全部解压完成后 安装顺序请按照下方顺序操作&#xff08;wget后面是下载地址&#xff…

码云建仓库

1.新建仓库 码云地址 打开 码云地址 &#xff0c;点击“”&#xff0c;新建仓库&#xff0c;添加仓库内容 &#xff0c;创建。 小提示&#xff1a;如果本地已有项目&#xff0c;就不要选初始化&#xff0c;设置模板&#xff0c;容易冲突。 2. 进入当前仓库页 小提示&#x…

决定马萨诸塞州版图的关键历史事件

决定马萨诸塞州版图的关键历史事件&#xff1a; 1. 早期探索与*民定居&#xff1a;17世纪初&#xff0c;英国清教徒为寻求宗教自由&#xff0c;乘坐“五月花号”到达新大陆&#xff0c;并于1620年在现在的普利茅斯建立了第一个永久性英国*民地。随后&#xff0c;更多的英国*民…

微软NVIDIA讲师直播讲解:探索LLM大模型的小型化 —— 小模型在NVIDIA Jetson 与 NIM 平台的最佳实践

Webinar主题&#xff1a;探索LLM大模型的小型化 —— 小模型在NVIDIA Jetson 与 NIM 平台的最佳实践 时间&#xff1a;6月25号 晚8点-9点 时长&#xff1a;1h 活动形式&#xff1a;线上 点击链接报名本次在线研讨会&#xff1a;https://www.nvidia.cn/webinars/sessions/?s…

开发大模型应用,到底使用RAG还是微调?我们应该从哪些方面考虑?

现在基于大模型开发应用时&#xff0c;相信很多人都有这种疑问&#xff0c;到底对大模型进行微调还是外接RAG呢&#xff1f;因为两者在一定层面上有很多相似的地方&#xff0c;下面让我给大家从各个层面进行分析&#xff0c;结合具体的业务场景&#xff0c;看哪种方式更适合你的…

一款轻量级的WPF UI库---Adonis UI

Adonis UI适用于 WPF 应用程序的轻型 UI 工具包,提供经典但增强的 Windows 视觉对象 组件内容 几乎所有 WPF 控件的模板的默认样式为方便起见,可根据需要使用两种配色方案(浅色和深色),也可用于自定义样式支持在运行时更改配色方案支持其他自定义配色方案提供水印等功能的…

硬盘监控和分析工具:Smartctl

文章目录 1. 概述2. 安装3. 使用4. smartctl属性信息介绍 1. 概述 Smartctl&#xff08;S.M.A.R.T 自监控&#xff0c;分析和报告技术&#xff09;是类Unix系统下实施SMART任务命令行套件或工具&#xff0c;它用于打印SMART自检和错误日志&#xff0c;启用并禁用SMRAT自动检测…

又一盛举,沃飞取得关键技术突破后,助力成都低空载人交通航线运行实践!

6月20日上午9点30分&#xff0c;随着塔台发出指令&#xff0c;一架载人直升飞机&#xff08;阿古斯塔AW109型号&#xff09;从洛带通用机场起飞&#xff0c;经停中国欧洲中心、青城山&#xff0c;最后稳稳落地回到洛带通用机场。当天下午&#xff0c;这架飞机再次转动旋翼&…

IDEA2024关闭自动AI代码补全功能

文章目录 一、背景二、教程四、写在后面 一、背景 在本人前段时间的一次面试算法题中&#xff0c;面试官让我关闭代码提示功能&#xff0c;当时气氛尴尬的可以抠出三室一厅&#xff0c;但是这个功能是2024新版参考文献自带的&#xff0c;本次来分享如何关闭新版代码补全功能。…

Mac(M1芯片)安装多个jdk,Mac卸载jdk

1.jdk下载 oracle官方链接&#xff1a;oracle官方下载链接 2.安装 直接下一步&#xff0c;下一步就行 3.查看是否安装成功 出现下图内容表示安装成功。 4.配置环境变量 open -e .bash_profile 路径建议复制过去 #刷新环境变量 source ~/.bash_profile 5.切换方法 6.jdk…

sql sever 存储过程不能请求https的解决方案

此错误的原因&#xff0c;通常是因为SQL Server默认不允许非加密的HTTP请求。为了解决这个问题&#xff0c;需要配置SQL Server允许非密码的https请求&#xff0c;或者使用密码的http请求。 下面是配置SQL Server允许非加密http请求 UsE [master] ;Go EXEC sp_configure Sh…

如何确保消息不被重复消费

一、重复消费问题出现的原因 导致重复消费的原因可能出现在生产者&#xff0c;也可能出现在 MQ 或 消费者。这里说的重复消费问题是指同一个数据被执行了两次&#xff0c;不单单指 MQ 中一条消息被消费了两次&#xff0c;也可能是 MQ 中存在两条一模一样的消费。 生产者&…