了解JSP
1、什么是JSP?
JSP全名为Java Servlet pages,中文名为web服务器页面,它是在传统的网页HTML文件(*.htm,*.html)中插入java程序段和JSP标记,后缀名为(*.jsp),其根本是一个简化的Servlet设计。
2、为什么要有JSP?
直接使用HTML文件(*.html)没有办法输出java当中的信息,使用servlet输出页面非常麻烦,于是出现了jsp,既能写HTML,又能写java代码。

1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <% 11 String name="今夕何希"; 12 %> 13 <h1><%=name %></h1> 14 15 </body> 16 </html>
3、jsp的工作原理
(1)jsp本质是servlet
(2)jsp第一次访问时会被web容器翻译成servlet,在tomacat的work目录下(E:\Program Files\Java\tomcat\apache-tomcat-7.0.90\work\Catalina\localhost\JSP\org\apache\jsp),能够找到翻译成的.java文件:

1 /* 2 * Generated by the Jasper component of Apache Tomcat 3 * Version: Apache Tomcat/7.0.90 4 * Generated at: 2018-09-15 13:13:30 UTC 5 * Note: The last modified time of this file was set to 6 * the last modified time of the source file after 7 * generation to assist with modification tracking. 8 */ 9 package org.apache.jsp; 10 11 import javax.servlet.*; 12 import javax.servlet.http.*; 13 import javax.servlet.jsp.*; 14 15 public final class Test_jsp extends org.apache.jasper.runtime.HttpJspBase 16 implements org.apache.jasper.runtime.JspSourceDependent { 17 18 private static final javax.servlet.jsp.JspFactory _jspxFactory = 19 javax.servlet.jsp.JspFactory.getDefaultFactory(); 20 21 private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; 22 23 private volatile javax.el.ExpressionFactory _el_expressionfactory; 24 private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; 25 26 public java.util.Map<java.lang.String,java.lang.Long> getDependants() { 27 return _jspx_dependants; 28 } 29 30 public javax.el.ExpressionFactory _jsp_getExpressionFactory() { 31 if (_el_expressionfactory == null) { 32 synchronized (this) { 33 if (_el_expressionfactory == null) { 34 _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); 35 } 36 } 37 } 38 return _el_expressionfactory; 39 } 40 41 public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { 42 if (_jsp_instancemanager == null) { 43 synchronized (this) { 44 if (_jsp_instancemanager == null) { 45 _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); 46 } 47 } 48 } 49 return _jsp_instancemanager; 50 } 51 52 public void _jspInit() { 53 } 54 55 public void _jspDestroy() { 56 } 57 58 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) 59 throws java.io.IOException, javax.servlet.ServletException { 60 61 final javax.servlet.jsp.PageContext pageContext; 62 javax.servlet.http.HttpSession session = null; 63 final javax.servlet.ServletContext application; 64 final javax.servlet.ServletConfig config; 65 javax.servlet.jsp.JspWriter out = null; 66 final java.lang.Object page = this; 67 javax.servlet.jsp.JspWriter _jspx_out = null; 68 javax.servlet.jsp.PageContext _jspx_page_context = null; 69 70 71 try { 72 response.setContentType("text/html; charset=utf-8"); 73 pageContext = _jspxFactory.getPageContext(this, request, response, 74 null, true, 8192, true); 75 _jspx_page_context = pageContext; 76 application = pageContext.getServletContext(); 77 config = pageContext.getServletConfig(); 78 session = pageContext.getSession(); 79 out = pageContext.getOut(); 80 _jspx_out = out; 81 82 out.write("\r\n"); 83 out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n"); 84 out.write("<html>\r\n"); 85 out.write("<head>\r\n"); 86 out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n"); 87 out.write("<title>Insert title here</title>\r\n"); 88 out.write("</head>\r\n"); 89 out.write("<body>\r\n"); 90 out.write("\t"); 91 92 String name="今夕何希"; 93 94 out.write('\r'); 95 out.write('\n'); 96 out.write(' '); 97 out.print(name ); 98 out.write("\r\n"); 99 out.write("</body>\r\n"); 100 out.write("</html>"); 101 } catch (java.lang.Throwable t) { 102 if (!(t instanceof javax.servlet.jsp.SkipPageException)){ 103 out = _jspx_out; 104 if (out != null && out.getBufferSize() != 0) 105 try { 106 if (response.isCommitted()) { 107 out.flush(); 108 } else { 109 out.clearBuffer(); 110 } 111 } catch (java.io.IOException e) {} 112 if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); 113 else throw new ServletException(t); 114 } 115 } finally { 116 _jspxFactory.releasePageContext(_jspx_page_context); 117 } 118 } 119 }
下一次访问时,会看一下里面的内容有没有发生变化,如果变化了,重新编译加载。
4、jsp组成部分
静态数据,如HTML;JSP指令,如include指令;jsp标签动作;用户自定义标签
- JSP脚本元素和变量
在jsp当中写java代码:
<%java代码> 内部的java代码翻译到service方法的内部
<%=java变量或者表达式> 会被翻译成service方法内部的out.print();
<%!java代码 > 会被翻译成selvlet的成员的内容
在jsp当中写注释:
HTML:<!-- 注释内容--> 可见范围 jsp源码,翻译后的servlet,页面
java://单行注释; /*多行注释*/ 可见范围 jsp源码,翻译后的servlet,页面看不到
jsp: <%注释内容%> 可见范围 jsp源码
- JSP指令
什么是指令?jsp指令用于设置整个JSP页面的相关信息,以及用于jsp页面与其他容器间的通信。
有哪些指令?
page (1) 用于设定整个JSP页面的属性和相关功能
(2)page指令的主要属性
(3)多个属性间用空格隔开
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
include (1) 表示在JSP编译时插入一个包含文件或代码的文件
(2)include指令所包含的文件名不能是一个url,只能是静态的文件名
(3)静态包含
taglib (1)声明jsp使用了哪些标签库
(2)JSP标准标签库,第三方标签库,自定义标签库
- 标签动作 (1)页面包含(动态包含)
-
- (2)请求转发:
<jsp:forward page="要转发的资源"></jsp:forward>
- 随式对象
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,开发人员可以直接调用它们而不用显式地声明它们再调用。
out对象:

1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 aaa 11 <%="bbb" %> 12 <% 13 out.write("ccc"); 14 response.getWriter().write("ddd"); 15 %> 16 17 </body> 18 </html>
输出为:
只有response能够响应浏览器,因此out缓冲区(默认8kb)的内容会被拼接到response缓冲区之后。
pageContext对象:可以获得其他8大隐式对象,可以向指定的其他域中存取数据