注意:jsp文件仅仅是一个草稿文件,jsp中为我们提供的那些api也都是草稿api,最终jsp中的语法会变成之前我们学习过的java语法。
JSP中的各种元素【脚本元素(注释元素),指令元素,动作元素】
脚本元素
<% %>
在该脚本段中所以的内容,最终会出现在一个java方法中。
所以,在java的方法中能写什么内容,在<% %>中就能写什么内容
所以,在java的方法中不能写什么内容,在<% %>中也就不能写什么内容
Java方法中能写的内容:局部变量,局部内部类,各种程序结构(if for..)
Java方法中不能写的内容:方法,static,4种访问修饰符
<%! %>
该脚本段中写的内容,会出现在类之内,方法之外。
所以,在java的类之内,方法之外能写什么内容,在<%! %>中就能写什么内容
所以,在java的类之内,方法之外不能写什么内容,在<%! %>中也就不能写什么内容
java的类之内,方法之外能写:属性 方法 块 内部类
java的类之内,方法之外不能写:程序结构 表达式
<%= %>
在该脚本端中所写的内容,最终会成为out.print()的参数。
所以在java的方法参数中,能写什么,<%= %>就能写什么。
所以在java的方法参数中,不能写什么,<%= %>也就不能写什么。
java的方法参数能写:表达式
java的方法参数不能写:除了表达式以外,都不能写
<%-- --%>
该脚本用于告诉web服务器,在把一个jsp文件解析出一个java源文件的过程中,忽略该脚本中的内容,也就是说,<%-- --%>脚本中的内容根本不会出现在java源文件中。
对比: // /* */ 注释的内容会出现在java源文件中。
对比: <!-- --> 不但会出现在java源文件中。而且还会被web服务器发送给客户端浏览器。
注意以上3种注释是有<!-- -->能在客户端浏览器的源代码中看到。所以有2个术语:
客户端注释: <!-- -->
服务器端注释 <%-- --%> // /* */
注意,jsp只有在第一次被访问的时候,才会实例化出对象,第2,3,4,5…n次访问同一个jsp页面时,都使用的是第一次已经创建好的实例!
指令元素
【page(<%@ page…%)>;include(<%@ include file=”…”%>);taglib(<%@ taglib url=”tabLibraryURL”/prefix=”tagPrefix”%>)】
所有的指令元素,都是<%@ %>
page,学习page指令元素,就是学习page指令元素的属性.
1.import
用于引入外包的class
2.buffer
用于控制当前jsp页面的缓冲区大小,默认值为8kb
缓冲区的作用:提高读写速度。
缓冲区就是用来积攒数据的地方。
缓冲区中的数据,何时会被发送到目的地
2.1缓冲区已经放满数据了,再多放一个字节。
2.2强制发送缓冲区中的数据。
3.contentType
用于告诉浏览器,服务器给你发送的是什么格式的数据。
<%@page pageEncoding="gbk" contentType="application/excel; charset=ISO-8859-1" %>
<%
// 该行代码用于控制,下载文件的名字
response.setHeader("content-disposition","attachment;filename=abc.xls");
%>
4.errorPage
当前jsp页面中抛出异常的时候,指定的跳转页面
5.isThreadSafe
控制web服务器是否对该jsp页面支持并发,取值为true就表示支持并发
6.pageEncoding
6.1 Jsp-->java过程中,就是使用该属性指定的码表来生成java源文件的。
6.2 告诉浏览器使用什么码表。
include: 静态包含(动态包含参见后面)
另:
保证打开jsp文件时,只有代码编辑界面
window-->preference-->file-->file association-->*.jsp-->MyEclipse JSP Editor(default)
保证jsp一旦创建出来,页面的编码方式就默认为utf-8
window-->preference-->jsp-->ISO 10646/Unicode(utf-8)
taglib (参见后面)
动作元素:
所有动作元素都是 <jsp:xxx >
<jsp:useBean /> <jsp:setProperty /> <jsp:getProperty />
学习<jsp:useBean />之前,必须要知道,什么是javabean。
Javabean就是一个普普通通的java类而已。(不是什么新的技术,也不是什么新的api),只不过这个类要符合一些规范而已。
JavaBean的规范:
1. 所有属性必须私有化。
2. 必须为私有属性提供公共的getter(获取器)和setter(设置器)
3. 必须提供一个公共的无参的构造器。
4. 必须实现序列化接口: java.io.Serializable
为什么非要把java代码,都用相应的jsp标记替换呢? 因为,在将来要学习的mvc架构中,要求jsp页面上不得出现java代码!
注意,<jsp:useBean/> 会回调公共的无参构造器,等价于实例化对象。
注意,<jsp:setProperty /> 会回调对应的setter方法,等价于给对象的属性赋值。
注意,<jsp:getProperty /> 会回调对应的getter方法,等价于获取对象的属性,并且发送给客户端浏览器。
动态包含
<jsp:include />
经典面试题: 静态包含与动态包含的区别:
1.静态包含是先包含,后编译; 最终只能生成一个java源文件!class也是一个
动态包含是先编译,后包含。最终生成多个java源文件!class也是多个
2.静态包含不能用变量名作为路径; 动态包含就可以用变量名作为路径。
3.静态包含不能给被包含的目标jsp页面传递参数;动态包含就可以!
4.一个页面上的多个静态包含的页面中,不能有同名的变量;动态包含就可以!
如果有一种场景,既能使用静态包含,又能使用动态包含,那么应该如何抉择??
应该使用静态包含! 因为静态包含总共只会编译一次,速度快!
转发
<jsp:forward />
<jsp:param />
我们先学习,如何给服务器传递请求参数!
1.通过表单。
2.不需要表单,直接在url后面加上?参数名=参数值&参数名2=参数值2…..
3.直接在超链接的url后面写出参数即可!
4.通过window.location=”url?请求参数”
5.我们要学习的<jsp:param>也是用来给服务器传递参数的,但是该标记必须搭配<jsp:include />或者<jsp:forward />
注意,如果没有给被动态包含的页面传递参数,则<jsp:include>和</ jsp:include>之间不能有任何内容,必须贴紧
注意,如果没有给被转发的目标页面传递参数,则<jsp:forward>和</ jsp: forward >之间不能有任何内容,必须贴紧