jsp是什么

 人参与 | 时间:2026-10-17 07:06:28
```html jsp是什么

Servlet写HTML,你得把整个页面塞进out.println()里,一个表格能写出几百行Java字符串拼接。我第一次用Servlet做用户列表页,改一个表头颜色,得在几百行代码里找那一句out.println("<th bgcolor='#ccc'>"),眼睛都快瞎了。JSP就是来治这个病的——它让Java代码和HTML换个位置,HTML当主角,Java代码嵌进去。

本质上,JSP文件在服务器上会被翻译成一个Servlet。Tomcat收到index.jsp的请求,先检查有没有对应的Java文件,没有就现场翻译:把HTML部分原样输出到out.write(),把<% %>里的Java代码原封不动搬进_jspService()方法。翻译完编译成class,之后每次请求直接跑这个Servlet。所以JSP不是替代Servlet,它就是Servlet的另一种写法。你写JSP,服务器帮你写Servlet。

看个具体例子。一个显示当前时间的页面:

<%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <% java.util.Date now = new java.util.Date(); %> <p>现在时间是:<%= now %></p> </body> </html>

<%= %>叫表达式,翻译成out.print(now);。<% %>叫脚本片段,里面的代码按顺序进入_jspService。还有<%! %>声明,翻译成类成员变量或方法——这个用的少,因为Servlet是单例多线程,成员变量容易踩并发坑。

2005年前后JSP火得不行,培训机构教JSP+JavaBean+Servlet,号称MVC。但真写起来,JSP里混着<% if (user != null) { %>和HTML标签,前端改个按钮位置得找后端改JSP,后端调个字段名得通知前端。我见过一个电商首页JSP,两千多行,<% %>和<div>交替出现,跟斑马线似的。这种代码维护起来,谁碰谁头疼。

后来JSTL和EL表达式出来,情况好点。<c:forEach items="${ list}" var="item">比<% for(...) { %>干净。但标签库要引,函数要记,调试报错信息经常指向翻译后的Java文件,行号对不上,找bug得先找到翻译出来的index_jsp.java。Tomcat的工作目录下翻这个文件,是当年JSP程序员的日常。

现在新项目基本不用JSP了。Spring Boot默认模板引擎是Thymeleaf,前后端分离后,后端只出JSON,页面归Vue和React管。JSP的<%= %>在HTML里混Java,跟现在前端组件化的思路完全相反。但老系统里JSP存量巨大,银行、政府、国企的内部管理系统,很多还是JSP写的。维护这些系统,JSP该会还得会。

有个细节挺有意思:JSP翻译成的Servlet,_jspService方法里默认有HttpServletRequest request和HttpServletResponse response,还有PageContext pageContext、HttpSession session、ServletContext application这些内置对象。你不用声明就能直接用session.getAttribute(),因为翻译时自动加上了。这算是JSP给的一点便利,但也容易让人忘了这些对象的生命周期和线程安全问题。

说到底,JSP是一个特定历史阶段的产物。它解决了Servlet拼HTML的痛苦,但自己又制造了业务逻辑和视图混杂的新痛苦。技术就是这样,解决一个问题,往往带出下一个问题。现在回头看,JSP更像一座桥——从纯Servlet过渡到模板引擎,再到前后端分离。桥还在,走的人少了。

``` 顶: 4踩: 68