2020还有必要学JSP吗?,通往BAT必备法宝

程序员 专栏收录该内容
38 篇文章 0 订阅

现在问题来了,JSP放在2020年,是真的老了吗?对,是真的老了

现在问题又来了,为什么在几年前已经被定义『老』的技术,到2020年了还是有热度,每年还是有人在问:『还需要学习JSP吗』。我认为理由也很简单:JSP在之前用的是真的多

在我初学Java的时候,就经常听到:JSP和PHP是能够写动态网页的—《我的老师》。

当我们去找相关的学习资料时,发现到处都是JSP的身影,会给我一种感觉:好像不懂JSP就压根没法继续往下学习一样

如果你是新手,如果你还没学习JSP,我建议还是可以了解一下,不需要深入去学习JSP的各种内容,但可以了解一下。至少别人说起JSP的时候,你能知道什么是JSP,能看懂JSP的代码

额外说一句:你去到公司,可能还能看到JSP的代码。虽然JSP是『老东西』,但我们去到公司可能就是维护老的项目。JSP可能不用你自己去写,但至少能看得懂,对不对。

image

image

问题又来了,那JSP如果是『老东西』,那被什么替代了呢?要么就是用常见的模板引擎『freemarker』『Thymeleaf』『Velocity』,用法其实跟『JSP』差不太多,只是它们的性能会更好。要么前后端分离,后端只需要返回JSON给前端,页面完全不需要后端管。

说了这么多,我想说的是:“JSP还是有必要了解一下,不需要花很多时间,知道即可,这篇文章我就能带你认识JSP

image

image

什么是JSP?

JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在!JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的

在Tomcat博客中我提到过:Tomcat访问任何的资源都是在访问Servlet!,当然了,JSP也不例外!JSP本身就是一种Servlet。为什么我说JSP本身就是一种Servlet呢?其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)

比如我随便找一个JSP,编译后的JSP长这个样:

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;

public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List<String> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.List<String> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

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

    final PageContext pageContext;
    HttpSession session = null;
    final ServletContext application;
    final ServletConfig config;
    JspWriter out = null;
    final Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;

    try {
      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;

      out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>简单使用JSP</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");

    String s = "HelloWorda";
    out.println(s);

      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

编译过程是这样子的:浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求

以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的

既然JSP是一个Servlet,那JSP页面中的HTML排版标签是怎么样被发送到浏览器的?我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了。

out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("    <title>简单使用JSP</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");

有人可能也会问:JSP页面的代码服务器是怎么执行的?再看回1_jsp.java文件,java代码就直接在类中的service()中。

String s = "HelloWorda";
out.println(s);

**JSP内置了9个对象!**内置对象有:out、session、response、request、config、page、application、pageContext、exception。

重要要记住的是:JSP的本质其实就是Servlet。只是JSP当初设计的目的是为了简化Servlet输出HTML代码。

什么时候用JSP

重复一句:JSP的本质其实就是Servlet。只是JSP当初设计的目的是为了简化Servlet输出HTML代码。

我们的Java代码还是写在Servlet上的,不会写在JSP上。在知乎曾经看到一个问题:“如何使用JSP连接JDBC”。显然,我们可以这样做,但是没必要

JSP看起来就像是一个HTML,再往里边增加大量的Java代码,这是不正常,不容易阅读的。

所以,我们一般的模式是:在Servlet处理好的数据,转发到JSP,JSP只管对小部分的数据处理以及JSP本身写好的页面。

例如,下面的Servlet处理好表单的数据,放在request对象,转发到JSP

//验证表单的数据是否合法,如果不合法就跳转回去注册的页面
if(formBean.validate()==false){

  //在跳转之前,把formbean对象传递给注册页面
  request.setAttribute("formbean", formBean);
  request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);
  return;
}

JSP拿到Servlet处理好的数据,做显示使用:

image

JSP需要学什么

JSP我们要学的其实两块就够了:JSTL和EL表达式

EL表达式

**表达式语言(Expression Language,EL),EL表达式是用${}括起来的脚本,用来更方便的读取对象!**EL表达式主要用来读取数据,进行内容的显示!

为什么要使用EL表达式?我们先来看一下没有EL表达式是怎么样读取对象数据的吧!在1.jsp中设置了Session属性



## 总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

1.  技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
2.  项目经历:只写明星项目,描述遵循 STAR 法则;
3.  简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

> 以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频
> **[戳这里免费领取文中资料](https://gitee.com/vip204888/java-p7)**

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/7db51b5a50ecb6cf00b039378381b09f.png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/453c87b77c0d265da83cbdf62b6441eb.png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/db85107d6240ffda9689df20baf1714f.png)

+热门技术系列教程视频
> **[戳这里免费领取文中资料](https://gitee.com/vip204888/java-p7)**

[外链图片转存中...(img-Q7occQk8-1628562280923)]

[外链图片转存中...(img-bq4vSzpS-1628562280924)]

[外链图片转存中...(img-2bAvSgT7-1628562280925)]

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页

打赏作者

m0_60707186

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值