一、什么是 jsp
jsp
的全称是java server pages
,即Java 的服务器页面。jsp
的主要作用是代替 Servlet 程序回传 html 页面的数据。因为 Servlet 程序回传html
页面数据是一件非常繁锁的事情。jsp
页面和html
页面一样,都是存放在 web 目录下。访问也跟访问html
页面一样。
二、jsp 的本质
jsp
页面本质上是一个 Servlet 程序
当第一次访问 jsp
页面的时候。Tomcat 服务器会把 jsp
页面翻译成为一个 java 源文件。并且对它进行编译成 为.class
字节码程序。
index_jsp.java
文件内容如下:index_jsp
这个类继承了HttpJspBase
类
HttpJspBase
类,它直接地继承了 HttpServlet
类。也就是说。jsp
翻译出来的 java 类,它间接了继承了 HttpServlet
类。也就是说,翻译出来的是一个 Servlet 程序。
翻译出来的 Servlet 程序的源代码,其底层实现,也是通过输出流,把 html
页面数据回传给客户端。
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
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;
out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>$Title$</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" $END$\n");
out.write(" </body>\n");
out.write("</html>\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
三、jsp的三种语法
1、jsp 头部的 page 指令
jsp
的 page
指令可以修改 jsp
页面中一些重要的属性或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
language
属性: 表示 jsp 翻译后是什么语言文件。暂时只支持 java。contentType
属性: 表示 jsp 返回的数据类型是什么。也是源码中response.setContentType()
参数值。pageEncoding
属性: 表示当前 jsp 页面文件本身的字符集。import
属性: 跟 java 源代码中一样。用于导包,导类。autoFlush
属性 :设置当out
输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true
。buffer
属性: 设置out
缓冲区的大小。默认是8kb
。errorPage
属性: 设置当 jsp 页面运行时出错,自动跳转去的错误页面路径。isErrorPage
属性 :设置当前 jsp 页面是否是错误信息页面。默认是false
。如果是true
可以 获取异常信息。session
属性 :设置访问当前 jsp 页面,是否会创建HttpSession
对象。默认是true
。extends
属性: 设置 jsp 翻译出来的 java 类默认继承谁。
2、jsp中的常用脚本
声明脚本
声明脚本的格式是:
<%! 声明 java 代码 %>
<%--1、声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
<%--2、声明 static 静态代码块--%>
<%!
static {
map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
}
%>
<%--3、声明类方法--%>
<%!
public int abc() {
return 12;
}
%>
<%--4、声明内部类--%>
<%!
public static class A {
private Integer id = 12;
private String abc = "abc";
}
%>
表达式脚本
表达式脚本可以在 jsp 页面上输出数据,格式是:
<%=表达式%>
<%=12 %>
<%=12.12 %>
<%="asd" %>
<%=map %>
<%=request.getParameter("username")%>
表达式脚本的特点:
- 所有的表达式脚本都会被翻译到
_jspService()
方法中 - 表达式脚本都会被翻译成为
out.print()
输出到页面上 - 由于表达式脚本翻译的内容都在
_jspService()
方法中,所以_jspService()
方法中的对象都可以直接使用。 - 表达式脚本中的表达式不能以分号结束。
代码脚本
代码脚本的格式是:
<%
int i = 1;
if (i == 1){
System.out.println(i);
}
%>
代码脚本的作用是可以在 jsp 页面中,编写我们自己需要的功能(写的是 java 语句)。
代码脚本的特点:
- 代码脚本翻译之后都在
_jspService()
方法中。 - 代码脚本由于翻译到
_jspService()
方法中,所以在_jspService()
方法中的现有对象都可以直接使用。 - 还可以由多个代码脚本块组合完成一个完整的 java 语句。
- 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据。
3、jsp 中的三种注释
html 注释
<!-- 这是 html 注释 -->
html
注释会被翻译到 java 源代码中。在_jspService
方法里,以 out.writer
输出到客户端。
java 注释
<%
// 单行 java 注释
/* 多行 java 注释 */
%>
java 注释会被翻译到 java 源代码中。
jsp 注释
<%-- 这是 jsp 注释 --%>
jsp 注释可以注掉,jsp 页面中所有代码。