5.1 简介
JSP全名为Java Server Pages,中文名叫java服务器页面,是一种动态页面技术,而HTML是属于静态页面。JSP可以在HTML中嵌入Java脚本代码,因为JSP本质上还是一个Servlet,因此JSP也必须依赖于web容器才能运行。JSP的出现并不是为了取代Servlet,而是简化了Servlet的工作,将Servlet中繁琐的视图呈现代码脱离出来,交给JSP来完成,让Servlet专注于请求的处理,所以在开发中通常将JSP和Servlet结合一起使用。
5.2 JSP引擎
由于JSP本质上就是一个Servlet,那么JSP引擎主要负责将JSP文件转义成一个Servlet的java源文件,然后再通过javac将这个源文件编译成class字节码文件并装载到JVM中执行。JSP引擎的核心类是JspServlet,位于Jasper.jar文件中,并且在Tomcat的web.xml中也默认就配置好了这个类(JspServlet也是一个Servlet)。因此,凡是以“.jsp”结尾的请求都会先经过JspServlet,那么这个引擎就可以开始工作。通常引擎转义和编译后的文件放在容器的work工作目录中。
注意:如果第一次访问JSP文件的时候,由于work目录中并不存在源文件和字节码文件,JSP引擎就必须完成这两个工作,因此,有可能在第一次访问JSP时会比较缓慢。当字节码编译出来加载后,第二次访问时速度就会很快了。
5.3 JSP的三大元素
5.3.1 指令元素
语法:<%@ %>
指令 | 说明 |
---|---|
page指令 | 用于设置JSP页面的相关信息以及编码 |
include指令 | 用于静态包含其他的JSP页面代码,所谓静态包含,就是在编译期,将另外的JSP页面的代码合并到当前的JSP中,最终只会产生一个Java源文件 |
taglib指令 | 这个指令用于引入标签库 |
5.3.2 动作元素
语法:jsp:xxx
动作 | 说明 |
---|---|
include | 动态包含其他JSP页面的内容,所谓的动态包含是指在编译期将不同的JSP文件转义成不同的Java源文件,然后在运行时才将目标内容包含到当前的JSP页面中 |
forward | 相当于Servlet中的转发,转发到其他的JSP页面或者Servlet |
param | 用于传递参数,通常结合其他的动作一起使用,例如转发时需要提交一些而外的参数 |
useBean | 用于在JSP页面中使用JavaBean对象,通常结合setProperty和getProperty来使用,完成bean对象的赋值和取值操作 |
5.3.3 脚本元素
脚本元素主要就是在JSP中嵌入Java脚本代码,包括声明、表达式、Java脚本
声明语法:<%! %>
表达式: <%= %>
Java脚本: <% %>
代码实例:
<%page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 声明变量和方法,这里声明的变量a是实例变量 --%>
<%!
int a = 10;
public void say(){
System.out.println("hello");
}
%>
<%-- 表达式,注意:表达式后面是不允许有;号结束的 --%>
3 + 1 = <%=3+1%><br/>
<%-- Java脚本,脚本代码最终会生成在servlet中的service方法中作为代码片段 --%>
<table border="1">
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<% for(int i=0;i<5;i++){%>
<tr>
<td>user<%=i%></td>
<td><%=10+i%></td>
</tr>
<%}%>
</table>
</body>
</html>
5.4 JSP内置对象
内置对象,是在容器运行时将创建好的9个对象内嵌在JSP中,在JSP里可以直接拿来使用的对象。
对象 | 说明 |
---|---|
out | 字符流输出对象 |
config | 等同于Servlet中的ServletConfig |
page | 表示当前JSP页面 |
request | 等同于Servlet中的HttpServletRequest |
response | 等同于Servlet中的HttpServletResponse |
session | 等同于Servlet中的HttpSession |
application | 等同于Servlet中的ServletContext |
pageContext | 表示当前JSP页面的上下文对象 |
exception | 表示当前JSP中的异常对象 |
示例代码:
<%page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 常用内置对象 --%>
<%
//使用request,API使用同HttpServletRequest一样
request.getParameter("userName");
request.setAttribute("user", "user1");
request.getAttribute("user");
//使用session,API使用等同于HttpSession
session.setAttribute("user", "user2");
session.getAttribute("user");
session.getId();
//使用response
//response.sendRedirect("demo.jsp");
//out对象,等同于字符输出流对象,在JSP页面输出相关内容
out.println("hello world");
//这个是输出在控制中
System.out.println("hello");
//使用application,等同于ServletContext
application.setAttribute("userName", "user3");
//pageContext使用
//从pageContext中获取相关的其他对象
HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
HttpServletResponse res = (HttpServletResponse)pageContext.getResponse();
HttpSession ses = pageContext.getSession();
ServletConfig conf = pageContext.getServletConfig();
ServletContext sc = pageContext.getServletContext();
//也可以通过pageContext来统一设置不同的作用域
//第三个参数表示要放入到哪个作用域,是一个int类型的参数
//1代表page作用域(当前页面有效)
//2代表请求作用域
//3代表会话作用域
//4代表上下文作用域
pageContext.setAttribute("userName", "zhangsan", 2);
//也可以指定中哪个作用域取出相应的值
String name = (String)pageContext.getAttribute("userName", 2);
out.println(name);
%>
</body>
</html>