文章目录
Jsp
Jsp简介
Jsp全称
- Jsp全称Java Server Pages,运行在java服务器中的页面【不能直接在浏览器中运行】
- Jsp能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML。
- Jsp其本质就是一个Servlet。Servlet能做的事情JSP都能做。
- Jsp必须运行在服务器中,不能直接使用浏览器打开。
- Jsp是Web网页的技术标准,主要语法组成包括:指令,html模板元素,脚本片段(小脚本),表达式,声明,注释,后缀是*.jsp。
Jsp与Html区别
- Jsp是动态页面,Html是静态页面
动态页面 | 静态页面 | |
---|---|---|
运行原理 | 通过服务器解析后,将数据在浏览器中显示 | 直接在浏览器中解析运行 |
维护成本 | 较低,可以修改后台数据,进而影响页面中的数据 | 较高,必须将修改后的页面覆盖原页面 |
数据库 | 可以连接数据库 | 不可以连接数据库 |
访问速度 | 较慢 | 较快 |
书写代码 | 可以书写java代码 | 不能书写java代码 |
Jsp与Servlet分工
- Jsp本质是一个Servlet,翻译后的文件结构为: class helloworld_jsp : HttpJspBase : HttpServlet。
- Jsp主要负责显示及获取数据,从表面上看,Jsp相对于在html中嵌入java代码: jsp=html+java。
- Servlet主要负责处理业务,从表面上看,Servlet相当于在java中嵌入html代码:Servlet=java+html。
- 总结:相比于Servlet,Jsp更加善于处理显示页面,而Servlet更善于处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和sp结合使用,Servlet负责业务,Jsp负责显示。
Jsp基本格式
<%@ page language="java" contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<! DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
这是我的第一个jsp页面。
</body>
</html>
Jsp之HelloWorld
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>HelloWorld</title>
</head>
<body>
<% //脚本片段
int num = 10;
%>
这就是第<%=num%>个jsp页面!
<h2>显示1-100之间的偶数</h2>
<%
for (int i = 1; i < 100; i++) {
if (i%2 == 0) {
%>
<%=i%>
<%
}
}
%>
<br>
<%
for (int i = 1; i < 100; i++) {
if (i%2 == 0) {
out.print(i+" ");
}
}
%>
</body>
</html>
Jsp工作原理
xxx_jsp.java ->> class xxx_jsp: org.apache.jasper.runtime.HttpJspBase: HttpServlet
- 第一次请求jsp
- 服务器先将jsp翻译成xxx_jsp.java文件
- 再讲xxx_jsp.java文件编译为xxx_jsp.class文件
- 如果不是第一次
- 代码未改变:不会翻译&编译
- 代码改变:会翻译&编译
- 如果不是第一次
Jsp基本语法
- 指令
- 格式:<%@ 指令名称 属性=属性值 属性2=属性值2 ……%>
- 模板元素
- css | html | js…
- 脚本片段
- 格式:<%%>
- 作用:在_jspService()方法中,书写java代码
- 表达式
- 格式:<%=%>
- 作用:将数据显示到页面中
- 声明
- 格式:<%!%>
- 作用:在类中,书写java代码
- 注释
- java注释
- 单行注释://
- 多行注释 :/**/
- html注释
- <!-- -->
- jsp注释
- <%-- --%>
- java注释
Jsp注释 | Java注释 | Html注释 | |
---|---|---|---|
Jsp页面 | 可见 | 可见 | 可见 |
java页面 | 不可见 | 可见 | 可见 |
浏览器 | 不可见 | 不可见 | 可见 |
Jsp常用指令
page指令
- 语法格式:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- 属性
- contentType:与response.setContentType()作用一致
- language:设置jsp支持的语言 【有且只有java】
- import:导包
- errorPage:设置当前页面出错时的跳转页面
- isErrorPage:设置当前页面是否包含exception内置对象。默认:false
静态包含include指令
- 语法格式:
<%@ include file=""%>
- file属性:设置被包含文件的路径
- 特点:被包含文件不会被翻译&编译【先包含,在翻译】
- 适用场景:页面中是静态资源较多时,【java代码较少时】使用静态包含
Jsp中常用动作标签
动作标签语法格式:<jsp:xxx></jsp:xxx>
动态包含
- 语法格式:
<jsp:include page="index.jsp"></jsp:include>
- 特点:被包含文件同时被翻译&编译【先翻译,在包含】
- 适用场景:页面中动态资源较多时【java较多时】,使用动态包含
动作标签之转发
- 语法格式:
<jsp:foeward page="index.jsp"></jsp:forward>
Jsp中九大内置对象【隐式对象|隐含对象】
内置对象:无需我们程序员手动创建,就可以直接在jsp中使用的对象,称为内置对象,也叫隐式对象或隐含对像
- pageContext
- 页面域对象
- 类型:javax.servlet.jsp.PageContext
- 作用:
- 可以直接获取其他8个内置对象
- 域对象
- 在Servlet中获取的方式:无【导包后才能使用javax.servlet.jsp.PageContext;】
- request
- 请求域对象
- 类型:javax.servlet.http.HttpServletRequest
- 作用:与Servlet中一致
- 获取请求参数:request.getParameter()
- 获取请求头
- 获取URL
- 转发:request.getRequestDispatchaer().forward()
- 域对象 :request.getAttribute() | request.setAttibute()……
- session
- 会话域对象
- 类型:javax.servlet.http.HttpSession
- 在Servlet中获取的方式:request.getSession();
- application
- 上下文域对象
- 类型:javax.servlet.ServletContext
- 作用:
- 获取上下文路径
- 获取真实路径
- 获取上下文初始化参数
- 域对象
- 在Servlet中获取的方式:getServletContext()
- page
- 类型:java.lang.Object
- 作用:java.lang.Object page = this;
- response
- 类型:javax.servlet.http.HttpServletResponse
- 作用:
- 获取响应流,响应数据
- 设置响应头
- 重定向
- out
- 类型:javax.servlet.jsp.JspWriter
- 作用:与Servlet中PrintWriter作用类似,将数据显示到页面
- java.io.PrintWriter与javax.servlet.jsp.JspWriter都extends了java.io.Writer
- config
- 类型:javax.servlet.ServletConfig
- 作用:
- 获取Servlet名称
- 获取初始化参数
- 获取ServletContext对象
- exception
- 类型:java.lang.Throwable
- 作用:处理异常
- 总结:jsp一共是9个内置对象,但默认只有8个内置对象【其中exception内置对象,需要设置page指令中的【isErrorPage = true时】,才能提供】
Jsp四大域对象
域对象概述
- 生活中域【区域-快递】︰将物品从一个区域快递到另一区域【共享】
- 同区快递
- 同城快递
- 全国快递
- 全球快递
- 程序中域:将数据从一个区域“快递"到另—区域【共享】
四大域对象详情
- pageContext【页面域】
- 有效范围:在当前页面有效【离开当前页面失效】
- request【请求域】
- 有效范围:在当前请求有效【不在当前请求失效】
- 当前请求:指本次请求【请求路径发生变化就不在当前请求】
- 转发请求时:是在当前请求
- 有效范围:在当前请求有效【不在当前请求失效】
- session【会话域】
-
有效范围:在当前会话有效【离开当前会话失效】
-
当前会话:浏览器与服务器之间会话,与浏览器有关,与服务器无关
- 浏览器不关闭&不更换,即为当前会话
- 关闭浏览器或更换浏览器,当前会话结束
-
- application【上下文域|web域】
- 有效范围:当前web应有有效
- web应用卸载失效【关闭服务器|服务器进程结束】
域对象的共同API
域对象底层维护一个Map
- 设置属性到域中: void setAttribute(String key,Object value);
- 从域中获取指定的属性:Object getAttribute(String key);
- 移除域中指定属性:void removeAttribute(String key);
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>context1</title>
</head>
<body>
<h2>context1.jsp</h2>
<%
pageContext.setAttribute("key","pageContextValue");
request.setAttribute("key","requestValue");
session.setAttribute("key","sessionValue");
application.setAttribute("key","applicationValue");
%>
pageContext:<%=pageContext.getAttribute("key")%><br>
request:<%=request.getAttribute("key")%><br>
session:<%=session.getAttribute("key")%><br>
application:<%=application.getAttribute("key")%><br>
<%--测试页面域 页面域失效--%>
<%--<jsp:forward page="context2.jsp"></jsp:forward>--%>
<%-- 测试请求域 请求域失效,页面域失效--%>
<a href="context2.jsp">context2.jsp</a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>context2</title>
</head>
<body>
<h2>context2.jsp</h2>
pageContext:<%=pageContext.getAttribute("key")%><br>
request:<%=request.getAttribute("key")%><br>
session:<%=session.getAttribute("key")%><br>
application:<%=application.getAttribute("key")%><br>
</body>
</html>
-
测试页面域
-
测试请求域
-
测试会话域
-
测试web域