JSP总笔记
1.JSP简介
- 全称:Java Server Pages,运行在服务器上的Java页面,是一种动态网页技术。
- JSP必须要运行在服务器上,不能脱离服务器单独运行
- JSP的本质就是一个披着Html外衣的Servlet,即可以写html代码的java文件
2.JSP的运行原理
- 当我们访问jsp页面时会经历以下步骤:
- 1)JSP引擎将jsp页面翻译成java文件
- 2)Java虚拟机将java文件编译成class文件
- 3)JSP容器根据对应的类创建对象并调用_jspService()方法处理用户的请求
- 以访问index.jsp页面为例:
- 第一次访问index.jsp页面
- 1)JSP引擎将index.jsp页面翻译成index_jsp.java文件
- 2)Java虚拟机将index_jsp.java文件编译成index_jsp.class文件
- 3)JSP容器根据index_jsp这个类创建对象并调用_jspService()方法处理用户的请求
- 以后再访问index.jsp页面(前提是没有改变页面中的内容)
- 直接使用JSP容器根据index_jsp这个类创建对象并调用_jspService()方法处理用户的请求
3.JSP的基本组成
1)模板元素,与JAVA/JSP无关
- 就是HTML标签,在HTML中怎么用,在JSP中就怎么用
<a href="/Web08_JSP/index.jsp">我是一个超链接</a>
2)JSP脚本片段
- 格式:<% Java代码 %>
- 在JSP页面中可以有多个脚本片段,但是要保证多个脚本片段能完整拼接
<% for(int i = 0 ; i < 100 ; i ++){ //out.print("热巴热巴我爱你!"); %> <h1>热巴热巴我爱你!</h1> <% } %>
3)JSP表达式
- 格式:<%= 对象 %>
- JSP表达式是用来向浏览器输出一个对象
4)JSP声明:<%! … %>,定义java成员变量或方法
5)JSP注释
<!--
第一种是HMTL注释,客户端可以看到
第二种是Java注释
第三种是JSP注释
-->
<%-- 我是JSP注释,客户端无法看到 --%>
6)JSP指令
- 格式:<%@ 指令名 属性名1="属性值1" 属性名2="属性值2" %>
- 常用的指令
- page指令:用来告诉服务器如何解析当前页面
<!-- 常用属性: language:设置开发语言,默认值是java,可选值也是java contentType:设置内容的类型是html等,并告诉浏览器使用什么字符集进行解码, 对应的java文件的_jspService()方法中会有以下内容: response.setContentType("text/html; charset=UTF-8"); pageEncoding:设置翻译当前页面使用的字符集,即指定web容器采用什么编码来将此jsp文件翻译成java文件 errorPage:设置当当前页面出现异常,要转发到的页面 isErrorPage:设置当前页面是否是一个错误页面。默认是false,如果该为true, 则可以通过exception对象获取异常信息 import:导包,一般是重新创建一个page指令并通过import属性进行导包 -->
- include指令:用来将其它(子)页面引入 到当前(父)页面中
<!-- file:用来设置要包含的页面的地址 --> <!-- 这种方式称为静态包含:只是将子页面的代码复制进父页面中,所以如果子页面内容发生变化, 父页面将会重新编译--> <%@ include file="/include.jsp" %>
7)JSP动作标签
- 格式:<jsp:标签名 属性名="属性值"></jsp:标签名>
- 常用的动作标签
- useBean:创建JavaBean;
- setPropertory:为Bean属性赋值;
- name:需要赋值的bean; property:属性 value:属性值(如果是另一个Bean,需要套表达式)
<jsp:useBean id="bService" class="com.booksSys.service.BooksServiceImpl"/> <jsp:useBean id="bDao" class="com.booksSys.dao.BooksDaoImpl"/> <jsp:setProperty name="bService" property="bDao" value="<%= bDao %>"/> //java依赖关系: public class BooksServiceImpl implements BooksService { private BooksDaoImpl bDao; }
- forward标签:用来进行请求的转发
<!-- ★1.forward标签: --> <!-- 不带请求参数的转发,注意:标签体中不能包含任何内容 --> <jsp:forward page="/index.jsp"></jsp:forward> <!-- 带请求参数的转发 --> <jsp:forward page="/index.jsp"><jsp:param value="superAdmin" name="username"/></jsp:forward>
- include标签
<!-- 2.include标签:用来将其他页面(子)中的内容包含到当前页面(父)中 --> <!-- page:用来设置要包含的页面的地址 --> <!-- 这种方式称为动态包含,先执行子页面的代码,再将运行结果包含进父页面中, 所以,如果子页面内容发生变化,父页面不会重新编译 --> <!-- 如果被包含的页面是一个静态页面,通常我们使用静态包含; 如果被包含的页面是一个动态页面,通常我们使用动态包含 --> <jsp:include page="/include2.jsp"></jsp:include>
4.JSP中的9大内置对象
- JSP的隐含对象即在jsp页面中不用声明就可以直接使用的对象,是因为在对于的Java类的_jspService()方法中已经声明了这些对象。九大隐含对象:
- out
- 类型:JspWriter
- 作用:与PrintWriter的作用类似,可以向浏览器响应一些数据
- pageContext
- 类型:PageContext
- 作用:一个顶九个,通过它可以获取其他八个隐含对象
- 它还是一个域对象
- request
- 类型:HTTPServletRequest
- 作用:与Servlet中的request的作用一样
- 它还是一个域对象
- session
- 类型:HttpSession
- 在Servlet中通过以下方式获取
HttpSession session = request.getSession();
- 它还是一个域对象
- application
- 类型:ServletContext
- 在Servlet中通过以下方式获取
ServletContext application = this.getServletContext();
- 它还是一个域对象
- response
- 类型:HTTPServletResponse
- 作用:与Servlet中的response作用一样
- config
- 类型:ServletConfig
- 作用:获取配置信息
- page
- 类型:Object
- 作用:相当于this,代表当前对象(在jsp中几乎不用)
- exception
- 类型:Throwable
- 作用:获取异常信息。前提是jsp页面是一个错误页面,即jsp页面的page指令中的isErrorPage属性值为true
5.四个作用域对象
- 域指区域/范围,在JavaWeb中指不同的Web资源(Servlet、jsp页面)
- 由于不同的Web资源之间需要共享数据,所以就有了域对象
- 四个域对象中都维护着一个Map,用来存取要共享的数据
- 四个域对象都有以下三个方法(拥有setAtrrubite和getAtrrbite的对象统称为作用域对象):
- void setAttribute(String key , Object value)
- 向域对象中添加属性(设置要共享的数据)
- Object getAttribute(String key)
- 根据属性名从域对象中获取属性值(获取要共享的数据)
- void removeAttribute(String key)
- 根据属性名从域对象中移除属性值
- 四个域
- page域:当前页面,所有页面相关的象都由它来管理和创建它共享的数据,只能在当前页面使用。
- 对应的域对象:pageContext
- request域:一次请求 响应完成 作用域:一次请求中(请求转发也属于一次请求)
- 对应的域对象:request
- session域:当前会话(一次会话)会话超时之前都存在
- 对应的域对象:session
- application域:当前Web应用,服务器启动后,数据一直保存,直到服务器重启或关闭
- 对应的域对象:application
- 四个域的使用规则
- 能用小的就不用大的
- Servlet与Jsp的分工
- Servlet负责处理请求;Jsp负责生成静态显示页面
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律