JSP
简介
JSP(Java Server Pages):Java服务器端页面, 也和Servlet一样,用于动态web技术。其中可以书写java html js css。
特点
和HTML有很大的相似度,但同时他们之间也有一定的区别,HTML只给用户提供静态的数据,JSP页面中可以嵌入JAVA代码,为用户提供动态数据。
JSP原理
JSP的执行过程
jsp页面本质上是一个serlvet程序:当我们第一次访问jsp时,Tomcat服务器会将jsp翻译成一个xxx_jsp.java的源文件,并且编译为.class文件。在JSP页面中,只要是JAVA代码就会原封不动的输出,如果是HTML代码,就会被转换为out.write(“<html>\r\n”)的格式输出。
index_jsp.java文件
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPService
public void _jspService(request, response)
判断请求:
内置对象:
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page
final javax.servlet.http.HttpServletRequest; //请求
final javax.servlet.http.HttpServletResponse response; //响应
输出页面前增加的代码:
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
JSP基础语法
JSP有三种基础语法,分别是JSP表达式语法、定义脚本片段语法和声明脚本。
依赖
在使用JSP处理页面的时候,我们需要先导入相关的依赖。
//jsp依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
//JSPTL表达式依赖
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
//standard标准库
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
定义jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%–
jsp头部配置指令:
contenType属性:表示jsp返回的数据是什么 时源码中的resp.setContentType()
language属性:表述JSP翻译后是什么语言的文件
errorPage:设置当前jsp页面出错自动跳转到的页面路径
–%>
🌳JSP表达式
表达式脚本<%= 变量或表达式 %>
作用:再jsp页面上显示数据,用来程序的输出,输出到客户端。
<%!
List list = new ArrayList();
%>
<%=list%>
🌳脚本片段(小脚本)
<% java代码 %>
作用:可以在jsp页面中编写我们自己需要的功能(java语句)
<%--使用for循环输出表格第几行几列--%>
<table>
<%
for (int i = 0; i < 10; i++) {
%>
<tr>
<%
for (int j = 0; j < 10; j++) {
%>
<td>第<%=i + 1%>行;第<%=j + 1%>列</td>
<%
}
%>
</tr>
<%
}
%>
</table>
🌳声明脚本
<%!声明java代码%>
作用:可以给jsp翻译出来的java类定义属性和方法 静态代码块 内部类等,全局。
<%! int a = 3; %>
、
<%--声明静态代码块--%>
<%!
private static Map<String, Object> map1;//静态只能调用静态
static{
map1 = new HashMap<>();
}
%>
<%--声明方法--%>
<%!
public int abc(){
return 123;
}
%>
<%--声明内部类--%>
<%!
public class Student{
private int age;
private String name;
class motion{
private String condition;
}
}
%>
JSP声明:会被编译到JSP生成的JAVA类中,其他的会被生成到_jspService方法中。
JSP的注释不会被写到页面中,但是html的注释会被计入页面。
JSP指令
定制错误页面
<%@page errorPage="error/500.jsp" %>
//在500.jsp文件中自定义需要的内容
web.xml文件配置
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
</web-app>
头部和底部界面相同处理
在网页中我们经常会发现有的页面会存在头部和底部相同的界面,这个时候就可以使用以下的标签:
<%@include file=""%>//用来提取公共页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<%--法一--%>
<%--@include 会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
<h3>我是内容</h3>
<%@include file="common/footer.jsp"%>
<%--法二--%>
<%--jsp:include拼接页面, 本质上是三个页面--%>
<jsp:include page="/common/header.jsp" />
<h3>我是内容</h3>
<jsp:include page="/common/footer.jsp"/>
</body>
</html>
JSP对象
📕 九大内置对象
JSP内置对象,这些对象是访问JSP时Tomcat将页面翻译为Servlet后源码提供的对象
内置对象 | 作用 |
---|---|
request | 请求对象(存东西) |
response | 响应对象 |
pageContext | jsp的上下文对象(存东西) |
session | 会话对象(存东西) |
config | Servlet配置对象 |
out | JSP输出流对象 |
page | 当前jsp的对象,不用 |
exception | 异常对象 |
application | ServletContext对象(存东西) |
📕 四大域对象
域对象可以像Map一样存取数据的对象。四个域对象功能一样。不同的是他们对数据的存取范围。四大域对象都是可以存取数据,在使用上他们有优先顺序。从小到大:
pageContext—>request—>session—>application
域对象 | 作用域 |
---|---|
pageContext | 在当前jsp页面范围内的数据有效 |
request | 在一次请求内数据有效,客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻 |
session | 一个会话范围内数据有效(浏览器访问服务器,浏览器关闭则会话结束)。客户端向服务器发送请求产生的数据,之后还有用,比如:购物车 |
application | 整个web工程范围内有效(服务器不停止数据都在)。客户端向服务器请求,产生数据,一个用户用完了,其他用户还能用。比如:聊天数据 |
示例
<%--
Created by IntelliJ IDEA.
User: XRY
Date: 2023/5/8
Time: 19:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
pageContext.setAttribute("n1", "v1");//保存的数据只在一个页面中有效
request.setAttribute("n2", "v2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("n3", "v3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("n4", "v4");//保存的数据在服务器中有效,从打开服务器到关闭服务器
%>
<%
//从pageContext取出, 通过寻找的方式来获取
String n1 = (String)pageContext.findAttribute("n1");
String n2 = (String)pageContext.findAttribute("n2");
String n3 = (String)pageContext.findAttribute("n3");
String n4 = (String)pageContext.findAttribute("n4");
String n5 = (String)pageContext.findAttribute("n5");
%>
<%--使用EL表达式输出${}--%>
<h1>取出的值为:</h1>
<h1>${n1}</h1>
<h1>${n2}</h1>
<h1>${n3}</h1>
<h1>${n4}</h1>
<h1>${n5}</h1>
<%--取出的值为:
v1
v2
v3
v4--%>
<%--使用EL表达式查找不存在的东西的时候不会返回东西,但是在使用<%=%>正常输出的时候就会输出null的情况,所以推荐使用EL表达式--%>
</body>
</html>
定位资源
<%
pageContext.forward("地址");//可以实现转发相当于request.getRequestDispatcher();
%>
JSP标签、JSTL标签、EL表达式
相关依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
JSP标签
在之前的学习中我们提到了许多关于JSP的使用,其中也包含了许多标签的使用和解释,在这新加一组标签。
<%--<jsp:include page=""/>--%>
<jsp:forward page="/jsptag01.jsp">
<jsp:param name="name" value="khan"></jsp:param>
<%-- //在转发的时候,携带参数--%>
<jsp:param name="age" value="10"></jsp:param>
</jsp:forward>
JSTL标签
JSTL(JSP Standard Tag Library)JSP标准标签库,用来替换jsp中的代码脚本(Java代码),JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义了许多标签,可以供我们使用,标签的功能和java代码一样。可以使jsp页面更简洁。
使用步骤
1、 导入依赖
2、引入对应的taglib
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
注意:在使用的时候如果导入了标签仍然出错,就需要检查Tomcat中是否存在相关的包,如果不存在需要手动加入。
3、使用
JSTL条件判断(if)
<%--
Created by IntelliJ IDEA.
User: XRY
Date: 2023/5/8
Time: 20:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="coreif.jsp" method="get">
<%-- EL表达式获取表单中的数据
${}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username == 'admin'}" var="isAdmin">
<c:out value="管理员欢迎你"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>
JSTL条件判断(choose),相当于switch
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: XRY
Date: 2023/5/8
Time: 20:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定义一个变量score 值为85--%>
<c:set var="score" value="85"/>
<c:choose>
<c:when test="${score >= 90}">
你的成绩为优秀
</c:when>
<c:when test="${score >= 80}">
你的成绩为良好
</c:when>
<c:when test="${score >= 70}">
你的成绩为一般
</c:when>
<c:when test="${score >= 60}">
你的成绩为及格
</c:when>
<c:when test="${score < 60}">
你的成绩为不及格
</c:when>
</c:choose>
</body>
</html>
JSTL循环遍历(forEach)
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.lang.reflect.Array" %><%--
Created by IntelliJ IDEA.
User: XRY
Date: 2023/5/8
Time: 20:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<String> array = new ArrayList<>();
array.add("张三");
array.add("李四");
array.add("王五");
array.add("赵六");
array.add("田七");
request.setAttribute("arr", array);
%>
<%--item表示要遍历的对象
var:每一次遍历出来的变量--%>
<c:forEach var="people" items="${arr}">
<c:out value="${people}"/><br/>
</c:forEach>
</body>
</html>
EL表达式
EL表达式(Expression Language)表达式语言。
作用:EL在输出数据的时候比JSP表达式脚本简洁,替代JSP中的表达式脚本进行数据的输出,能够获取数据、执行运算、获取web开发的常用对象、调用java方法。
格式:${表达式}
EL表达式输出null值的时候,输出的就是空字符出串,jsp表达式输出null值时输出的是null
<%--
Created by IntelliJ IDEA.
User: XRY
Date: 2023/5/6
Time: 9:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--EL表达式搜索四个域对象数据的顺序--%>
<%
pageContext.setAttribute("key", "pageContext");
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
%>
${key}
<%--结果:pageContext--%>
</body>
</html>
当四个域的key都是同一个时,EL表达式会优先选择范围较小的。使用如下方法可以指定scope。
${applicationScope.key}
${requestScope.key}
${sessionScope.key}
${pageScope.key}
<%--pageContext 可以获取内置对象 通过内置对象可以获取很多信息--%>
主机名${pageContext.request.serverName}
端口号${pageContext.request.serverPort}
本机地址${pageContext.request.contextPath}