什么是JSP

JSP是一种动态web资源开发技术 ,本质上是一个Servlet。JSP的出现是为了解决Servlet在响应时不适合向外输出完整页面、以及解决html无法展示动态数据的问题。如今已经逐渐被前后端分离的框架所替代,今天就来扒一扒JSP。

1 Servlet

1.1 简介

说JSP是本质上是Servlet,那么Servlet是什么呢?

Servlet(全称为 Server Applet),是在服务器上运行的Java程序,本质上是一段java程序,由SUN公司提供的动态web资源开发技术。

这段java程序无法独立运行, 必须放在Servlet容器(如: tomcat服务器)中, 由容器调用才可以执行。

Servlet 的作用是处理请求,服务器接受到的请求,找到对应的Servlet处理,Servlet接受请求、处理请求、将结果响应给浏览器。

1.2 创建

一个Servlet只会被创建一次,然后一直用于提供服务,知道被销毁。

我们常使用的是 javax.servlet 包下提供的类,要创建一个Servlet类就要实现Servlet接口。

在Servlet接口中定义了五个方法:

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

这里还有两个常见的继承类, GenericServletHttpServlet

GenericServlet是一个抽象类,实现了 Servlet 接口,并且对其中的 init() 和 destroy() 和 service() 提供了默认实现。

HttpServlet 也是一个抽象类,它进一步继承并封装了 GenericServlet,使得使用更加简单方便,由于是扩展了 Http 的内容,所以还需要使用 HttpServletRequest 和 HttpServletResponse,这两个类分别是 ServletRequest 和 ServletResponse 的子类。

常用的创建方法是继承 HttpServlet 方法 ,重写doGet()和doPost()请求。

public class ServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("doget");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("dopost");
        doGet(req,resp);
    }
}

关于Servlet,本文暂且说这么多。

2 JSP

2.1 简介

JSP本质上就是一个Servlet,产生原因:

  • Servlet本质上是一段java代码,非常适合处理逻辑,但是处理的结果不太适合由Servlet向外输出(不适合输出完整的html页面,字符串拼接处HTML过于麻烦)。
  • HTML是用于开发网页的一门技术,可以用来展示数据。但是HTML开发出来的页面本质上就是一个文档(静态资源),无法展示动态的数据。
  • JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据。所以JSP的出现既可以解决Servlet不适合向外响应一个完整的页面又可以解决html无法展示动态数据的问题。

执行过程:

  1. 当一个JSP被第一次访问的时候,会首先翻译成一个Servlet文件(.java文件);
  2. Servlet文件再被进一步编译为.class文件;
  3. 执行字节码文件,其中的java代码在服务端执行,执行的结果和其他HTML内容将通过out.write()发送给浏览器;
  4. 浏览器解析HTML代码,显示网页。

所以,JSP的代码在执行的时候,会首先执行文件当中嵌套的JAVA代码,然后再执行前端域的代码。

从上述的过程中可以看出,JSP和Servlet也存在着区别:

  • 首先两者的创建方式不一样,Servlet都是由JAVA程序代码构成,用于流程控制和事务处理, JSP由HTML代码和JSP标签构成,可以方便地编写动态网页 ;
  • Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来, JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

故而在MVC架构模式中,JSP适合充当视图(view),Servlet适合充当控制器(controller)。

2.2 属性

1. JSP的四大作用域

page:只在一个页面保留数据(javax.servlet.jsp.PageContext(抽象类))

request:只在一个请求中保存数据(javax.servlet.httpServletRequest)

session:在一次会话中保存数据,仅供单个用户使用(javax.servlet.http.HttpSession)

application:在整个服务器中保存数据,全部用户共享(javax.servlet.ServletContext)

2. JSP的九大内置对象

JSP有九个内置对象(又叫隐含对象),不需要预先声明就可以在脚本代码和表达式中随意使用。JSP九大内置对象分为四类:

  • 输入输出对象:out对象、response对象、request对象
  • 通信控制对象:pageContext对象、session对象、application对象
  • Servlet对象:page对象、config对象
  • 错误处理对象:exception对象

九种对象简介:

out对象:用于向客户端、浏览器输出数据。
request对象:封装了来自客户端、浏览器的各种信息。
response对象:封装了服务器的响应信息。
exception对象:封装了jsp程序执行过程中发生的异常和错误信息。
config对象:封装了应用程序的配置信息。
page对象:指向了当前jsp程序本身。
session对象:用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数
application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。

2.3 语法

**1. 模板元素:**直接写在jsp页面中的html内容称之为jsp页面中的模版元素,模版元素在翻译过来的Servlet中被out.write()原样输出到浏览器中。

例如:

<html>
  <head>
    <title>首页</title>
  </head>
</html>

将会以out.write()原样输出:

out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<title>首页</title>\r\n");
out.write("</head>\r\n");

2. JSP表达式:

​ 格式: <%= 表达式 %> 其中可以书写常量、变量、表达式 ;

​ 作用: 执行表达式, 将结果再原样发送给浏览器。

例如:

<%= request.getContextPath()%>
<%= "dudu"%>

将会以out.write()原样输出:

out.print(request.getContextPath());
out.print("dudu");

3. JSP脚本片段:

格式:<% 若干java语句 %>

翻译前:

<% for(int i=0; i<5; i++){ %>
  <p>嘟嘟</p>
<% } %>

翻译后:

for(int i=0; i<5; i++){ 
  out.write("<p>嘟嘟</p>\r\n");
} 

4. JSP指令:

JSP指令格式:<%@ 指令名称 若干属性声明… %>

JSP指令的作用:不会直接产生输出,JSP指令是用来指挥JSP解析引擎如何来翻译当前JSP页面中其他部分的内容(除指令以外的其他内容,例如模版元素、jsp表达式等)

page指令:用来声明当前JSP页面的基本属性的。

<%@ page pageEncoding=“UTF-8” %> --通知JSP解析引擎使用指定的编码来翻译JSP

<%@ page import="…" %> – 为JSP翻译后的Servlet指定所依赖的jar包

include指令:可以实现页面包含的效果,即页面的合并效果

taglib指令:在使用JSTL标签库中的标签时, 在当前JSP中要引入JSTL标签库:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

5. EL表达式:

在JSP中可以非常方便的获取数据,可以代替JSP页面中的JSP表达式(<%= %>)

语法结构: ${ 表达式 }

主要作用: 主要用于获取request域中的数据

  • EL只能获取域中的数据,不能往域中添加数据或修改域中已有的数据

  • EL只能获取域中的数据,不能遍历数据(比如数组或集合)

3 JSP的衰落

  1. 动态资源和静态资源全部耦合在一起,给服务器增加了巨大的压力,服务器会收到各种http请求,包括业务请求和静态资源的请求等等。一旦服务器出现状况,页面将直接崩溃。
  2. 前后端不分离,导致开发的时候,页面的展示和一些业务处理,前后端分工不明确,后端需要修改JSP,前端也需要启动整个程序(包括后端程序)才可以编译前端的代码。
  3. JSP在服务器上是以.JSP格式存在,第一次请求jsp,必须要在web服务器中编译成servlet,第一次运行会较慢,且会全部编译整个页面,内容多的时候,同步加载会很慢。
  4. 每次请求jsp都是访问servlet再用输出流输出的html页面,效率没有直接使用html高。
  5. jsp必须要在支持java的应用服务器里运行(例如tomcat,jetty,resin等),无法使用nginx等只解析静态资源的WEB服务器,性能不够好。

文章参考:

https://blog.csdn.net/weixin_41141219/article/details/80811794

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值