在Javaweb中,Servlet负责后端处理请求并响应数据给客户端,那么Servlet程序是与前端页面肯定要做数据的传递,那么这种交互是怎么实现的?答案是通过JSP。在JSP中可以写前端代码,还可以写Java代码。JSP具有自己的语法。
JSP的全称是Java Server Pages,即Java的服务器页面。 作用是实现前端页面的数据和后端(servlet)数据的交互。
-01- JSP的本质
JSP本质上是一个Servlet程序。 创建一个Javaweb工程,可以在webapp下看到一个index.jsp文件,配置好tomcat,启动。在浏览器访问tomcat会跳转到index.jsp的页面。 此时,打开tomcat安装目录, 进入路径:apache-tomcat-9.0.43\work\Catalina\localhost\ROOT\org\apache\jsp, 可以看到index_jsp.class、index_jsp.java两个文件, 打开后者可以看到“index_jsp extends org.apache.jasper.runtime.HttpJspBase”,而HttpJspBase类继承自HttpServlet类。说明index_jsp是一个Servlet程序。
在webapp目录下,右击 --> new --> JSP/JSPX,创建一个JSP文件。
-02- JSP常用语法
1、声明脚本 格式:<%! 声明Java代码 %> 作用:在JSP中定义java方法、属性等 特点:不会在浏览器的页面上显示出来,仅存在于翻译后的Java类中
<%!
private String name = "Orange";
public int sum(){
return 1+1;
}
%>
2、表达式脚本 格式:<%=表达式 %> 作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)
<%=sum()%>
3、代码脚本 格式:<% Java语句 %> 作用:在JSP页面中可以编写需要的Java代码
<%
System.out.println("在控制台输出");
%>
启动tomcat,访问当前jsp页面: 浏览器 => 控制台 =>
-03- JSP内置对象
内置对象指的是Tomcat服务器将JSP页面翻译为Java类之后内部提供的九大对象(无需我们创建,可以直接在JSP中使用) 九大内置对象 request:请求对象 response:响应对象 pageContext:JSP的上下文对象 session:会话对象 application:ServletContext对象 config:ServletConfig对象 out:JSP输出流对象 page:指向当前JSP的对象 exception:异常对象
九大内置对象并不需要全部了解,主要是其中的: 四大域对象 域即作用域,作用范围。 域对象是指可以像Map一样存取数据的对象,四个域对象功能一样,只是对数据的存取范围不同 ------------对象------------------------------------------------作用域---------------------------------------------------- pageContext:JSP的上下文对象 --》在当前jsp页面中有效 request:请求对象 --》一次请求中有效 session:会话对象 --》一次会话中有效 application:ServletContext对象 --》整个web工程范围(web的启动到关闭)有效 ------------对象------------------------------------------------作用域----------------------------------------------------
创建TestJSP02_1.jsp:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/1/8 0008
Time: 9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>01</title>
</head>
<body>
<h1>JSP02-1</h1>
<%
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
%>
<%--转发--%>
<jsp:forward page="TestJSP02_2.jsp"></jsp:forward>
</body>
</html>
此时pageContext.setAttribute如果报红,那是因为没有在pom.xml中导入jsp的依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
创建TestJSP02_2.jsp:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/1/8 0008
Time: 9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>01</title>
</head>
<body>
<h1>JSP02-2</h1>
pageContext域是否有值:<%=pageContext.getAttribute("key")%> <br>
request域是否有值:<%=request.getAttribute("key")%> <br>
session域是否有值:<%=session.getAttribute("key")%> <br>
application域是否有值:<%=application.getAttribute("key")%> <br>
</body>
</html>
访问TestJSP02_1.jsp页面:http://localhost:8080/myservlet/TestJSP02_1.jsp 可以看到pageContext域对象的值为null,这是因为pageContext只在页面内有效,而这里是从TestJSP02_1转发到了TestJSP02_2,不同页面。 验证其他域对象的作用域: 访问TestJSP02_2.jsp页面:http://localhost:8080/myservlet/TestJSP02_2.jsp request域的值为null,因为request在不同的请求中无效。 关掉浏览器,打开重新访问TestJSP02_2.jsp页面:http://localhost:8080/myservlet/TestJSP02_2.jsp 这次连session域的值也为null,这是因为关闭浏览器之后就结束一次会话了,重新访问已经是不同会话了。 而application域是整个web工程,只要tomcat一直启动着,那么就可以获取到application的值。
-04-JSP的常用标签
1.静态包含:一个jsp页面可以包含另一个jsp页面 <%@include file=""%> 其中file属性设置要包含的JSP页面,以/打头,代表http://ip:port/工程路径/,对应web目录
2.动态包含:一个jsp页面可以包含另一个jsp页面,动态包含还可以传递参数 <jsp:include page=""></jsp:include> 其中page属性设置要包含的JSP页面,与静态包含一致
代码示例: 创建一个TestJSP03head.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/1/8 0008
Time: 9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>head</title>
</head>
<body>
___
---`|头部|`--<br>
-----\-/----<br>
</body>
</html>
创建一个TestJSP03body.jsp,在TestJSP03body中包含TestJSP03head(静态包含)
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/1/8 0008
Time: 9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>body</title>
</head>
<body>
<%@include file="TestJSP03head.jsp"%>
/-----------\<br>
|-|\-body-/|-|<br>
|-|-|__|__|-|-|<br>
|_|-|__|__|-|_|<br>
<jsp:include page="TestJSP03foot.jsp">
<jsp:param name="key" value="----foot----"/>
</jsp:include>
</body>
</html>
创建一个TestJSP03foot.jsp,在TestJSP03body中动态包含TestJSP03foot
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/1/8 0008
Time: 9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>foot</title>
</head>
<body>
---|-|--|-|--<br>
---|-|--|-|--<br>
---|-|--|-|--<br>
---|-|--|-|--<br>
<%=request.getParameter("key")%>
</body>
</html>
启动web工程,访问TestJSP03body:
|