一、Java中的动态网页简介
Servlet动态网页:Java代码(主)+ HTML代码(辅)
JSP动态网页:Java代码(辅)+ HTML代码(主)
Servlet的功能:
- 接收请求参数,封装成对象;
- 调用业务方法处理请求;
- 控制界面跳转到某一个JSP负责页面输出等。
我们一般不用Servlet做界面输出,我们将服务端和前端分离
二、JSP以及其原理
JSP(Java Server Page),其本质就是Servlet
从上图看出,JSPServlet的通配符映射为 *.jsp ,说明在浏览器地址栏中,以 .jsp 结尾的资源都会交给JSPServlet的类来处理。
那么JSPServlet到底把资源做什么处理了?
我们来看 jsp 文件编译成的 java 文件:(hello_jsp.java)
Tomcat 的 HttpJspBase 源码
我们发现最终 jsp 还是与Servlet有关
和Servlet中的方法是一致的
再继续看下面的代码:
就是在 Servlet 中输出静态网页内容
三、JSP基本语法
1.注释
- <!-- HTML注释 --> 会翻译到网页源代码中,但不会解释
- <%-- JSP注释--%> 不会翻译到Servlet和网页中
2.JSP脚本
- <% Java代码 %>
- <%= 表达式 %> 相当于out.print(XXX)
- <%! Java代码 %> 作为成员变量和方法
3.JSP指令
(1)page:
异常页面处理:
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="errorPage.jsp"%>
<% int a = 1/0; %>
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true"%>
<%
String msg = exception.getMessage();
%>
出错信息:<%= msg %>
设置全局错误页面:
(2)include
(3)taglib
四、JSP的九大内置对象和四大作用域
内置对象:在JSP中不需要声明和定义,可以直接使用的对象
对应的 obj_jsp.java 文件中:
九大内置对象
内置对象名称 | 内置对象类型 | 描述 |
request | HttpServletRequest | 请求对象 |
response | HttpServletResponse | 响应对象 |
pageContext | PageContext | 当前JSP作用域对象 |
session | HttpSession | 会话对象(session=“true”) |
exception | Throwable | 异常类型,封装当前JSP异常信息(isErrorPage=“true”) |
application | ServletContext | 当前Web应用对象 |
config | ServletConfig | 当前Servlet信息配置对象 |
out | JspWriter | 字符输出流对象 |
page | Object | 当前Servlet对象 |
作用域:作用域对象就只能在自己的作用范围内共享数据
作用域对象名称 | 作用域对象的类型 | 描述 |
pageContext | pageContext | 当前JSP作用域对象 |
request | HttpServletRequest | 当前请求的作用域 |
session | HttpSession | 当前会话的作用域 |
application | ServletContext | 当前Web应用的作用域 |
五、JSP的动作元素
以 forward 为例:
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<% //int a = 1/0; %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String age = request.getParameter("age");
%>
<%= age %>
</body>
</html>
obj.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="/jspdemo/hello/hello.jsp">
<jsp:param value="20" name="age"/>
</jsp:forward>
</body>
</html>
最后将请求转发到了 hello.jsp
静态与动态包含
静态包含:使用JSP的include指令
<%@include file="被包含的页面文件"%>
特点:在编译阶段就已经把多个JSP合并在一起了
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="top.jsp" %>
<br/>
main
<br/>
<%@ include file="foot.jsp" %>
</body>
</html>
动态包含:使用JSP动作指令
<jsp:include page="被包含的页面文件"/>
特点:每一个JSP都翻译成了Servlet类,在运行时期动态合并在一起
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="top.jsp"/>
<br/>
main
<br/>
<jsp:include page="foot.jsp"/>
</body>
</html>
注意:如果字包含的时候需要传递数据,此时只能使用动态包含,因为可以使用JSP的动作指令 getParameter