了解JSP
了解JSP
1、什么是JSP?
JSP全名为Java Servlet pages,中文名为web服务器页面,它是在传统的网页HTML文件(*.htm,*.html)中插入java程序段和JSP标记,后缀名为(*.jsp),其根本是一个简化的Servlet设计。从用户角度,它就是一个网页;从开发者角度,其实是一个java类,它继承了servlet,所以可以直接说jsp就是一个servlet.
2、为什么要有JSP?
HTML多数情况下用来显示静态内容,直接使用HTML文件(*.html)没有办法输出java当中的信息(动态显示数据,需要查询数据库),使用servlet输出页面非常麻烦,于是出现了jsp,既能写HTML,又能写java代码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
下一次访问时,会看一下里面的内容有没有发生变化,如果变化了,重新编译加载。
<%@ page %>里面写的只能是指令(page,include,taglib)
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、include、)
page (1) 用于设定整个JSP页面的属性和相关功能
(2)page指令的主要属性
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
language: 表明JSP页面中可以写java代码。
contentType: 告诉浏览器文件的类型以及使用的编码。
pageEncoding: JSP内容编码。
session: 值为true或者false,用于控制这个JSP页面里面,是否能够直接调用session对象。具体区别是:如果改值 为true,翻译后代码里会有getSession方法的调用,否则没有。
errorPage: 用于指定错误时跳转到哪个页面 。
(3)多个属性间用空格隔开
include <%@ include file="path"%>
(1) 表示在JSP编译时插入一个包含文件或代码的文件
(2)include指令所包含的文件名不能是一个url, 只能是静态的文件名
(3)静态包含
taglib <%@ taglib prefix=" " uri=" "%>
prefix:标签库的别名 uri:标签库的路径
(1)声明JSP使用了哪些标签库
(2)JSP标准标签库,第三方标签库,自定义标签库
标签动作 (1)页面包含(动态包含)
<jsp:include page=" "></jsp:include>
-
-
- (2)请求转发:
<jsp:forward page="要转发的资源"></jsp:forward>
-
- JSP内置对象
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,开发人员可以直接调用它们而不用显式地声明它们再调用。
作用域对象:作用域表示这些对象可以存值,他们的取值范围有限定。代码示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 使用作用域存储数据</br> 11 <% 12 pageContext.setAttribute("name", "pageContext"); 13 request.setAttribute("name","request"); 14 session.setAttribute("name", "session"); 15 application.setAttribute("name", "application"); 16 %> 17 取出四个作用域中的值</br> 18 <%=pageContext.getAttribute("name")%></br> 19 <%=request.getAttribute("name")%></br> 20 <%=session.getAttribute("name")%></br> 21 <%=application.getAttribute("name")%> 22 </body> 23 </html>
运行结果:
四个作用域的区别:
pageContext: 作用域仅限于当前页面。
request: 作用域仅限于一次请求,只要服务器对请求做出了响应,这个域中存的值就没有了。
session: 作用域仅限于一次会话(多次请求与响应)。
application: 整个工程都可以访问,服务器关闭后不能访问。
out对象:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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大隐式对象,可以向指定的其他域中存取数据。