JSP学习笔记
Posted WWWYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP学习笔记相关的知识,希望对你有一定的参考价值。
时间:2016-11-17 13:46
——JSP入门
1、什么是JSP
JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,用来显示数据和获取数据。
JSP是:
1)JSP运行在服务器端。
2)JSP的全称是Java Server Pages
3)JSP的基础是Servlet(相当于对Servlet进行包装,JSP翻译之后,会生成一个Servlet文件)
4)JSP是综合技术
JSP = html + css + java + jsp标签(语法)+ javascript
5)JSP文件被修改时,不需要重启服务器。
6)JSP如何访问:http://ip地址:8080/web应用名/jsp文件
7)JSP是一种动态网页技术。
2、为什么需要JSP
程序员在开发过程中,发现Servlet做界面非常不方便。
JSP+Java类(service、JavaBeans)+Servlet,就会构成MVC的开发模式。
MVC模式是目前软件公司中通用的开发模式。
3、JSP的作用
Servlet:
缺点:不适合设置HTML响应体,需要大量的print来输出页面标签。
优点:动态资源,可以编程。
HTML:
缺点:HTML是静态页面,不能包含动态信息。
优点:不用为输出HTML标签而发愁。
JSP:
优点:在原有HTML的基础上添加Java脚本,构成JSP页面。
4、JSP和Servlet的分工
JSP:
作为请求发起页面:例如显示表格、超链接。
作为请求结束页面:例如显示数据。
Servlet:
作为请求中处理数据的环节。
5、JSP的组成
JSP = HTML + Java脚本 + JSP标签(指令)
JSP中无需创建即可使用的对象一共有9个,被称为9大内置对象,例如request对象、out对象。
3种Java脚本:
* <% ... %>:Java代码片段(常用),用于定义0 ~ N条Java语句。
(方法内可以写什么,这里就可以写什么)
语句;
* <%= ...%>:Java表达式,用于输出一条表达式(或变量)的值。
(response.getWriter().println(这里可以放什么,他就可以放什么))
表达式
* <%! ... %>:声明,用来创建类的成员变量和成员方法(一般不用,但容易被考到)
(类中可以放什么,它就可以放什么)
声明
案例:
演示JSP中Java脚本的使用。
1)获取表单数据
2)把字符串转换成int类型
3)进行加法运算得到结果
4)将结果保存到request域中
5)转发到result.jsp中
演示JSP与Servlet的分工。
6、JSP原理(理解)
1)JSP其实是一种特殊的Servlet
* 继承了org.apache.jasper.runtime.HttpJspBase(HttpJspBase间接实现了Servlet接口)
* 当JSP页面第一次被访问时,服务器会把JSP翻译成Java文件(这个Java文件其实是一个Servlet类)
* 然后再把java文件编译成.class
* 然后创建该类对象
* 最后调用它的service()方法
* 第二次请求同一JSP时,直接调用service()方法,不再初始化对象。
2)在Tomcat的work目录下可以找到JSP对应的.java源文件。
3)查看JSP对应.java文件:
* java脚本
* html
7、JSP注释
<%-- --%>:当服务器把JSP编译成java文件时就已经忽略了注释部分,也就是.java文件中就不会保存注释部分了。
<!-- <%=num %>-->:该表达式会执行,并且获取num的值,但是会被HTML注释掉,不会显示在页面中。
——JSP原理细节分析
1、Web服务器如何调用并执行一个JSP页面?
见JSP运行机制。
2、JSP页面中的HTML标签如何被发送到客户端?
使用out.write(" ");写入客户端页面,因为JSP翻译之后是一个Servlet文件,而out又是Servlet的内置对象,所以可以直接使用。
out.write()和out.print()方法完全相同,输出字符串用write,输出变量用print。
3、JSP页面中的Java代码服务器是如何执行的?
先将JSP文件转换成一个Servlet文件,然后编译为class文件,再执行。
在<% %>中定义的变量,会转换为service方法的局部变量。
在<%! %>中定义的变量或者方法,会转换为Servlet的成员属性或者成员方法。
4、Web服务器在调用JSP时,会给JSP提供一些什么Java对象。
九个内置对象。
application、pageContext、request、session、page、response、exception、out、config。
——JSP运行机制
1、JSP运行机制
如果是第一次访问该JSP文件,Web服务器就会将该文件转换成一个Servlet文件(xxx_jsp.java,这个文件本身就是一个Servlet文件),然后再将其编译成(.class文件),然后将class文件加载到内存中,成为一个单例对象。
如果是第二次访问该JSP文件,则不再进行编译等操作,直接访问内存中的单例对象。
如何判断是否已经访问过该JSP文件?
Web服务器有一套管理机制,会判断JSP文件是否已经被访问过(是否存在对象)。
因此,JSP也是单例的,换而言之,因为Servlet是单例的,所以JSP也是单例的。
如果某个JSP文件被修改了,再次访问该JSP就相当于第一次访问该文件。
查看JSP生成的Servlet:
tomcat根目录/work/Catalina/localhost
2、JSP基本组成
模板数据
模板数据是JSP容器不处理的部分,例如JSP页面中的HTML内容。
元素
概念:
元素是必须由JSP容器处理的部分,例如Java代码。
1)指令
2)脚本
3)动作
4)注释
——JSP指令元素
指令元素主要用于为转换阶段提供整个JSP页面的相关信息,该指令不产生任何的输出信息到当前的输出流中。
一般都会把JSP指令放到JSP文件最上方,但这不是必须的。
指令元素用于从JSP发送一个信息到容器,比如设置全局变量,文字编码,引入包等。
在一个JSP页面中,可以有0~N个指令。
page指令是最为常用的指令,也是属性最多的指令。
page指令没有必须的属性,都是可选属性,例如:<%@page %>,没有属性也可以。
在JSP页面中,任何指令都可以重复出现。
1)格式:
<%@ page attr1="value1" attr2="value2" ...%>,一般都会把JSP指令放在JSP文件的最上方,但这不是必须的。
2)注意:
page指令以<%@开始,以%>结束。
<%@不要有空格,%>也不要有空格。
各属性名值对之间用空格隔开。
因为page指令是对整个页面进行设置,所以通常将page指令放在JSP页面的开头位置。
3)page指令示例:
<%@ page pageEncoding="UTF-8" %>
4)page指令中常用属性有:
language="xxx":JSP中嵌入的代码通常是Java。
import="包.* ":在该JSP页面中引入包或者某个具体的类。
errorPage="相对JSP页面的路径":当JSP页面出现错误时,自动跳转到指定的JSP页面,要求使用相对路径,当使用"/"作为开始路径时,表示当前Web应用的根目录,如果不以"/"开头,则表示相对于本JSP页面的路径。
isErrorPage=[false | true]:指定该JSP页面是否专门用作error页面,如果设为true,则可以在该页面直接使用Exception内置对象。
contentType="text/html;charset=utf-8":相当于添加一个响应头:Content-Type,指定网页以什么方式显示页面,写了此属性之后,就不需要设置:response.setContentType("text/html;charset=utf-8");
pageEncoding="utf-8":指定当前JSP页面的编码,指定服务器以什么编码将JSP编译成.java文件。
5) 以下属性默认为true:
session=[true | false]:默认true,是否在JSP页面获取session对象。
这个session就是Servlet中的HttpSession。
当设置为false时,无法在JSP中使用session对象。
buffer=[none | 8k | 指定大小]:设置out对象使用的缓冲区,默认8K。
autoFlush=[true | false]:当buffer满后,是否自动刷新到浏览器。
isThreadSafe=[true | false]:默认true,表示该JSP的线程安全由程序员控制,false则对应的Servlet实现线程安全接口。
6)page指令的pageEncoding和contentType
①pageEncoding指定当前JSP页面的编码,这个编码是给服务器看的,服务器需要知道当前JSP使用的编码,不然服务器无法正确的将JSP翻译成java文件,所以这个编码只需要与真实的页面编码一致即可。
在MyEclipse中,在JSP文件上点击右键,选择属性就可以看到当前JSP页面的编码了。
如果两个属性只提供一个,那么另一个默认值为已设置的那一个。
如果两个属性都没有设置,那么默认为ISO-8859-1。
如果JSP页面中存在中文,则一定要设置该属性。
②contentType属性与response.setContentType()方法的作用相同,它会完成两项工作,一是设置响应字符流的编码,二是设置content-type响应头,例如:
<%@page contentType="text/html;charset=utf-8"%>
7)page指令的import属性
import指令可以出现多次,只有它可以出现多次。
import属性值对应的是Java文件中的import语句。
import属性值可以使用逗号:
<%@page import="java.util.*,java.net."%>
8)page指令的errorPage和isErrorPage
在一个JSP页面出错之后,Tomcat会响应给用户错误信息(500页面)。
如果不希望Tomcat给用户输出错误信息,那么可以使用page指令的errorPage来指定错误页面,也就是自定义错误页面,例如:
<%@page errorPage="xxx.jsp"%>
这时,在当前JSP页面出现错误时,会将请求转发到xx.jsp页面,此时响应码为200。
isErrorPage为指定当前页面是否为处理错误的页面,属性分为true和false,当设置为true时,响应码为500。
仅仅当isErrorPage设置为true时,JSP文件才可以使用内置对象中的exception对象。
将异常信息输出到页面:
exception.printStackTrace(reqponse.getWriter());
哪个内置对象不可以随意使用:exception和session
提示:IE会在响应码为500时,并且响应正文的长度小于等于512B时不给予显示,而是现实“网站无法显示该页面”字样,这时只需要添加一些相应内容即可。
9)在web.xml文件中配置错误页面
不止可以通过JSP的page指令来配置错误页面,还可以在web.xml文件中指定错误页面,这种方式与page指令无关。
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</error-page>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>
<error-page>
<exception-type>java.long.RuntimeException</exception-type>
<location>/error.jsp</location>
</error-page>
如果没有配置这个<error-page>,在抛出RuntimeException时会转发到error500.jsp页面,即响应码为500。
优先级:内容越细致,匹配度越小的优先级越高。
<error-page>有两种使用方式:
* <error-code>和<location>子元素
* <exception-type>和<location>子元素
其中<error-code>是指定响应码,<location>指定转发的页面,<exception-type>是指定抛出的异常。
在上述配置标签中:
* 当出现404时,会跳转到error404.jsp页面
* 当出现RuntimeException异常时,会跳转到error.jsp页面
* 当出现非RuntimeException异常时,会跳转到error500.jsp页面
这种方式会在控制台看到异常信息,而使用page指令时不会在控制台打印异常信息。
10)page指令的autoFlush和buffer
buffer表示当前JSP的输出流(out隐藏对象)的缓冲区大小,默认为8kb。
autoFlush表示在out对象的缓冲区满时如何处理。
true(默认)表示缓冲区满时把缓冲区自动数据刷新到客户端。
false表示当缓冲区满时,抛出异常。
默认值为true。
11)page指令的isELIgnored
该指令的属性表示当前JSP页面是否忽略EL表达式,默认值为false,表示不忽略(即支持EL表达式)。
老版本默认true。
12)page指令的其他属性
* language:只能是Java,这个属性可以看出JSP最初设计时的野心,希望JSP可以转换成其他语言,但是到现在JSP只能转换为Java代码。
* info:JSP说明性信息。
* isThreadSafe:当前的JSP是否支持并发访问。
默认为false,为true时,JSP生成的Servlet会实现一个过时的标记接口SingleThreadModel,这时JSP就只能处理单线程的访问。
* session:默认为true,表示当前JSP页面可以使用session对象,如果为false表示当前JSP页面不能使用session对象。
* extends:指定当前JSP页面生成的Servlet父类。
2、include(静态导入)
该指令用于引入一个文件(通常是JSP文件),JSP引擎会把两个JSP文件翻译成一个Servlet文件,然后编译成一个class文件,因此也称为静态引入。
与RequestDispatcher的include()方法功能相似,包含与被包含是两个Servlet,即两个class文件,它们只是在运行时合并了。
被引入的JSP文件,只需要保留page指令即可,<html><body>标签不要写。
include指令在哪一行引入,就将被引入的代码写在哪一行。
<%@include %>该指令是在JSP编译成java文件的时候完成的。
格式:
<%@ include file="文件名"%>
应用:
为了保证网站的整体风格,常将文件头部和尾部做成单独的文件,网站其他页面使用包含指令进行包含。
<%@ include file=" " %>:静态引入
<jsp:include file=" "></jsp:include>:动态引入
相同点:
把一个文件引入到另外一个文件中。
不同点:
静态引入:>%@include%>(合并)
运行前就引入。
把两个JSP翻译成一个Servlet,所以被引入的文件不要包含<html><body>等标签。
静态包含时需要注意变量的使用,因为在运行前就引入,所以变量等数据会被当做一个字符串来处理。
动态引入:<jsp:include>(调用)
运行时才引入。
把两个JSP文件分别翻译,生成两个文件,所以被引入的JSP文件包含有<html><body>也不会报错。
<%@include%>才是真正的合并文件,而<jsp:include>仅仅是调用,把输出结果合并。
调用:org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response,"xx.jsp",out,false);
3、taglib(导入标签库)
该指令允许在JSP页面中使用自定义的标签。
<myTag:xx 属性 >
<myTag:youTag num1="123">
两个属性:
prefix:指定标签库在本页面中的前缀,由程序员自己定义,表示当前页面所有库中的标签必须使用该前缀名称,用于区分不同标签库。
uri:指定标签库的位置。
格式:
<%@taglib prefix="c" uri="xxxxx.xxx.com"%>
使用:
<c:xxx>
——JSP脚本元素
脚本元素可以理解为就是Java代码片段。
脚本段(scriplet):<% Java代码%>
表达式:<%= 表达式%>
注意区分表达式和语句:
<%= 12*5%>:是表达式
<%= 12*5;%>:是语句,单独存在会报错。
声明(declaration):<%! 声明Java代码%>
<%! 变量声明%>
<%! 方法声明%>
当有!的时候会将代码放到类中、service方法外,也就是该Servlet中,而不加!的时候,变量会默认放在service方法中(方法不会放到service中),也就是说,方法声明必须加 ! 。
JSP页面模块注释:<%-- --%>
HTML注释:<!-- -->
区别:
<!-- -->会在Servlet中对应生成out.write("<!-- -->");这样在返回给浏览器的静态页面中也会生成<!-- -->,只是用户看不到而已。
<%-- --%>在Servlet中没有任何输出,建议使用<%-- --%>
——JSP基础动作标签
动作标签的作用是用来简化Java脚本的。
JSP动作标签是JavaWeb内置的动作标签,它们是已经定义好的动作标签,可以直接拿来使用。
如果JSP动作标签不够用,可以自定义标签,JavaWeb一共提供了20个JSP动作标签。
JSP动作标签格式:
<jsp:标签名 ... >
动作标签是由服务器来解释执行的,它与Java代码一样,都是在服务器端执行的。
HTML标签由浏览器来执行
1、<jsp:include>:
在页面得到请求时动态包含一个文件。
<jsp:include>标签和<@include>指令是不同的:
include指令是在编译时期完成的,即把当前JSP和被包含的JSP合并成一个JSP文件,然后再编译成一个Servlet。
include动作标签是在运行时期完成的包含,即当前JSP和被包含的JSP都会各自生成一个Servlet,然后在执行当前JSP的Servlet时完成包含另一个JSP的Servlet,它与RequestDispatcher的include()方法是相同的。
include指令才是真正的合并。
include动作标签相当于调用。
<jsp:include page="文件路径" flush="true | false"> </jsp:include>
例如:
<jsp:include page="文件路径" flush="true | false">
<jsp:param name="参数名1" value="参数1的值"/>
<jsp:param name="参数名2" value="参数2的值"/>
</jsp:include>
当a.jsp动态包含b.jsp时,编译后的a.java文件中会有如下代码:
2、<jsp:forward>:
它与RequestDispatcher的forward方法一样,留头不留体。
forward动作元素用来实现网页跳转,即当前页面跳转到其他指定页面。
跳转的目标页面可以是静态的HTML页面、JSP页面或者Servlet类。
<jsp:forward page="文件路径" flush="true | false"></jsp:forward>
例如:
<jsp:forward page="文件路径" flush="true | false" >
<jsp:param name="参数名1" value="参数1的值"/>
<jsp:param name="参数名1" value="参数1的值"/>
</jsp:forward>
不能将JSP页面直接放置在WebRoot目录下,否则可以根据地址栏中的JSP地址直接获取到该JSP文件。
<a href="http://IP地址:8080/地址">获取JSP文件</a>
为了避免通过浏览器访问到源文件,可以将JSP文件放置到WEB-INF下,Tomcat有一个默认的保护机制:
不能通过浏览器访问WEB-INF。
通常情况下会在WEB-INF外放置一个充当入口的JSP文件,内部代码为:<jsp:forward page="/WEB-INF/xxx.jsp"></jsp:forward>
当通过该指令进入WEB-INF之后,就可以任意访问WEB-INF目录下的所有文件了。
3、<jsp:param>:设置传送参数,通常与<jsp:include>结合使用。
param动作元素必须配合include动作元素、forward动作元素和plugin等元素,在加载外部程序或是网页跳转的时候,传递参数给另外一个JSP程序。
用来给转发或包含的页面传递参数。
通过request.getParameter(name);方法来获取参数。
<jsp:forward page="b.jsp">
<jsp:param value="value1" name="name1" />
<jsp:param value="value2" name="name2" />
</jsp:forward>
当页面转发到b.jsp之后,就可以使用request.getParameter(name);来获取参数了。
4、<jsp:useBean>:创建一个JavaBean实例,使用JavaBean组件。
useBean动作元素用来在JSP中创建并使用一个JavaBean。
实际工作中常用JavaBean作组件开发,而在JSP中只需要声明并使用这个组件,这样可以较大限度的实现静态内容和动态内容的分离。
<jsp:useBean id="bean的名称" scope="有效范围" class="包名.类名"></useBean>
5、<jsp:setProperty>:设置JavaBean的初始值。
setProperty动作元素设置Bean中的属性值。
<jsp:setProperty name="bean的名称" property="*" />
<jsp:setProperty name="bean的名称" property="属性名称" />
<jsp:setProperty name="bean的名称" property="属性名称" param="参数名称" />
<jsp:setProperty name="bean的名称" property="属性名称" value="属性值" />
6、<jsp:getProperty>:获取JavaBean的属性值。
getProperty动作元素用于获取Bean中的属性值并将其转换为字符串,用于在页面中显示。
<jsp:getProperty name="bean的名称" property="属性名称" />
7、<jsp:plugin>:使用插件
8、<jsp:fallback>
——JSP内置对象
out(JspWriter)
out对象是JSPWriter类的实例,是向客户端输出内容时常用的对象。
等同于response.getWriter()
out向客户端输出字节流数据。
方法摘要:
out.println(" ");
page(this)
page对象就是当前JSP页面本身(JSP本身就是个类),它是Object类的实例:Object page = this;
application(ServletContext)
Servlet类的对象。
application对象实现了用户间数据的共享,可存放全局变量,它的作用域最大,开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在,这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作,在任何地方对此对象属性进行操作,对将影响到其他用户对此对象的访问(static),服务器的启动和关闭决定了application对象的生命,它是ServletContext的实例。
exception(Throwable)
只有在错误页面中可以使用该对象。
对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生该对象,如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译,它实际上是Throwable的对象。
pageContext(PageContext,只在JSP中有该对象)
当前页面上下文对象。
用于操作当前页面和当前页面标签的共享数据。
pageContext对象提供了对当前JSP页面内所有的对象及名字空间的访问,也就是说它可以访问到本页面所在的session,也可以获取所在的application的某一属性值。
* 一个顶9个
* 是域对象,具有set、get、remove方法
* 代理其它域对象:pageContext.setAttribute("xxx","XXX",PageContext.SESSION_SCOPE);
指定向session域中添加数据。
* 全域查找:pageContext.findAttribute("xxx");
在四大域对象中按照范围从小到大的顺序依次查找。
为了方便全域查找,在起名时一般定义为session_xxx,pagecontext_sss。
* 获取其它8个内置对象
getSession()等方法。
config(ServletConfig)
对应Servlet中的ServletConfig。
config对象是在一个Servlet初始化时,JSP引擎向他传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成(以及服务器的有关信息(通过传递一个ServletContext对象)。
该对象代表JSP对应的Servlet的配置,可以得到web.xml中的参数 -- ServletConfig。
request(HttpServletRequest)
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
它是HttpServletRequest类的实例,作用域是同一个请求之内,页面跳转通过forward跳转页面,则目标页面可以拿到request中的属性值,redirect是重定向,属性值会丢失。
方法摘要:
getParameter(String name);
通过表单中的name值来获取对应属性。
getParameterValues(String name);
通过name来获取字符串数组,返回值是String[ ]。
setAttribute(String name,Object obj)
设置名字为name的obj的值为obj。
getAttribute(String name);
返回由name指定的属性值,如果不存在就返回null。
getCookie();
response(HttpServletResponse)
response对象包含了响应客户请求的有关信息,但是JSP中很少用到它,它是HttpServletResponse类的实例。
方法摘要:
addCookie(Cookie cookie)
sendRedirect("路径名");
session(HttpSession)
session对象是指客户端与服务器的一次会话,从客户连接到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例,用于保存用户的信息,跟踪用户的行为。
不是每个JSP页面中都可以使用该对象,如果在某个JSP页面中设置<%@page session="false" %>,说明这个页面中不能使用session。
方法摘要:
setAttribute(String name,Object obj);
getAttribute(String name);
这9个对象中有很多是极少使用的:config、page、exception
这9个对象中有两个对象不是每个JSP页面都可以使用的:exception、session
Servlet三大作用域:
ServletContext
session
request
JSP四大作用域:
pageContext(1,范围最小)
域对象,存放的数据只能在当前页面使用。
request(2,范围第二小)
域对象,存放的数据只在一次request中有效。
session(3,范围第二大)
域对象,存放的数据在一次会话中有效。
application(4,范围最大)
域对象,存放的数据在整个Web应用运行期间均有效。
内置对象所对应的类:
request HttpServletRequest
response HttpServletResponse
session HttpSession
exception Exception
page this(当前对象,也就是当前JSP页面)
config ServletConfig
application ServletContext
pageContext PageContext
out JspWriter
response 对象代表的是对客户端的响应,也就是说可以通过response 对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用
pageContext 对象直译时可以称作“页面上下文”对象,代表的是当前页面运行的一些属性常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope一般情况下pageContext对象用到得也不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。
以上是关于JSP学习笔记的主要内容,如果未能解决你的问题,请参考以下文章