Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

jsp

作者头像
Masimaro
发布于 2019-11-18 05:49:28
发布于 2019-11-18 05:49:28
11.1K00
代码可运行
举报
运行总次数:0
代码可运行

之前聊过用java处理web请求,处理cookie和session等等,但是唯独没有提及如何返回信息。作为一个web程序,肯定需要使用HTML作为用户界面,这个界面需要由服务端返回。返回信息可以使用HttpResponse中的OutputStream对象来写入数据。但是既要在里面写入HTML,又要写入相应的值,造成程序很难编写,同时HTML代码长了也不容易维护。我们需要一种机制来专门处理返回给浏览器的信息。JSP就是用来专门处理这种需求的。

JSP概述

JSP (Java Server Page):Java 服务端页面。是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。jsp可以很方便的在页面中通过java代码嵌入动态页面

JSP原理分析

下面是一个简单的hello world程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>index</title>
  </head>
  <body>
    <%
      out.println("hello world");
    %>
  </body>
</html>

我们将其部署到tomcat服务器上,启动并访问它之后会在tomcat所在目录的 work\Catalina\localhost\JSPDemo\org\apache\jsp (其中JSPDemo是项目名称), 在这个目录下面可以看到生成了一个index_jsp.java、index_jsp.class

下面是这个jsp生成的部分源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    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;


    try {
      response.setContentType("text/html;charset=UTF-8");

      out.write("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>index</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write("    ");

      //这里是java代码的开始
      out.println("hello world");
      //这里是java代码的结尾
    
      out.write("\n");
      out.write("  </body>\n");
      out.write("</html>\n");
    } catch (java.lang.Throwable t) {
      //todo someting
    } finally {
      //todo someting
    }
  }
}

我们查询一下HttpJspBase这个类可以得到如下继承关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.Object
  |
  +--javax.servlet.GenericServlet
        |
        +--javax.servlet.http.HttpServlet
              |
              +--org.apache.jasper.runtime.HttpJspBase

也就是说jsp本质上还是一个Servlet类,当我们第一次访问这个jsp页面时,服务器会根据jsp代码生成一个Servlet类的.java源码文件然后编译。对比jsp代码可以看得出来,在翻译的时候它逐行翻译,将html代码采用out.write进行输出,对应的java代码则原封不动的放在对应的位置。

既然它是一个servlet,那么他的生命周期与相关注意事项就与Servlet相同了。

jsp语法

jsp确实简化了用户界面的编写,但是如果只知道原理,而不知道如何使用它仍然是白瞎,这部分来简单聊聊如何使用它

jsp的代码主要放在3种标签中

  1. <% code %>: 这种格式中的代码,主要放的是要执行的java代码,它们最后会被解析到类的service方法中
  2. <%! code %>: 这种格式中的代码,主要包含的是成员变量的定义,它们最后会被解析到类的成员变量定义中
  3. <%= code %>: 这种格式中的代码,最终会被输出到页面上,会被解析到 out.print中进行输出

下面我们对index.jsp进行改造,做一个简单的统计页面访问量的功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>index</title>
  </head>
  <body>
    <%!
      private int totalVisited = 0;
    %>

    <%
      totalVisited++;
    %>

    <%=
      "客户请求次数:" + totalVisited
    %>
  </body>
</html>

然后再看看生成的java代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {


      private int totalVisited = 0;

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    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;


    try {
      response.setContentType("text/html;charset=UTF-8");

      out.write("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>index</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write("    ");
      out.write("\n");
      out.write("\n");
      out.write("    ");

      totalVisited++;
    
      out.write("\n");
      out.write("\n");
      out.write("    ");
      out.print(
      "客户请求次数:" + totalVisited
    );
      out.write("\n");
      out.write("  </body>\n");
      out.write("</html>\n");
    }
}

jsp内置对象

我们在写jsp页面时关注的其实是Servlet的service 方法,谈及jsp内置对象的时候主要关注的是service中定义的相关变量,从生成的代码上来看,我们可以使用的是service方法中的输入参数request和response 再加它事先定义好的9个局部变量。它们的含义如下:

  1. HttpServletRequest request: 请求对象,之前在HttpServlet中已经了解了它该如何使用
  2. javax.servlet.jsp.PageContext pageContext: 页面的上下文,提供对JSP页面所有对象以及命名空间的访问。可以用它拿到request、cookie、session等一系列页面中可以访问到的对象
  3. HttpSession session: 当前会话
  4. ServletContext application: servlet上下文,我们可以拿到servlet的相关对象。比如获取当前servlet对象的名称,然后拼接一个路径。这样就不用考虑如何部署的问题
  5. JspWriter out: 输出对象
  6. HttpServletResponse response: HTTP响应对象
  7. Object page: 从定义和初始化值来看,它代表的是当前Servlet对象
  8. ServletConfig config: ServletConfig类的实例,获取当前servlet的配置信息
  9. Except: 当前异常,只有当jsp页面是错误页面是才能使用这个对象。

其他的东西基本上用不上,这里也就不再介绍了。

指令

通过上面的相关知识点,现在已经能写相关的jsp代码了,但是既然本质上是servlet类,那么java其他的操作,比如导入相关库文件怎么办呢?这就需要用到对应的jsp指令。jsp指令放在 <%@ code %>中,jsp指令主要有3大类:

  1. page: 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
  2. include: 包含其他文件,可以利用这个属性事先抽取出页面的公共部分(比如页面的头部导航栏和页脚部分),最后再用include做拼接。
  3. taglib: 引入标签库的定义, 这个在使用jstl 和es表达式等第三方jsp扩展库的时候使用

每条指令可以有多个属性,page 指令的相关属性如下:

属性

含义

contentType

等同于 response.setContentType方法,用于设置响应头的Content-Type属性

pageEncoding

设置jsp页面自身的编码方式

language

定义jsp脚本所使用的语言,目前只支持java 语言

import

导入java包

errorPage

当前页面发生异常后会自动跳转到指定错误页面

isErrorPage

标识当前页面是否是错误页面,错误页面中可以使用exception 对象,用来捕获异常

include 指令的相关属性如下: |属性|含义| |:---|:---| |file| 包含的文件路径|

taglib 的属性如下: |属性|含义| |:---|:---| |prefix|前缀,它们是自定义的,将来要用lib中的标签时用它作为前缀| |uri|第三方库所在路径|


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于利用maven搭建ssm的博客,我们一起来探讨下问的最多的问题
    有个同学去非洲援建,刚到工地接待他的施工员是个黑人,他就用英语跟人家交流,黑人没做声。 然后他又用法语,黑人还是没说话。 然后他用手去比划。黑人终于开口了:瞎比划嘎哈,整个工地都中国人
青石路
2019/04/18
6750
关于利用maven搭建ssm的博客,我们一起来探讨下问的最多的问题
Java EE基础之JSP(二)
     接着上篇文章,我们上篇文章讲到了jsp的基本原理以及和servlet的关系,还介绍了jsp的基本语法部分,本篇文章就继续介绍余下的内容。 编译指令Page和include 基本的动作指令 内
Single
2018/01/04
1.2K0
Java EE基础之JSP(二)
Web-第十一天 JSP学习
JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。为了与传统HTML有所区别,JSP文件的扩展名为.jsp。
Java帮帮
2018/07/27
8790
Web-第十一天 JSP学习
图解JSP运行原理和过程
下面代码通过注解来处理/hello的请求, 并在代码中将请求转发到上述hello.jsp.
望天
2018/08/02
2.6K0
图解JSP运行原理和过程
[javaEE] jsp入门
生成一个xxx_jsp.java的Servlet文件,jsp的脚本片段放在了_jspService()方法里面
唯一Chat
2019/09/10
5.1K0
javaweb学习总结(十四)——JSP原理
  JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。   JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
全栈程序员站长
2022/07/05
5740
javaweb学习总结(十四)——JSP原理
JavaWeb(三)JSP概述
一、JSP概述 1.1、JSP简介   一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。JSP是一种Java servlet,主要用于实现JavaWeb应用程序的用户界面部分。   网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。   JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以
用户1195962
2018/01/18
1.6K0
JavaWeb(三)JSP概述
JSP介绍与简单使用
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
端碗吹水
2020/09/23
2.1K0
JSP介绍与简单使用
JSP基础入门
JSP(Java Server Pages)是JavaWeb服务器端的动态资源。它与html页面的作用是相同的,显示数据和获取数据。
星哥玩云
2022/09/14
3930
JSP基础入门
Servlet 详解
1、什么是 Servlet? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程
IT可乐
2018/01/04
1.2K0
Servlet 详解
JSP笔记
jsp的全称是 java server pages。Java的服务器页面。 jsp的主要作用是代替 Servlet 程序回传 html 页面的数据。 因为 Servlet 程序回传 html 页面数据是一件非常繁琐的事情、开发成本和维护成本都极高。
技术交流
2022/11/18
1.6K0
JSP笔记
java后端开发每天遇到的jsp,了解一下
JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码(在<%%>不能定义方法)。语法:<%多行java代码 %>
好好学java
2018/09/21
1.2K0
java后端开发每天遇到的jsp,了解一下
[javaEE] jsp的指令
jsp的指令:jsp的指令(directive)是为jsp引擎而设计的,他们并不直接产生任何可见输出,而是告诉引擎如何处理jsp
唯一Chat
2019/09/10
9530
Java EE基础之JSP
本文介绍了Java技术栈的一些重要概念和基础知识,包括面向对象、集合、流程控制、函数式编程等。同时,还介绍了一些重要的Java库和工具,如Spring、Hibernate、Maven等。最后,通过一个具体的实例演示了如何使用这些概念和工具实现一个简单的Web应用程序。
Single
2018/01/04
1.6K0
Java EE基础之JSP
javaweb核心之页面技术
JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。
楠羽
2022/11/18
4020
javaweb核心之页面技术
Java-Jsp是什么原理又是什么
Java Server Page : Java服务器端页面,和Servlet一样,用于 动态Web 技术
白衣少年
2022/12/26
2.1K0
Java-Jsp是什么原理又是什么
JSP的include指令
  在JSP中,可以使用include指令来包含其他jsp文件。例如,一个网站中,多个网页具有很大部分是相同元素时,可以使用include指令来完成。include的指令的语法如下:
全栈程序员站长
2022/09/07
1.3K0
JSP开发基础入门学习1
Tomcat 最后会将 jsp 文件编译后的(.class-字节码文件/.java-类)存放在目录/work/Catalina/localhost/项目名/org/apache/jsp 里面:
全栈工程师修炼指南
2020/10/23
1.3K0
JSP开发基础入门学习1
JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】
什么是JSP JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在! 为什么需要JSP JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的。 简单使用一下JSP 在idea下生成一个JSP,我们来看一下JSP长什么样子 <%@ page contentType="text/html;charset=UTF-8" language="
Java3y
2018/03/15
1.3K0
JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】
tomcat编译超过64k大小的jsp文件报错原因
今天遇到一个问题,首先是在tomcat中间件上跑的web项目,一个jsp文件,因为代码行数实在是太多了,更新了几个版本之后编译报错了,页面打开都是报500的错误,500的报错,知道http协议返回码的都知道,这是服务端的报错。
SmileNicky
2019/01/17
1.2K0
相关推荐
关于利用maven搭建ssm的博客,我们一起来探讨下问的最多的问题
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验