一文学懂JSP(上)

简介: 一文学懂JSP

正文开始 ----------


f7c073520f44ecc6ea0608376e31114f.png


第1章 为什么要学习JSP

1.1 现有技术不足

Servlet可以通过转发或重定向跳转到某个HTML文档。但HTML文档中的内容不受Servlet的控制。比如登录失败时,跳转回登录表单页面无法显示诸如“用户名或密码不正确”的错误消息,所以我们目前采用的办法是跳转到一个错误信息页面。如果通过Servlet逐行输出响应信息则会非常繁琐。


Servlet输入html页面的程序代码:


package com.manman.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
/**
 * @author Gaoziman
 * @version 1.0
 * description:
 * @date 2022/8/23 19:27
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置返回的数据内容的数据类型和编码
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        Writer writer = response.getWriter();
        //输出页面内容!
        writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
        writer.write("<html>");
        writer.write("<head>");
        writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
        writer.write("<title>Insert title here</title>");
        writer.write("</head>");
        writer.write("<body>");
        writer.write("这是由Servlet程序输出的html页面内容!");
        writer.write("</body></html>");
    }
}

接着,在浏览器中输入访问Servlet的访问路径得到以下结果:

上面的代码我们不难发现。通过Servlet输出简单的html页面信息都非常不方便。那我们要输出一个复杂页面的时候,就更加的困难,而且不利于页面

的维护和调试。

1.2 Servlet与HTML

Servlet HTML
长处 接收请求参数,访问域对象,转发页面 以友好方式显示数据
短处 以友好方式显示数据 动态显示数据

1.3 总结

那能否将Servlet和HTML二者的长处结合起来呢?

能!sun公司推出一种叫做JSP的动态页面技术帮助我们实现对页面输出繁锁工作。

第2章 JSP简介

2.1 JSP全称

  • JSP全称Java Server Pages,顾名思义就是运行在java服务器中的页面。由Sun 公司专门为了解决动态生成HTML文档的技术,也就是在我们JavaWeb中的动态页面。

JSP能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML。

JSP其本质就是一个Servlet。Servlet能做的事情 JSP 都能做。

JSP必须运行在服务器中,不能直接使用浏览器打开。

JSP是Web网页的技术标准,主要语法组成包括:指令,html模板元素,脚本片段(小脚本),表达式,声明,注释,后缀是*.JSP。

JSP的主要作用是代替Servlet程序回传HTML页面的数据

web目录(或其他)右击 --> new --> JSP/JSPX --> 输入文件名 --> 选择JSP file创建


2.2 JSP与HTML的区别

  • JSP是动态页面,html是静态页面。
动态页面 静态页面
运行原理 通过服务器解析后,将数据在浏览器中显示 直接在浏览器中解析运行
维护成本 较低,可以修改后台数据,进而影响页面中的数据 较高,必须将修改后的页面覆盖原页面
数据库 可以连接数据库 不可连接数据库
访问速度 较慢 较快
书写代码 可以书写java代码 不能书写java代码

2.3 JSP与Servlet分工


JSP本质是一个Servlet ,翻译后的文件结构为:class helloworld_JSP : HttpJSPBase : HttpServlet。

JSP主要负责显示及获取数据,从表面上看,JSP 相对于在html中嵌入java代码:JSP=html+java。

Servlet主要负责处理业务,从表面上看,Servlet相当于在java中嵌入html代码:Servlet=java+html。

总结:相比于Servlet,JSP更加善于处理显示页面,而Servlet更善于处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和 JSP 结合使用,Servlet负责业务,JSP 负责显示。

2.4 JSP基本格式

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP页面</title>
</head>
<body>
  这是我的第一个JSP页面。
</body>
</html>

2.5 JSP的本质

JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:


d00bc7fb08ec254bf8e612ea322ce8fb.png

而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序

第3章 JSP初体验

3.1 创建一个JSP动态页面程序:HelloWorld

① 选中Web目录,右键创建一个jsp文件

7c47cd00fd386bf88478e45977917e9c.png

②在body标签中添加你想要显示的文本内容


image-20220823195139844.png


③然后在浏览器中输入jsp页面的访问地址


jsp页面的访问地址和html页面的访问路径一样http://ip:端口号/工程名/文件名。也就是https://localhost:8080/day07/demo.jsp


1fd56548fd983d84e751119099184b2c.png

注意事项:


1、jsp 页面是一个类似于 html 的一个页面。 jsp直接存放到 web目录下,和html一样访问 jsp 的时候,也和访问html一样


2、jsp 的默认编码集是 ISO-8859-1,修改 jsp 的默认编码为UTF-8


3.2 JSP运行原理


jsp的本质其实是一个Servlet程序。


实际上Tomcat在运行JSP时,并不是直接显示的我们所编写的JSP页面,而是将JSP页面转换成了一个Java类,这个Java类是什么,我想大家也能猜到了,它实际上就是一个Servlet。

这个Servlet在哪呢?在Tomcat目录中work目录中,在那个目录下保存着 Tomcat自动生成的一些内容,下面让我们来找到那个目录。


在work目录下的…work\Catalina\localhost\day07_jsp\org\apache\jsp文件夹中我们可以发现两个文件index_jsp.java和index_jsp.class,前者就是Tomcat自动生成的Servlet的源码,后者是编译后的.class文件。


832dcd6f3efd993559b4517a95aaf2f6.png


打开index_jsp.java文件部分内容如下:


图一:


702d8207cf16e3cae7d48f0b6f000c45.png


我们打开index_jsp.java文件查看里面的内容:发现,生成的类继承于HttpJspBase类。这是一个jsp文件生成Servlet程序要继承的基类!于是,我们关联源代码。去查看一下HttpJspBase类的内容。从源码的类注释说明中,我们发现。HttpJspBase这个类就是所有JSP文件生成Servlet程序需要去继承的基类。并且这个HttpJspBase类继承于HttpServlet类。我们访问JSP时服务器就是调用了该Servlet来响应请求。所以JSP也是一个Servlet小程序。


d6de272f3f691d2db33811abd0d4a00b.png


我们分别在工程的WebContent目录下创建多个jsp文件。然后依次访问。它们都被翻译为.java文件并编译成为.class字节码文件。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A9HeCUmf-1661441820762)(https://gaoziman.oss-cn-hangzhou.aliyuncs.com/img/JSP%E5%8E%9F%E7%90%86.png)]


我们顺着代码向下看,会发现_jspService()方法。会发现有九个对象(实际上默认会看到八个),这是后面要讲到的重点。


图二:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sG1Eo9Ro-1661441820763)(https://gaoziman.oss-cn-hangzhou.aliyuncs.com/img/jsp%E7%BF%BB%E8%AF%91servlet%E5%90%8E%E9%83%A8%E5%88%86%E6%BA%90%E7%A0%812.png)]


小结:


从生成的文件我们不难发现一个规则:


a.jsp 翻译成 java文件后的全名是 a_jsp.java文件


b.jsp 翻译成 java文件后的全名是 b_jsp.java文件


那么当我们访问 一个xxx.jsp文件后翻译成java文件的全名是 xxx_jsp.java文件。


xxx_jsp.java文件是一个Servlet程序。原来jsp中的html内容都被翻译到Servlet类的service方法中原样输出。


1b13996145711bba2f058ec1e70aee4d.png


Servlet是需要在web.xml中配置的,而我们并没有配置JSP的serlvet映射,那他是如何访问的呢?实际在tomcat下的conf目录中的web.xml早已配置好了JSP的映射信息,具体内容如下:

<servlet>
  <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
    <param-name>fork</param-name>
    <param-value>false</param-value>
  </init-param>
  <init-param>
    <param-name>xpoweredBy</param-name>
    <param-value>false</param-value>
  </init-param>
  <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

总结Jsp运行原理

  1. 第一次访问jsp页面时,服务器会将xxx.jsp文件翻译成xxx_jsp.java文件,再编译成xxx_jsp.class文件。
  2. 以后在访问同一个jsp文件
  • 如果文件未改变,不会被翻译和编译
  • 如果文件改变,会翻译和编译
目录
相关文章
|
9天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
300 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
314 155
|
12天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
869 6
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
252 113