JavaWeb(三)JSP概述
一、JSP概述
1.1、JSP简介
一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。JSP是一种Java servlet,主要用于实现JavaWeb应用程序的用户界面部分。
网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
简单的说就是:JSP(Java Server Pages)是以Java语言为基础的动态网页开发技术。它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。
从特点分析:
Servlet特点:在Java源码中嵌入html源码
JSP特点:在html源码中嵌入java代码
总结分析:servlet:擅长java代码的编写,JSP:擅长页面显示。
JSP就是Servlet
1)tomcat获得JSP文件后,先将JSP转成servlet,变成xxx.java(servlet源码)
D:\java\tomcat7.0\apache-tomcat-7.0.53\apache-tomcat-7.0.53\work\Catalina\localhost\test01\org\apache\jsp
|————————————————————————| |———|———-|——-|—————–|
tomcat安装目录 引擎 主机 项目 固定包名 这个之下就是存放着jsp变成的servlet文件.java和编译文件.class
2)tomcat将java文件编译成class文件
3)tomcat运行class文件,并将结果输出到浏览器。
注意:
JSP页面内容主要包括两部分:
静态部分:标准的HTML标签、静态的页面内容。这些内容与静态HTML页面同样;
动态部分:受Java程序控制的内容,这些内容由Java脚本动态生成。
如:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <html> <head> <title>欢迎</title> </head> <body> 欢迎学习Java Web知识。如今时间是: <%out.println(new java.util.Date());%> </body> </html>
当中放在<%和%>之间的代码便是Java脚本,动态部分,这样就把Java代码嵌入HTML页面中,构成一个动态的JSP页面。
1.2、为什么使用JSP
JSP程序与CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下优势:
1.3、JSP工作原理
分析:
JSP文件必须在JSPserver内运行;
JSP文件必须生成Servlet才干运行;
每一个JSP 页面的第一个訪问者速度非常慢,由于要等待JSP编译成Servlet;
JSP页面的訪问者无需安装不论什么client。甚至不须要能够运行Java的运行环境,由于JSP页面输送到client的是标准HTML页面。
1.4、JSP运行流程
1.5、JSP生命周期
1.6、简单的使用JSP
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> faker </body> </html>
NewFile.jsp
2)NewFile_jsp.java
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.53 * Generated at: 2017-02-22 02:09:08 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { 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("\r\n"); out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n"); out.write("<title>Insert title here</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("\tfaker\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { 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); } } }
NewFile_jsp.java
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jasper.runtime; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.HttpJspPage; import org.apache.jasper.compiler.Localizer; /** * This is the super class of all JSP-generated servlets. * * @author Anil K. Vijendran */ public abstract class HttpJspBase extends HttpServlet implements HttpJspPage { private static final long serialVersionUID = 1L; protected HttpJspBase() { } @Override public final void init(ServletConfig config) throws ServletException { super.init(config); jspInit(); _jspInit(); } @Override public String getServletInfo() { return Localizer.getMessage("jsp.engine.info"); } @Override public final void destroy() { jspDestroy(); _jspDestroy(); } /** * Entry point into service. */ @Override public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { _jspService(request, response); } @Override public void jspInit() { } public void _jspInit() { } @Override public void jspDestroy() { } protected void _jspDestroy() { } @Override public abstract void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; }
HttpJspBase.java
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage
看到了一个熟悉的类,HttpServlet,我们编写Servlet时就是继承自该类,这里也是继承HttpServlet,并且HttpJspBase的源码会发现,
生命周期也是有init()方法,service()方法,destory()方法,相当于_jspService()方法就是servlet的service()方法的执行,所以说JSP也是一个servlet。
4)我们在JSP写的所有html代码,都会被转换为servlet中的out.write(html)代码来输出。看图:
1.7、JSP概述总结
对于jsp转换成的servlet源码,之后我们会在进行详细分析,现在只需要知道jsp中的内容在servlet中被转换成什么了,在哪里被转换了即可。
注意:jsp 生成java源码,默认第一次生成,之后直接执行,除非内容修改,具体点说,由于JSP只会在客户端第一次请求的时候被编译,因此第一次请求JSP时会感觉比较慢,而之后的请求因为不会编译JSP,
所以速度就快多了,如果将Tomcat保存的JSP编译后的class文件删除,Tomcat也会重新编译JSP。在开发Web程序的时候经常需要修改JSP,Tomcat能够自动检测到JSP程序的改动,如果检测到JSP源代码发生了改动,
Tomcat会在下次客户端请求JSP时重新编译JSP,而不需要重启Tomcat,这种自动检测功能默认是开启的,检测改动会消耗少量的时间,在部署web应用程序的时候可以在web.xml中将它关掉。
这也就是为什么我们能够在jsp页面直接修改内容,而不用重新启动服务器的原因。
因为JSP就是servlet,那么生命周期也就是跟serlvet一样。
JSP和servlet有一点区别就在于:jsp是先部署后编译,而servlet是先编译后部署。
从上面分析得出:
Servlet:控制器。重点编写java代码逻辑 (获取表单数据、处理业务逻辑、分发转向)
JSP:代码显示模板。重点在于显示数据
二、JSP基本语法
2.1、JSP模板数据
就是JSP中的HTML代码,它的内容给是固定的,无论程序如何运行模版数据输出到客户端浏览器时都不会发生改变,当我们创建一个JSP时,模版就已经固定了。
元素:JSP中的java部分,包括脚本(JavaScript,或者java代码)以及JSP指令(Directive)与JSP标签(Tag)等,元素决定着程序的流程,元素是不会显示到浏览器的。
2.2、JSP脚本
1)使用<% 编写java代码 %>,中间java代码必须遵循Java语法
来看看,jsp变为servlet时的代码是如何编写的
在JSP中JSP指令(后面会讲):
<%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%>
这句代码在servlet就变为了:
response.setContentType(“text/html; charset=UTF-8”);//这句代码的意思就是通知tomcat和浏览器都使用UTF-8码表,并且发送回浏览器的数据类型是text/html。
这是有JSP指令中画红色部分代码转变的,而指令中的pageEncoding=”UTF-8″的意思是JSP转换为Servlet时采用UTF-8码表编码,因为可能JSP中包含中文。
对于JSP模版数据来说,就原封不动的使用out.write()来输出到浏览器。
而对于JSP元素来说,就会变成普通的java代码,因为在servlet中,就可以直接编写java代码。
2)使用<%=xxx %>来输出结果
使用<%=result %>来输出结果,servlet中就会将其转换为out.print(result)进行输出。输出各种类型数据:int、double、boolean、String、Object等。
3)注释
<%– –%>:jsp注释
// :java单行注释
/* */ :Java多行注释
<!– –>:这个注释,会发送到浏览器端的源码中显示
注释分别在servlet中如何显示:
在servlet中
总结:JSP注释不会在servlet文件中显示,而java注释则会,但其所有的注释到了浏览器端,都不会出现在源码中,只有<!– –>这个注释会到浏览器的网页源码中去。
4)JSP中申明方法与属性(全局变量) 使用<%! 方法、属性%>
在JSP中编写方法或者属性时,使用<%! %>括起来
5)在JSP中使用if语句,或者使用for循环,whilt循环等都可以实现,也就是编写脚本而已。