文章目录
1 JSP简介
1.1 JSP的简介
JSP(Java Server Pages)即Java服务器页面
JSP的主要作用是代替Servlet程序回传HTML页面,由于Servlet程序回传HTML页面非常繁琐,开发成本和维护成本都很高,因此采用JSP来代替Servlet程序回传HTML页面
JSP页面和HTML页面都是存放在webapp目录下的,访问JSP页面的方式和访问HTML页面的方式也是相同的
1.2 JSP的本质
JSP页面本质上是Servlet程序
第一次访问JSP页面时,Tomcat会把JSP页面翻译成Java源文件,并编译成字节码程序,JSP翻译出来的Java源文件间接地继承了HttpServlet类,也就是说JSP本质上就是一个Servlet程序,其底层也是通过输出流,将HTML页面数据回传给客户端
一个JSP页面index.jsp:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>About_JSP</title>
</head>
<body>
<h1><%= "Hello World!" %></h1> <br/>
<a href="hello-servlet">Hello Servlet</a>
<form action="/MyServlet1" method="get">
<input type="submit">
</form>
</body>
</html>
该JSP页面被Tomcat翻译的Java源文件:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
...
...
// jsp页面翻译成Servlet程序的核心方法
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
...
...
1.3 JSP的page指令
每一个JSP页面都有一个page指令:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
JSP的page指令可以修改JSP页面中的一些重要属性或行为
page指令常用属性:
language属性 暂时只支持Java
contentType属性 jsp返回的数据类型,源码中response.setContentType()的参数值
pageEncoding属性 表示当前jsp页面文件本身的字符集 默认UTF-8
import属性 和Java的import相同用于引入类
// 用于设置out输出流
autoFlush属性 设置当out输出流缓冲区满了后,是否自动刷新缓冲区 默认为true
buffer属性 设置out输出流缓冲区的大小,默认为8kb
errorPage属性 设置当jsp页面运行出错时,自动跳转到的错误页面路径
isErrorPage属性 设置当前jsp页面是否是错误信息页面 默认是false 如果是true 可以获取异常信息
session属性 设置访问当前jsp页面是否会创建HttpSession对象 默认是true
extends属性 设置jsp翻译出来的java类继承谁 默认是HttpServlet
使用示例:
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="utf-8"
autoFlush="true" buffer="8kb"
errorPage="/error.jsp" session="true" %>
2 JSP脚本
2.1 声明脚本 <%! %>
声明脚本可以给JSP翻译出来的Servlet程序定义属性,方法,静态代码块,内部类等,声明脚本很少使用
在JSP页面中增加声明脚本:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8"
autoFlush="true" buffer="8kb"
errorPage="/error.jsp" session="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>JSP page Info</h1>
<%-- 声明脚本 --%>
<%-- 1,声明类的属性 --%>
<%!
private int id;
private static List<Integer> numList;
%>
<%-- 2,声明static静态代码块 --%>
<%!
static {
numList = new ArrayList<>();
}
%>
<%-- 3,声明类的方法 --%>
<%!
public void setId(int id) {
this.id = id;
}
%>
<%-- 4,声明内部类 --%>
<%!
public static class A {
private String name;
private String password;
public A(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
%>
</body>
</html>
在上述JSP页面中定义的成员,方法,内部类等都会被Tomcat翻译到该JSP页面对应的Servlet程序
2.2 表达式脚本 <%= %>
表达式脚本可以在JSP页面上输出数据,如整型,浮点,字符串,对象
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%!
private static List<Integer> numList;
%>
<%!
static {
numList = new ArrayList<>();
}
%>
<%-- 表达式脚本 --%>
<%-- 1,输出整型 --%>
<%=12%>
<%-- 2,输出浮点型 --%>
<%=3.24%>
<%-- 3,输出字符串 --%>
<%="Hello jsp"%>
<%-- 4,输出对象 --%>
<%=numList%>
<%-- 直接使用_jspService方法中的对象 --%>
<%=request.getParameter("")%>
</body>
</html>
对应的页面效果:

表达式脚本的特点:
1,所有脚本内容都会被翻译到该JSP页面
对应的Servlet程序中的_jspService方法中
2,表达式脚本都会在_jspService方法中
被翻译为 out.print() 输出到页面上
3,由于表达式脚本翻译的内容都会被写在_jspService方法中
所以_jspService方法中的对象都可以直接使用
如request,response,out等对象
4,表达式脚本中的表达式,不能以 ; 结束
2.3 代码脚本 <% %>
代码脚本可以在JSP页面中编写Java语句,如if,for等
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 代码脚本 --%>
<%-- if语句 --%>
<%
int i = 10;
if(i == 10) {
System.out.println("Y");
} else {
System.out.println("N");
}
%>
<%-- for语句 --%>
<%
for(int j = 0; j < 10; j++) {
System.out.println("j: " + j);
}
%>
<%-- 翻译后jsp对应的Servlet源码的 _jspService方法内的代码都可以写
如使用request对象 response对象等 --%>
<%
request.getParameter("");
response.sendRedirect("/index.jsp");
%>
<%-- 一段Java语句可以由多块代码脚本组成 --%>
<%
int a = 10;
if(a == 10) {
%>
<%
System.out.println(a);
}
%>
<%-- 代码脚本和表达式脚本组合在jsp页面上输出数据 --%>
<%
for(int index = 0; index < 10; index++) {
%>
<%=index%>
<%
}
%>
<table border="1">
<%
for(int t = 0; t < 5; t++) {
%>
<tr>
<td>
the <%=t%> row
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
对应的页面效果:

代码脚本的特点:
1,JSP页面中的代码脚本翻译后的内容
都在Servlet程序的_jspService方法中
2,代码脚本由于翻译到了_jspService方法中
所以在_jspService方法中的对象都可以直接使用
3,代码脚本可以由多个代码脚本块组合成一个完整的Java语句
4,代码脚本还可以和表达式脚本+Html标签组合使用
在JSP页面上输出数据
2.4 JSP中的注释
JSP页面中有3种注释:
html注释 <!-- -->
会被翻译到Servlet源码中,在_jspService方法中
以out.writer输出到客户端,但仍然是页面中的注释
Java注释 // /**/
会被翻译到Servlet源码中,仍然以Java注释的形式存在
JSP注释 <%-- --%>
JSP页面真正的注释,可以注释掉JSP页面中所有的内容

899

被折叠的 条评论
为什么被折叠?



