JSP基础
1、什么是JSP
- jsp 的全换是 java server pages。Java 的服务器页面
- jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据
- Servlet 程序回传 html 页面数据是一件非常繁锁的事情,开发成本和维护成本都极高,用JSP进行简化
- 相当于将Servlet封装了一层,JSP会解析成Servlet
Servlet回传html页面数据
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.write("<!DOCTYPE html>\r\n");
out.write(" <html lang=\"en\">\r\n");
out.write(" <head>\r\n");
out.write(" <meta charset=\"UTF-8\">\r\n");
out.write(" <title>Title</title>\r\n");
out.write(" </head>\r\n");
out.write(" <body>\r\n");
out.write(" 这是 html 页面数据 \r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
out.write("\r\n");
}
JSP回传html页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是 html 页面数据
</body>
</html>
2、JSP的本质
-
JSP就是Servlet程序
-
当我们第一次访问 jsp 页面的时候。Tomcat 服务器会帮我们把 jsp 页面翻译成为一个 java 源文件。并且对它进行编译成 为.class 字节码程序,jsp类继承于HttpJspBase,而HttpJspBase直接继承于HttpServlet,所以JSP间接继承了HttpServlet
-
相当于是将回传的html数据那部分抽离出来,使我们专注于业务,减少繁琐、重复的工作
3、JSP的三种语法
3.1、jsp 头部的 page 指令
jsp 的 page 指令可以修改 jsp 页面中一些重要的属性,或者行为
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Map" %>
属性 | 说明 |
---|---|
language | 表示 jsp 翻译后是什么语言文件。暂时只支持 java |
contentType | 表示 jsp 返回的数据类型是什么 |
pageEncoding | 表示当前 jsp 页面文件本身的字符集 |
import | 跟 java 源代码中一样。用于导包,导类 |
autoFlush | 设置当 out 输出流缓冲区满了之后,是否自动刷新缓冲级区。默认值是 true |
buffer | 设置 out 缓冲区的大小。默认是 8kb |
errorPage | 设置当 jsp 页面运行时出错,自动跳转去的错误页面路径 |
isErrorPage | 设置当前 jsp 页面是否是错误信息页面。默认是 false。如果是 true 可以 |
session | 设置访问当前 jsp 页面,是否会创建 HttpSession 对象。默认是 true |
extends | 设置 jsp 翻译出来的 java 类默认继承谁 |
3.2、jsp中常用脚本
3.2.1、声明脚本
可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块,内部类等
格式:
<%! 声明 java 代码 %>
示例:
<%--1、声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
<%--2、声明static静态代码块--%>
<%!
static {
map = new HashMap<String, Object>();
map.put("id","001");
map.put("name","张三");
map.put("age","20");
}
%>
<%--3、声明类方法--%>
<%!
public int test(){
return 2022;
}
%>
<%--4、声明内部类--%>
<%!
public static class Test{
private Integer id = 10;
private String name = "李四";
}
%>
3.2.2、表达式脚本
在 jsp 页面上输出数据
格式:
<%=表达式%>
表达式脚本的特点:
- 所有的表达式脚本都会被翻译到_jspService() 方法中
- 表达式脚本都会被翻译成为 out.print()输出到页面上
- 由于表达式脚本翻译的内容都在_jspService() 方法中,所以_jspService()方法中的对象都可以直接使用
- 表达式脚本中的表达式不能以分号结束
<%=2022%>
<%=22.22%>
<%="这是个字符串"%>
<%=map%>
<%=request.getParameter("username")%>
3.2.3、代码脚本
可以在 jsp 页面中,编写我们自己需要的功能(写的是 java 语句)
格式:
<%
java 语句
%>
代码脚本特点:
- 代码脚本翻译之后都在_jspService 方法中
- 代码脚本由于翻译到_jspService()方法中,所以在_jspService()方法中的现有对象都可以直接使用
- 还可以由多个代码脚本块组合完成一个完整的 java 语句
- 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
<%--for循环--%>
<%
for (int i=0;i<3;i++){
%>
<h1>第<%=i+1%>行</h1>
<%
}
%>
<%--jspService方法中内容都可以写--%>
<%
System.out.println(request.getParameter("username"));
%>
3.3、jsp中的三种注释
-
html注释
<!-- 这是html注释 -->
-
Java注释
// 单行java注释 /* 多行java注释 */
-
jsp注释
<%-- 这是jsp注释 --%>
在jsp中推荐使用jsp注释,可以注释掉所有代码
4、jsp九大内置对象
jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象,叫内置对象
对象名 | 说明 |
---|---|
request | 请求对象 |
response | 响应对象 |
pageContext | jsp的上下文对象 |
session | 会话对象 |
application | ServletContext对象 |
config | ServletConfig对象 |
out | jsp的输出流对象 |
page | 指向当前的jsp对象 |
exception | 异常对象 |
5、jsp的四大域对象
对象 | 所属类 | 说明 |
---|---|---|
pageContext | PageContextImpl 类 | 当前 jsp 页面范围内有效 |
request | HttpServletRequest 类 | 一次请求内有效 |
session | HttpSession 类 | 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器) |
application | ServletContext 类 | 整个 web 工程范围内都有效(只要web工程不停止,数据都在) |
四个域在使用上存在优先顺序,按域范围的从小到大排序
pageContext——>request——>session——>application
6、out输出和response,getWriter的区别
一般统一使用out输出,两种输出混合使用的话,out输出会追加到response输出的后面,会打乱顺序
7、常用标签
7.1、jsp静态包含
格式:
<%@ include file=""%>
file 属性指定你要包含的jsp页面的路径 地址中第一个斜杠/ 表示为http://ip:port/工程路径/ 映射到代码的web目录
静态包含的特点:
- 静态包含不会翻译被包含的jsp页面
- 静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出
7.2、动态包含
格式:
<jsp:include page=""></jsp:include>
动态包含的特点:
-
动态包含会把包含的jsp页面也翻译成为java代码
-
动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
-
动态包含,还可以传递参数
<jsp:include page="/include/footer.jsp"> <jsp:param name="username" value="bbj"/> <jsp:param name="password" value="root"/> </jsp:include>
动态包含的底层原理:
7.3、转发
格式:
<jsp:forward page=""></jsp:forward>
是请求转发标签,它的功能就是请求转发
8、示例
8.1、输出表格,里面有10个学生的信息
Servlet
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ArrayList<User> usersList = new ArrayList<>();
//模拟数据
for (int i=0;i<10;i++){
usersList.add(new User(i,"name"+i,12+i,"phone"+i));
}
req.setAttribute("user",usersList);
req.getRequestDispatcher("jsp/e.jsp").forward(req,resp);
}
jsp
<body>
<%
List<User> users = (List<User>) request.getAttribute("user");
%>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
<td>操作</td>
</tr>
<%for (User user : users) {%>
<tr>
<td><%=user.getId()%></td>
<td><%=user.getName()%></td>
<td><%=user.getAge()%></td>
<td><%=user.getPhone()%></td>
<td>添加、删除</td>
</tr>
<%}%>
</table>
</body>