1.1 jsp简介
(1) sun公司提供了动态网页开发技术:jsp, servlet
(2)jsp本质是servlet,在首次访问jsp时,jsp会编译成servlet存放到tomcat的work目录下面。
(3)jsp组成=html+java+jsp自身的东西
(4)jsp嵌套java代码的三种方式:<%! %> ,<% %>,<%= %>
(5)jsp的注释有三种
* html注释: <!-- --> :在任何情况下都存在
* java注释: // , /* */ , /** */,在编译成servlet后也存在,在网页的源文件不存在了.
* jsp注释: <%-- --%>: jsp注释在编译成servlet后消失了.
1.2jsp的三大指令
(1)三大指令:page ,include,taglib
语法格式:<%@ 指令名称 指令属性1="指令属性的值1" 指令属性2="指令属性的值2" %>
(2) page指令:
属性:
== language:表示jsp支持的语言,只支持java语言。
== contentType:设置jsp向页面响应内容的编码
== pageEncoding: jsp编译成servlet,使用编码方式的设置,优先权大于contentType
== extends :jsp会编译成servlet,继承的类,默认继承的是HttpJspBase
== session :jsp页面默认是可以直接使用session对象的,默认值true
== import: 用来导入包,可以分开写,也可以写在一起 <%@ page import="java.util.List,java.util.ArrayList"%>
== buffer:设置jsp对客户端输出的缓冲区的大小 8kb
== autoFlush:如果内容超出缓冲区是否会正确输出 默认值是true
== errorPage:如果jsp页面出现异常,设置跳转到错误页面
== isErrorPage:在错误页面中是否显示错误信息,会使用到exception对象
== isELIgnored:在jsp页面中是否忽略EL表达式的,设置为ture,就把el当成普通的字符串输出。
需要:contentType,pageEncoding,import记住这三个属性就ok.
(3)静态包含:include指令:<%@ include file="被包含的jsp页面路径" %>
结论:多个jsp页面最终编译成一个servlet,多个jsp页面的内容合并输出.
(4)taglib指令:引入外部的jstl标签库
<%@ taglib prefix="" uri="" %>
(5)jsp的九大内置对象:在jsp页面内部,不用创建可以直接使用的对象,就内置对象.
request: HttpServletRequest,域对象,作用范围一次请求
response:HttpServletResponse.响应对象
session: HttpSession,域对象,作用范围一次会话。
application:ServletContext,域对象,作用范围整个web项目
config:ServletConfig ,servlet的配置对象
page:Object,jsp的页面对象(代表jsp)
pageContext: PageContext, 域对象,作用范围当前的jsp页面。
out:JspWriter(PrintWriter)out可以向网页写数据。PrintWriter pw = response.getWriter();
exception:Throwable,只有当前jsp页面设置isErrorPage="true"时,才会出现。
九个内置对象都在_jspService方法内部?
<%! %> 在类的成员位置,_jspService方法外部,不能使用九个内置对象
<% %> <%= %> 都是在_jspService方法内部,能使用九个内置对象
重点:request、response,session、pageContext
(6)pageContext对象
==1.获取其它八个内置对象(掌握)
比如: getRequest(), getSession(), getResponse();
==2.可以操作其它三个域对象(request,session,application)(了解)
* pageContext域对象
==存值 void setAttribute(String,Object);
==取值 Object getAttribute(String);
* 操作其它三个域对象
==存值 void setAttribute(String name, Object value, int scope)
参数1 :域对象的名称'
参数2: 域对象的值
参数3: 域对象的范围:
pageContext:PAGE_SCOPE
request:REQUEST_SCOPE
session:SESSION_SCOPE
application:APPLICATION_SCOPE
==取值 getAttribute(String name ,int scope);
参数1:域对象的名称
参数2:域对象的范围
* findAttribute()方法:
域对象范围:从小到大 pageContext-->request--->session--->application
结论:findAttribute()方法,进行全域查找,首先找域对象作用范围小的,如果域对象作用范围小的不存在
依次向下寻找
* el表达式获取域对象中的值进行全域查找,先找域对象作用范围比较小.
2.el
2.1 el简介:
el: express lanuage表达式语言,作用就是获取域对象中的值,只能在jsp页面使用。
语法:${域对象的名称}
2.2 el获取数组、集合、对象中的值。
**1.获取数组中的值:通过数组的下标获取值。
代码:
<%
String[] strs ={"aa","bb","cc"};
request.setAttribute("arr",strs);
%>
${arr[0] }
${arr[1] }
${arr[2] }
**2.获取list集合中的值:通过下标获取值,集合底层存数据依赖数组。
代码:
<%
List<String> strs = new ArrayList<String>();
strs.add("张三");
strs.add("李四");
strs.add("田七");
request.setAttribute("list",strs);
%>
${list[0] }
${list[1] }
${list[2] }
注意:set集合是无序的,不可以通过下标获取值。
**3.获取map集合中的值:通过map的key,获取value
代码:
<%
Map<String,String> strs = new HashMap<String,String>();
strs.put("aaa", "AAA");
strs.put("bbb","BBB");
strs.put("ccc","CCC");
request.setAttribute("map",strs);
%>
${map.aaa}
${map.bbb }
${map.ccc }
注意:如果说map中的key含有特殊字符,不能直接${map.key},而是${map["key"]}
**4.获取对象中的值。
代码:
<%
User u = new User();
u.setId("001");
u.setUsername("zs");
u.setPassword("123");
request.setAttribute("user",u);
%>
${user.id } ${user.username} ${user.password }
2.3 el运算
(1)数学运算:+ - / *
(2)比较运算:> < >= <= !=
(3)逻辑运算:&& || !
(4) empty:判断对象是否为null,如果为null 返回 true ,不为 null ,返回false.
not empty:判读对象不为null.
2.4 el中的11个内置对象
==四个域的范围:
pageScope
requestScope
sessionScope
applicationScope
==请求头的数据:
header :获得请求头 等同于 request.getHeader();
headerValues:获得一个key对应多个的请求头 等同于getHeaders(String name)
比如:request.getHeader("User-Agent");
${header["User-Agent"];
==获取请求参数:
param :请求请求参数 等同于 request.getParameter();
paramValues:请求参数(接收一个名称对应多个值)等同于 request.getParameterValues();
比如:${param.username}====request.getParameter("username");
==获取cookie的名称和值
cookie:获取Cookie的数据,等同于 cookie.getName()和 cookie.getValue()
==获取其它八个内置对象
pageContext:就是jsp中内置对象pageContext
==获取web.xml文件中配置的全局参数:
initParam:获得全局初始化参数的值,等同于servletContext.getInitParameter();
代码如下:
<!-- header -->
浏览器:${header["User-Agent"] }<br/>
host: ${header.host }
<hr/>
<!-- 获取项目名称 -->
项目名称:${ pageContext.request.contextPath}
<hr/>
<!-- 获取请求参数 -->
获取用户名:${param.username }
重点记住:${ pageContext.request.contextPath}===pageContext.getRequest().getContextPath();
request: pageContext.getRequset();
String webPath = requst.getContextPath();
el: 掌握 * 获取域对象中的值, empty ,pageConext
3.jstl
(1) 什么是jstl:JSP Standard Tag Library,JSP标准标签库。
**1.使用jstl标签:<%@ taglib uri="jstl标签库地址" prefix="标签的前缀"%>
比如:jstl很多的的标签:
核心标签: c:forEach
函数标签: fn:forEach
jstl的作用:使用jstl和el 替换jsp的<% %>。
**2.jstl是第三方的标签库:导入jar包两个,jstl.jar、standard.jar
步骤:1.jstl是第三方提供的标签库,使用需要导入jar包:jstl.jar、standard.jar
2.在jsp使用jstl标签库,通过taglib指令引入jstl标签库
<%@ taglib uri="标签库的地址" prefixe="标签的前缀" %>
(2)入门案例:
<!--jstl的判断标签 ,test属性 对应的 el-->
<c:if test="${10>5}">
10
</c:if>
(3)jstl的核心标签库:
* 1. 判断标签<c:if test=""> 数据123</c:if>
属性: test对应的值 就是使用 el表达式,如果el表达式返回的结果是true,就显示标签里面的"数据123";
如果el返回的结果是false,那么标签内的"数据123"就不显示
代码如下:
<%
//request.setAttribute("number","20");
request.setAttribute("number",null);
%>
<c:if test="${number=='10'}">
显示:10
</c:if><br/>
* 2.jstl的循环标签
* <c:forEach></c:forEach>
代码:
<c:forEach begin="1" end="10" var="i">
${i }<br/>
</c:forEach>
java代码:
for(int i=1;i<=10;i++){sysout(i);}
*3.jstl标签库遍历数组,集合,对象(list)中的值
**(1)获取域对象里面list集合里面的值
= 代码
<!-- 使用jstl的forEach标签获取域对象里面的list集合的值 -->
<%
//创建list集合
List<String> list = new ArrayList<String>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
//把list集合放到域对象里面
request.setAttribute("list", list);
%>
<!-- 使用el表达式获取里面list的值 -->
${list[0] }
<hr/>
<!-- 使用forEach标签获取值 -->
<!--
for(String l : list) {}
-->
<c:forEach var="l" items="${list }">
${l } <br/>
</c:forEach>
**(2)获取域对象里面set集合里面的值
= 使用el表达式不能获取域对象里面的set集合中的值,因为set集合无序的,不能通过下标获取
= 代码
<!-- 使用jstl里面的forEach标签获取域对象里面的set集合的值 -->
<%
//创建set集合,把set集合放到域对象里面
Set<String> set = new HashSet<String>();
set.add("WWW");
set.add("QQQ");
set.add("TTT");
request.setAttribute("set", set);
%>
<!-- 使用el表达式获取 -->
<%-- ${set[0] } --%>
<!-- 使用forEach标签获取 -->
<c:forEach var="set" items="${set }">
${set }<br/>
</c:forEach>
**(3)获取域对象里面map集合里面的值
= 使用el表达式获取域对象里面map集合值,根据map的key得到value
= 代码
<!-- 使用jstl的foreach标签获取域对象里面map集合值 -->
<%
//创建map,把map集合放到域对象里面
Map<String,String> map = new HashMap<String,String>();
map.put("aaa", "AAA");
map.put("bbb", "BBB");
map.put("ccc", "CCC");
request.setAttribute("map", map);
%>
<!-- 使用el表达式获取值 -->
${map.aaa }
<hr/>
<!-- 使用foreach标签获取值 -->
<c:forEach var="m" items="${map }">
${m.key } , ${m.value } <br/>
</c:forEach>
**(4)使用jstl的forEach标签获取域对象里面多个对象的属性的值
(1)如何把多个对象放到域对象里面
= 可以先把多个对象放到集合里面(list),再把list集合放到域对象里面
= 代码
<!-- 把多个对象放到域对象里面 -->
<%
//创建多个对象
User user1 = new User();
user1.setUsername("东方不败");
user1.setPassword("999");
User user2 = new User();
user2.setUsername("岳不群");
user2.setPassword("444");
User user3 = new User();
user3.setUsername("林平之");
user3.setPassword("666");
//把多个对象放到list集合里面
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
//把list集合放到域对象里面
request.setAttribute("list", list);
%>