JSP:Java Server Page ,SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。
Jsp本质上是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个 Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。
注释
显示注释,这种注释是允许客户端看见的。
< !-- HTML 风格的注释 – >
隐式注释,此种注释是客户端无法看见的。
// 注释,单行注释 /* 多行注释*/
<%-- JSP注释 --%>
Scriptlet
JSP 中最重要的部分就是Scriptlet( 脚本小程序),所有嵌入在 HTML 代码中的Java 程序都必须使用 Scriptlet 标记出来。
JSP中一种有三种Scriptlet(脚本小程序):
1、<% %>: java 脚本段,可以定义局部变量、编写语句
2、<%! %>:声明,可以定义全局(成员)变量、方法、类
3、<%= %>:表达式,数据一个变量或具体内容
JSP 的指令标签
JSP 的指令标签用来控制整个 jsp 的行为,就当前 JSP 页面的某些方面对 JSP 转换器作出指示。
page指令
格式:<%@ page 属性名=“属性值” 属性名=“属性值” %>
常用属性:
language:支持的语言,目前只支持Java。
contentType:设置响应MIME类型及编码格式。
pageEncoding:编码格式。
页面的编码格式会以contentType属性中的charset的值为准,若charset未设置,则使用pageEncoding的属性值,若两者都未设置,则使用默认编码ISO-8859-1。
import:导包;在page指令中只有该属性可以设置多次。
isErrorPage:是否是处理错误的页面,默认为false,一般与errorPage结合使用。
errorPage:当页面报错跳转的路径,一般与isErrorPage结合使用。
include静态包含
格式: <%@include file=“被包含资源的路径” %>
特点:
相当于将页面的内容进行直接的复制,只会生成一个源码文件。
不能出现同名变量。
运行效率高一点点。耦合性较高,不够灵活。
include动态包含
格式:<jsp:include page=“要包含的资源路径”></jsp:include>
特点:
相当于方法的调用,会生成多个源码文件,可以出现同名变量。
注:
1、< jsp:include>双标签中不能有任何内容,包括换行和参数(除非有参数)
2、page属性支持表达式
3、动态包含可以设置参数,<jsp:param name=“参数名” value=“参数值” />
name属性不支持任何表达式
value属性支持表达式
include静态包含和include动态包含的区别:
1、静态包含相当于内容的复制,而动态包含相当于方法的调用。
2、静态包含只会生成一个源码文件,动态包含则会生成多个源码文件。
3、静态包含的文件中不能出现同名变量,而动态包含可以包含同名变量。
4、静态包含效率快,但耦合度高,不灵活;动态包含耦合度低,比较灵活。
5、静态包含不能传递参数,动态包含可以。
jsp九大内置对象
四大域对象
pageContext —— 当前页的域对象:只在当前页面有效,跳转后无效。
request —— 请求域对象:只在一次请求中页面,服务器跳转有效。
session —— 会话:只在一次会话中有效,客户端和服务端跳转后都有效,session销毁后失效。
application —— 应用对象:在整个项目中都有效,服务器关闭或重启后失效。
两个输出对象
response —— 响应对象
out —— 输出流
out.print(“输出…”)
配置对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象的 getServletConfig() 方法可以获取一个 config 对象。
异常对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true"的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。
page 对象
page 对象代表 JSP 本身,只有在 JSP 页面内才是合法的。
EL表达式
格式:$ {域对象的键}
EL表达式一般操作的都是域对象,不能操作局部变量
域对象:
pageContext:当前页面
request:一次请求
session:一次会话
application:整个应用
取值范围:
从小到大获取,找到即止;如果四个范围都未找到,则返回空字符串""。
获取指定域范围的值:
pageScope、requestScope、sessionScope、applicationScope
1、获取域对象中的JavaBean:
$ {键.字段名}
注:JavaBean中的字段要提供get方法。
2、判断域对象是否为空(null、空字符串、size)
$ {empty 键} 为空返回true;不为空返回false
判断集合时,会判断是否为null和长度是否大于0
3、判断是否不为空
$ {!empty 键}
4、获取集合的长度
$ {集合.size()}
<%
request.setAttribute("num", 10);
request.setAttribute("flag", true);
// JavaBean
User user = new User();
user.setUname("admin");
user.setUpwd("123");
request.setAttribute("myUser", user);
User user2 = new User();
request.setAttribute("user2", user2);
User user3 = null;
request.setAttribute("user3", user3);
// List
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
List<String> list2 = new ArrayList<String>();
request.setAttribute("list2", list2);
List<String> list3 = null;
request.setAttribute("list3", list3);
// Map
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", 2222);
map.put("ccc-a", 333);
request.setAttribute("map", map);
request.setAttribute("a", 1);
request.setAttribute("b", 2);
request.setAttribute("c", 10);
request.setAttribute("aa", "1");
%>
EL取值:${uname } <br>
获取指定范围的域对象:${sessionScope.uname }<br>
获取数值型:${num } -- 获取布尔型:${flag }<br>
获取对象的属性:${myUser } -- ${myUser.uname } -- ${myUser.getUpwd() }<br>
判断对象是否为空:${empty myUser } --- ${empty user2 } --- ${empty user3 } <br>
判断字符串是否为空:${empty uname }<br>
判断集合是否为空:${empty list } --- ${empty list2 } --- ${empty list3 }<br>
获取集合的长度:${list.size() }<br>
获取集合的值:${list[0] }<br>
获取Map的值:${map.aaa } --- ${map["bbb"] }<br>
运算:${a + b } -- ${c - a } -- ${b*c } ---${c/b } = ${c div b }<br>
等值比较:${a==aa } -- ${a eq aa } <br>
大小比较:${a > 0 } -- ${a+1 > 0 && b-1 <10 }