很多新手学 JSP 时,都会被一堆尖括号和对象名搞得晕头转向:<% %> 和 <%@ %> 到底有啥区别?内置对象不用定义就能用,背后到底咋回事?标签库那么多,哪些才是真正常用的?其实啊,JSP 的核心语法就像搭积木的零件,标签库是 “标准模块”,内置对象是 “现成工具”,把这俩搞明白,写动态网页就会顺顺当当。今天兔子哥就掰开了揉碎了讲这两块,保证零基础的朋友也能看明白、用得溜。
标签库:让 JSP 代码更干净的 “语法模块”
JSP 能在 HTML 里写 Java 代码,但写多了就会乱糟糟,维护起来头疼。标签库就是为了让代码更整洁,把常用功能做成标签,不用写复杂 Java 代码也能实现功能。咱们重点学三类最常用的标签。
第一类:脚本元素标签 —— 直接插 Java 代码的 “通道”
这是最基础的标签,用来在 JSP 里写 Java 语句,新手刚开始接触最多的就是它们:
<% 代码 %>:写 Java 语句块,比如定义变量、循环、判断。jsp<%String name = "JSP学习者";int age = 20;if(age >= 18) {%><%=name%>已成年
<%}%>
这种标签里的代码会被编译成 Servlet 的 service 方法里的代码,每次请求都会执行。<%= 表达式 %>:输出内容到网页,相当于out.print(表达式),比写out.println简洁多了。上面例子里的<%=name%>就是输出变量值。<%! 定义 %>:声明全局变量或方法,整个 JSP 页面都能用,编译后会变成 Servlet 类的成员。比如定义一个计算方法:jsp<%!int add(int a, int b) {return a + b;}%>3+5=<%=add(3,5)%>
有朋友会问,这三种标签能随便用吗?建议少用
<%! %>定义全局变量,因为 JSP 是多线程的,全局变量可能会有线程安全问题,新手刚开始尽量用局部变量。第二类:指令标签 —— 告诉服务器怎么 “处理” JSP
指令标签用来设置 JSP 页面的全局属性,格式是
<%@ 指令名 属性=值 %>,最常用的有三个:page指令:设置页面编码、导入类、指定错误页等。jsp<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%@ page import="java.util.Date, java.text.SimpleDateFormat" %><%@ page errorPage="error.jsp" %>
编码设置一定要加,不然中文会乱码,这是新手最容易踩的坑。include指令:静态包含其他页面,把被包含页面的内容直接合并到当前页面,编译成一个 Servlet。jsp<%@ include file="header.jsp" %>这是正文内容
<%@ include file="footer.jsp" %>
适合包含固定不变的内容,比如网站头部尾部。taglib指令:引入标签库,比如后面要讲的 JSTL 标签库就需要用它引入。
第三类:JSTL 标签库 —— 让代码 “去 Java 化” 的利器
JSTL(JSP 标准标签库)是官方提供的标签库,能替代大部分 Java 脚本,让 JSP 页面更像 HTML,推荐新手多使用。用之前得先在页面顶部引入:
jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>常用的核心标签有:
:输出内容,比<%= %>更安全,能自动转义特殊字符。jsp:条件判断,不用写<% if %>这种混合代码了。jsp已成年
:循环遍历集合,比如遍历列表、数组。jsp<%Listfruits = new ArrayList<>();fruits.add("苹果");fruits.add("香蕉");request.setAttribute("fruits", fruits); // 存到request里%> - ${fruit}
为什么推荐用 JSTL?因为它让代码更整洁,而且避免了在 JSP 里写大量 Java 代码,后期维护起来方便多了。我之前接手一个老项目,全是
<% %>脚本,改个逻辑得翻半天,换成 JSTL 后清爽多了。内置对象:不用声明就能用的 “现成工具”
JSP 有 9 个内置对象,这些对象由容器自动创建,不用我们
new就能直接用,简直是懒人福音。新手先掌握这 5 个最常用的就行。1. out 对象:往网页 “写内容” 的笔
out对象用来输出内容到网页,常用out.print()和out.println()方法,和<%= %>功能类似,但out可以在脚本块里灵活使用。jsp
<%out.print("Hello ");out.println("JSP!"); // println会换行,但在HTML里要靠
才显示换行%>注意
out输出的内容会先放到缓冲区,满了才会输出到网页,而<%= %>是直接输出,一般情况下用<%= %>更简单。2. request 对象:接收用户 “输入” 的信使
用户通过表单、URL 参数传过来的数据,都靠
request对象获取。常用方法:getParameter(String name):获取单个参数值,比如表单里的用户名。getParameterValues(String name):获取多个参数值,比如复选框选中的多个选项。setAttribute(String name, Object value):存数据到 request 域,在转发的页面里能取到。getRequestDispatcher(String path).forward(request, response):转发到其他页面。
示例:处理登录表单提交的数据
jsp
<%String username = request.getParameter("username");String[] hobbies = request.getParameterValues("hobby"); // 获取复选框的值request.setAttribute("user", username); // 存数据// 转发到欢迎页request.getRequestDispatcher("welcome.jsp").forward(request, response);%>3. response 对象:给用户 “发响应” 的快递员
response对象用来处理服务器对客户端的响应,常用方法:sendRedirect(String path):重定向到其他页面,和 request 转发不同,重定向后地址栏会变,而且 request 里的数据会丢失。setContentType(String type):设置响应内容类型,比如response.setContentType("text/html;charset=UTF-8")。addCookie(Cookie cookie):添加 Cookie 到客户端。
什么时候用转发,什么时候用重定向?表单提交后一般用重定向,防止用户刷新页面重复提交;而需要带数据到下一个页面时用转发。
4. session 对象:记住用户 “状态” 的会员卡
session对象用来存储用户的会话信息,比如登录状态,在整个会话期间(默认 30 分钟)都有效。常用方法:setAttribute(String name, Object value):存数据到 session 域。getAttribute(String name):取数据。invalidate():销毁 session,比如用户退出登录。
登录功能示例:
jsp
<%String username = request.getParameter("username");if("admin".equals(username)) {session.setAttribute("loginUser", username); // 标记用户已登录response.sendRedirect("index.jsp");}%>在其他页面判断用户是否登录:
jsp
<%if(session.getAttribute("loginUser") == null) {response.sendRedirect("login.jsp"); // 没登录就跳回登录页}%>5. application 对象:全局共享的 “公告板”
application对象代表整个 Web 应用,所有用户共享,服务器启动时创建,关闭时销毁。适合存全局数据,比如网站访问量。jsp
<%Integer count = (Integer)application.getAttribute("visitCount");if(count == null) {count = 1;} else {count++;}application.setAttribute("visitCount", count); // 累加访问量%>本站访问量:<%=count%>
内置对象对比表
| 对象名称 | 作用范围 | 常用场景 | 数据生命周期 |
|---|---|---|---|
| out | 页面内 | 输出内容到网页 | 单次请求 |
| request | 单次请求 | 接收参数、转发数据 | 转发内有效,请求结束失效 |
| response | 单次响应 | 重定向、设置响应头 | 响应结束失效 |
| session | 用户会话 | 存储登录状态、用户偏好 | 会话超时或销毁后失效 |
| application | 整个应用 | 存储全局数据、网站配置 | 服务器运行期间有效 |
实战小技巧:标签库与内置对象怎么结合用?
最好的用法是用 JSTL 标签配合内置对象的域数据,减少 Java 脚本。比如用
遍历request里的集合,用判断session里的登录状态:jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>请登录 欢迎您,${sessionScope.loginUser}
退出${product.name} - 价格:${product.price}
这样的代码几乎看不到 Java 脚本,干净又好维护,这才是 JSP 的最佳实践。
兔子哥觉得,学 JSP 核心语法不用死记硬背,多写几个小例子自然就熟了。标签库要优先用 JSTL,少写 Java 脚本;内置对象要分清它们的作用范围,别存错了地方。刚开始可能会混淆 request 和 session 的用法,没关系,多试几次就知道:短期用的数据存 request,用户专属的数据存 session,全局数据存 application。
其实 JSP 的核心就是 “用标签简化代码,用内置对象处理数据和交互”,掌握了这个逻辑,不管做登录、列表展示还是数据提交,都能举一反三。希望这篇教程能帮到刚开始学 JSP 的朋友,动手写起来比光看教程有用多啦!
标签: 晕头转向 out.println
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
评论列表
核心语法标签库内置对象全解析