游客发表
用JSP做网站,基于最直接的网站体验是:你写的Java代码就嵌在HTML里,服务器一编译,设计出来的基于就是纯HTML页面。我第一次接触是网站在一个课程设计上,当时用纯Servlet写登录功能,设计每个输出标签都得用out.println()拼字符串,基于改个按钮颜色要翻半天代码。网站换成JSP之后,设计页面结构和逻辑分开写,基于<% %>里处理数据库查询,网站外面照常写div和table,设计效率差别很明显。基于
JSP的网站本质是Servlet。Tomcat收到.jsp请求后,设计会把它翻译成Java文件,再编译成.class。这个过程只在第一次访问时发生,之后直接走缓存。理解这一点很重要——它意味着JSP适合做展示层,不适合写复杂业务逻辑。我见过有人在JSP里连数据库、做事务、算报表,页面打开要等七八秒。后来拆成Servlet+JSP+JavaBean,速度立刻正常了。
拿用户列表页举例。顶部用<%@ page import="java.sql.*" %>导包,中间<% %>里写JDBC查询,ResultSet拿到数据后,下面用<% while(rs.next()){ %>配合HTML的<tr><td>循环输出。这种写法现在看很原始,但胜在直观。新人不用学MVC、不用配框架,打开记事本就能写。我们学校机房那批老机器,跑Eclipse都卡,用JSP+Tomcat反而流畅。
内置对象是JSP的便利之处。request拿参数,session存登录状态,application做全局计数器。有个细节:session默认自动创建,如果页面只是静态展示,可以在page指令里加session="false"省内存。这种小优化在访问量上来之后差别不小。
前后端分离之后,JSP的定位变得尴尬。它把视图和逻辑揉在一起,调试时得同时看Java堆栈和HTML结构。团队协作更麻烦——前端改个样式,后端得重新部署;后端调个接口,前端要等编译。Thymeleaf、Freemarker这些模板引擎把标签语法做得更干净,Vue和React干脆把渲染搬到浏览器。JSP还在用<jsp:include>做页面复用的时候,别人已经用组件化开发了。
但老系统里JSP存量巨大。银行、政府、高校的内部管理系统,很多还是JSP+Struts2。维护这类项目,你会遇到<% @ taglib %>自定义标签、web.xml里配置的<jsp-config>、还有各种EL表达式和JSTL的混用。改一个页面,得先搞清楚这个项目用的是JSP 2.0还是2.3,Tomcat是7还是9。这种环境里,JSP知识不是过时,是刚需。
把Java代码控制在<% %>里,别用<%! %>声明成员变量——多线程下会出问题。能用JSTL和EL就用,<c:forEach>比<% for %>可读性好。页面编码统一用UTF-8,pageEncoding和contentType都写上,不然中文乱码能折腾一下午。数据库连接别在JSP里直接DriverManager获取,放到ServletContextListener里初始化连接池,JSP只负责取。
最后说个真事。去年帮老师改一个2010年的选课系统,JSP页面里嵌套了四层<table>,每个单元格里还有<% if %>判断。改一个选课按钮的跳转逻辑,花了三个小时才理清哪层循环对应哪个学期。这种代码现在没人会写,但它确实跑在几千个学生的选课季里。技术选型没有绝对的对错,只有合不合适。JSP适合那个年代,也适合现在某些特定场景——比如快速做个内部工具,或者维护遗留系统。
友情链接