jsp
一、介绍
JSP:Java Server Page SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。
它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。
相比 servlet 而言,servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产生动态数 据的同时,也很容易对数据进行排版。
不管是 JSP 还是 Servlet,虽然都可以用于开发动态 web 资源,经过长期实践逐渐把 servlet 作为 web 应用中的控制器组件来使用, 而把 JSP 技术作为数据显示模板来使用。
注: Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个 Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。
二、基础语法
-
注释:
① 显示注释语法:从 HTML 风格继承而来,允许客户端看见的
② 隐式注释语法:从 JAVA 风格继承;JSP 自己的注释 ,客户端无法看见
JSP 的三种注释方式:
1) // 注释,单行注释 /* 多行注释*/
2)
3)<%-- JSP 注释 --%> -
Scriptlet
在 JSP 中最重要的部分就是 Scriptlet(脚本小程序),所有嵌入在 HTML 代码中的 Java 程序都必须使用 Scriptlet 标记出来,在 JSP 中一共有三种Scriptlet 代码:
第一种:<% %>: java 脚本段,可以定义局部变量、编写语句
第二种:<%! %>:声明,可以定义全局(成员)变量、方法、类
第三种:<%= %>:表达式,数据一个变量或具体内容
<body> <% String str = "Hello JSP"; System.out.println(str); response.getWriter().write(str); %> <%!String memberStr = "a member String";%> <%=memberStr%> <h1>This is a JSP page!!</h1> </body>
-
JSP 的指令标签
page指令
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"import="java.util.List" import="java.util.ArrayList" isErrorPage="false" %> <%--language:支持的语言,目前只有java contentType:响应类型及编码格式 pageEncoding:字符编码 import:导包,只有该属性可以同时设置多次 errorPage:当页面报错时要跳转的页面,一般与isErrorPage属性一起使用,且跳转的页面的isErrorPage属性设置为true isErrorPage:是否是处理错误的页面,默认是false。一般与errorPage属性一起使用 注:页面的编码以charset的值为准;若charset未设置,则以pageEncoding为准;若两者都未设置,则使用默认编码ISO-8859-1 --%>
-
include静态包含
格式:<%@include file=“文件路径” %> 相对路径
file属性支持表达式去取值特点:只会生成一个源码文件,相当于直接将内容拷贝进来,所以不能有同名变量。
运行效率高一点点。耦合性较高,不够灵活。<div style="height: 800px;width:800px"> <div id="left" style="width: 200px;height:800px;background-color: pink;float: left;"> <%@include file="left.jsp" %> </div> <div id="right" style="width: 600px;height:800px;background-color: gray;float: left;"> <%@include file="right.jsp" %> </div> </div>
-
include动态包含
语法:<jsp:include page=“要包含的文件路径”></ jsp:include>
page属性支持表达式去取值特点:生成多个源码文件,相当于方法的调用,可以有同名变量。
耦合度低,比较灵活,效率高。注:
1、< jsp:include>双标签之间不能有任何内容(除非有参数)
Expecting “jsp:param” standard action with “name” and “value” attributes
2、动态包含可以传递参数
<jsp:param name=“参数名” value=“参数值”/>
获取参数使用:request.getParameter(name)
value属性支持表达式,name属性不支持
错误信息: The name attribute of the jsp:param standard action does not accept any expressions<div style="height: 800px;width:800px"> <div id="left" style="width: 200px;height:800px;background-color: blue;float: left;"> <jsp:include page="left.jsp"></jsp:include> <jsp:include page="left.jsp"> <jsp:param value="<%=val %>" name="uname"/> </jsp:include> </div> <div id="right" style="width: 600px;height:800px;background-color: green;float: left;"> <jsp:include page="right.jsp"></jsp:include> </div> </div>
-
九大内置对象
1.request 对象
request 对象是 javax.servlet.httpServletRequest 类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过 HTTP 协议传送到服务器的数据。(包括头信息. 系统信息. 请求方式以及请求参数等)。request 对象的作用域为一次请求。
2.response 对象
response 代表的是对客户端的响应,主要是将 JSP 容器处理过的对象传回到客户端。response 对象也具有作用域,它只在 JSP 页面内有效。
3.session 对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 session 对象,用于保存该用户的信息,跟踪用户的操作状态。session 对象内部使用 Map 类来保存数据,因此保存数据的格式为“Key/value”。 session 对象的 value 可以是复杂的对象类型,而不仅仅局限于字符串类型4.application 对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application 对象中保存的信息会在整个应用中都有效。与 session 对象相比,application 对象生命周期更长,类似于系统的“全局变量”。
5.out 对象
out 对象用于在 Web 浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
6.pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的 out. request. reponse. session. application 等对象。pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用 pageContext 对象。
7.config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象的 getServletConfig() 方法可以获取一个 config 对象。当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给这个Servlet。开发者可以在 web.xml 文件中为应用程序环境中的 Servlet 程序和 JSP 页面提供初始化参数。
8.page 对象
page 对象代表 JSP 本身,只有在 JSP 页面内才是合法的。 page 隐含对象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的 this 指针。
9.exception 对象 exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。
excepation 对象和 Java 的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。
如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
三、EL 表达式
-
EL表达式
1>语法:${key } key代表的是存在域对象中的键 注意:el表达式一般操作的是域对象,无法操作变量
2>取值范围:
从小范围到大范围取,取到为止,若未取到,则一直向大返回查找;若四个范围都未获取到,返 回空字符串。
3>获取指定范围的值:
pageScope、requestScope、sessionScope、applicationScope 4>pageContext, request, session, application;范围依次是,本页面,一次请求, 一次会话,整个应用程序。
而 EL 默认的查找方式为 从小到大查找,找到即可。当域对象全 找完了还未找到则返回空字符串””。 5>L操作对象
获取对象中的属性:${对象.属性名}
注:属性必须提供get和set方法 -
EL的基本使用
// 设置域对象的值 pageContext.setAttribute("uname", "zhangsan"); request.setAttribute("uname", "lisi"); session.setAttribute("uname", "wangwu"); application.setAttribute("uname", "zhaoliu"); //对象的值 String str = "admin"; //el取值 uname:${uname } <br> //zhangsan uname1: ${uname1 }<br> //null requestScope:${requestScope.uname } <br> //取指定值 lisi str:${str }<br> //admin
-
EL对象取值
// 将对象存到域对象中 User user = new User(); user.setUserId(1); user.setUserName("Lisa"); user.setUserPwd("123123"); request.setAttribute("user", user); //el对象取值 user对象:${user }<br> //user对象 获取user对象中的属性:${user.userName }<br> //lisa
-
el的集合取值 , 判断为空empty ,
// 将集合存到域对象中 User user2 = new User(); user2.setUserId(2); user2.setUserName("Lily"); user2.setUserPwd("123456"); List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); List<User> userList = new ArrayList<>(); userList.add(user); userList.add(user2); List<String> list2 = new ArrayList<>(); List<String> list3 = null; request.setAttribute("mylist", list); request.setAttribute("userList", userList); request.setAttribute("list2", list2); request.setAttribute("list3", list3); <h2>EL 集合取值</h2> 获取集合:${mylist } ----//[aaa,bbb,ccc]集合 ${userList }<br> -----//[User[UserId=1,UserName=Lisa,UserPwd=123123],User[UserId=2,UserName=Lily,UserPwd=123456]] 获取指定下标的值: ${mylist[0] } ---- //aaa ${userList[0].userPwd }<br>----//123123 获取集合的长度:${userList.size() } //2 <h2>判断为空empty</h2> 判断字符串是否为空:${empty uname } --- ${empty uname1 } --- ${!empty uname }<br> 判断对象是否为空:${empty user }<br> 判断集合是否为空:${empty userList } --- ${empty list2 } --- ${empty list3 }<br>
-
EL Map取值
Map map = new HashMap(); map.put("aaa", "111"); map.put("bbb", 2222); map.put("ccc-a", 333); request.setAttribute("map", map); <h2>EL Map取值</h2> 获取Map的值:${map }<br> 获取指定key的value:${map.aaa } --- ${map["aaa"] }<br>
-
EL 运算
${1+1 } -- ${num+1 } -- ${num + num2 } <br> ${num / num2 } ---
-
EL 比较
${num == 1 } -- ${num >= 10 } <br> ${str1 == str2 } -- ${str1 eq str2 }<br> ${num + 10 > 10 }