JSP和JSTL
一.JSP概念
Servlet是j2ee提供的动态资源开发技术,是以java的程序的形式进行开发,在java中书写HTML标签是一件十分头疼的事情,所以人们开发出了JSP,看起来像是HTML一样,但是通过服务器的编译最终可以生成Servlet。
输出当前时间:
<%
Date date = new Date();
String dateStr = date.toLocaleString();
out.write(dateStr);
%>
二.JSP的组成部分
1.模版元素
直接书写在JSP中的HTML内容,看起来就像写HTML一样的方便,但是最终会在被翻译成Servlet的过程中 out.write()直接输出。
2.脚本表达式
<%= 表达式%> 接受的是一段java表达式,在JSP翻译到Servlet的过程中,将会计算表达式的值,利用out.write()输出出去。
输出当前时间:
<%= new Date().toLocaleString() %>
3.脚本片段
<% %>直接可以在脚本片段中书写java源代码,其中的源代码将会直接拷贝到翻译过来的servlet中的响应位置上。
4.JSP声明
<%! %>在其中可以写java代码,其中的源代码会被拷贝到servlet中的service方法之外,可以利用它来为servlet增加成员方法、成员变量、静态代码块。
5.JSP注释
<%-- --%>被jsp注释包围起来的内容将不会被服务器翻译到servlet之中,要注意区分html注释和java注释的区别。
1)jsp注释不会被翻译到servlet中,会在翻译时遗弃。
2)java注释(<%// %>)不会被编译到class文件中,会在编译时遗弃。
3)html注释(<!-- -->)将会当作模版元素,直接输出到浏览器中,浏览器将不会显示html注释中的内容。
<% int i = 0; %>
<!-- <% i=i+100; %> -->
<%=i %>
浏览器输出:100
因为是HTML注释,会被执行,当时不会显示,所以i+100会被执行,最后输出100
三.JSP指令
1.Page指令
page指令(https://segmentfault.com/a/11...
Tips:
1.errorPage可以设置错误提示界面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" errorPage="/error.jsp" %>
也可以在web.xml中配置
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
2.pageEncoding="utf-8"可以解决JSP中所有的中文乱码问题
2.include指令
<%@ incluede file=""%> 静态引入其他页面的内容
静态引入:在源文件级别进行合并,多个jsp生成一个servlet,最终由这一个servlet生成响应,推荐使用。
3.taglib指令
<%@ taglib uri="" prefix=""%>用来引入标签库。
uri指定被引入.tld文件的名称空间
prefix 对该名称空间的一个缩写
四.九大隐式对象(config,reponse,request,application,session,out,page,pageContext,exception)
1.out对象
可以将它理解成response.getWriter()获得的PrintWriter,在JSP页面中,只用它去输出数据,不要用response.getWriter()
<%
Date date = new Date();
String dateStr = date.toLocaleString();
out.write(dateStr);
%>
2.PageContext对象
(1)获取其它八大隐式对象,可以认为是一个入口对象。(在自定义标签中使用)
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
(2)域对象,四大作用域的入口,可以操作四大作用域中的域属性
作用范围: 当前jsp页面
生命周期: 当对jsp页面的访问开始时,创建代表当前jsp的
PageContext,当对当前jsp页面访问结束时销毁代表当前jsp的pageContext
作用:在当前jsp中共享数据
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void removeAttribute(java.lang.String name,int scope)
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
(3)findAttribute(name)方法 -- 搜寻四大作用域中的属性,如果找到则返回该值,如果四大作用域中都找不到则返回一个null,搜寻的顺序是从最小的域开始向最大的域开始寻找(application>session>request>pageContext)
(4)提供了请求请求包含和转发的快捷方法
pageContext.include("/index.jsp");
pageContext.forward("/index.jsp");
Tips:
1.JSP映射
<servlet>
<servlet-name>index</servlet-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>index</servlet-name>
<url-pattern>/jsp/*</url-pattern>
</servlet-mapping>
通过"http://localhost:8080/Day01/jsp/任意字符"都可以访问这个jsp。
2.域的总结(由大到小)
servletContext (application)
session (session)
request (request)
pageContext
如果一个数据只在当前jsp页面使用,可以使用pageContext域存储。
如果一个数据,除了在当前Servlet中使用,还要在请求转发时带到其他Servlet处理或jsp中显示,这个时候用request域。
如果一个数据,除了现在我自己要用,过一会我自己还要用,存在session域。
如果一个数据,除了现在我自己要用过一会其他人也要用,存在ServletContext域中。
五.EL表达式
1.概述
最初出现的目的是用来取代jsp页面中的jsp脚本表达式.但是随着el的发展el的功能已经不限于此了。
${el表达式}
2.用EL表达式获取数据
1)获取常量
字符串/数字/布尔类型,直接写在El表达式中,El直接进行输出
${"阿萨德发射点发" } ${199 } ${true }
2)获取域中的变量
如果El中写的是一个变量的名,则El会调用pageContext的findAttribute方法,在四大作用域中以给定的名字找对应的属性值,找到后进行输出,如果四个域中都找不到,什么都不输出。
<%
String name = "张三";
pageContext.setAttribute("name",name);
%>
${name }
3)获取数组中的数据
<%
String [] names = {"容嬷嬷","紫薇","金锁","小燕子"};
pageContext.setAttribute("names",names);
%>
${names[2]}
4)获取集合中的数据
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
pageContext.setAttribute("list",list);
${list[2]}
5)获取Map中的数据
<%
Map<String,String> map = new HashMap();
map.put("name","奥巴马");
map.put("age","17");
map.put("gender","男");
map.put("addr","白宫");
map.put("name.xiao","小黑黑");
pageContext.setAttribute("map",map);
pageContext.setAttribute("name","age");
%>
${map["name"] }${map["addr"] }
${map.gender }${map.age }
${map["name.xiao"] }
###### Tips:
1.使用中括号的地方都可以使用点号替代,除了中括号中是数字或者中括号中包含特殊字符(-.)的情况除外
2.在中括号中如果不用双引号引起来则是变量,先找变量的值再拿变量的值使用.如果用双引号则是常量,直接使用常量的值
6)获取javabean的属性
<%
Person p = new Person();
p.setName("芙蓉姐姐");
p.setAge(17);
pageContext.setAttribute("p",p);
%>
${p.name }${p.age } ${p.name }
3.用EL表达式执行运算
1) 算数运算(+-*/)
${1+1 }
${1-2 }
${1+"2" }
2)逻辑运算
&& and
|| or
! not
3)比较运算
> gt
< lt
>= ge
<= le
!= ne
==eq
${1 eq 1 } ${3 ge 2 } ${5+3 lt 3 }
4)三元运算符
${10>9? "yes" : "no" }
5)empty运算符
empty 运算符 : 判断一个对象是否为null或字符串是否为空字符串或集合内容是否为空或域中是否没有任何属性
<%
String str = "aaaa";
pageContext.setAttribute("str",str);
List list = new ArrayList();
list.add("");
pageContext.setAttribute("list",list);
%>
${empty str }
${empty list}
${empty pageScope }
4.用EL表达式获取常用开发对象
el中内置了11个内置对象,这些对象el内置的,不需要提前定义就可以直接在el中使用
pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象
pageScope -- page域中属性组成的Map
requestScope -- request域中属性组成的Map
applicationScope --application域中属性组成的Map
param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]> header -- 所有请求头组成的Map<String,String>
headerValues -- 所有请求头组成的Map<String,String[]>
cookie -- 所有cookie信息组成的Map<String,Cookie>
initParam -- 所有web应用的初始化参数组成Map
<%
pageContext.setAttribute("name","wang");
request.setAttribute("name","li");
%>
${requestScope.name}
${param.name }
${paramValues.like[2] }
${header["Accept-Language"] }
${cookie.JSESSIONID.name }
${cookie.JSESSIONID.value }
${initParam.name2 }
5.用EL表达式调用java方法(会用fn标签库即可)
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
六.JSTL
1.概述
JSTL标签库,在javaee4.0需要导入JSTL相关的jar包,在javaee5.0开始,默认已经包含了此jar包。还要需要用<%@ taglib%>指令引入标签库。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
2.JSTL核心标签库
核心标签库 (core) --- c
国际化标签 fmt
数据库标签 sql --Servlet
XML标签 xml
JSTL函数(EL函数) el
3.JSTL核心标签库
1)<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>HTML转义输出</h1><hr>
<a href="#">xxx</a>
<c:out value="<a href='#'>xxx</a>" ></c:out>
<h1>输出默认值</h1><hr>
<%
String addr = "西二旗";
//pageContext.setAttribute("addr",addr);
%>
<c:out value="${addr}" default="北京"></c:out>
${addr == null?"北京" : addr }
<h1>输出变量</h1><hr>
<%
String name = "无双";
pageContext.setAttribute("name",name);
%>
<c:out value="${name}"></c:out>
${name }
<h1>输出常量</h1><hr>
<c:out value="阿斯蒂芬"></c:out>
${"啦啦啦啦" }
</body>
</html>
2)<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>修改域中的JavaBean的属性的值</h1><hr>
<%
Person p = new Person();
pageContext.setAttribute("p",p);
%>
<c:set target="${p}" property="name" value="克林顿"></c:set>
${p.name }
<h1>设置或修改域中的Map的值</h1><hr>
<%
Map map = new HashMap();
pageContext.setAttribute("map",map);
%>
<c:set target="${map}" property="cellphone" value="10010"></c:set>
<c:set target="${map}" property="cellphone" value="10086"></c:set>
${map.cellphone }
<h1>设置或修改域中的属性值</h1><hr>
<c:set var="name" value="韦小宝"></c:set>
<c:set var="name" value="阿珂"></c:set>
${name }
</body>
</html>
3)<c:remove>标签用于删除各种Web域中的属性
其语法格式如下:
<c:remove var="varName" [scope="{page|request|session|application}"] />
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
pageContext.setAttribute("name","蓝精灵");
request.setAttribute("name","伏地魔");
session.setAttribute("name","机器猫");
application.setAttribute("name","蜡笔小新");
%>
<c:remove var="name"/>
${name }
</body>
</html>
4)<c:if test=“”>标签可以构造简单的“if-then”结构的条件表达式。(没有else)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<c:if test="${2>1}">
确实是这样的....
</c:if>
<c:if test="${2<=1}">
你确定吗?
</c:if>
</body>
</html>
5)<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
int day = 7;
pageContext.setAttribute("day",day);
%>
<c:choose>
<c:when test="${day == 1}">
星期一
</c:when>
<c:when test="${day == 2}">
星期二
</c:when>
<c:when test="${day == 3}">
星期三
</c:when>
<c:when test="${day == 4}">
星期四
</c:when>
<c:when test="${day == 5}">
星期五
</c:when>
<c:otherwise>
休息日!
</c:otherwise>
</c:choose>
</body>
</html>
6)<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
Tip:
索引(index)指的是成员的数在自然数的位置,如"12"的索引便为12。表示数在数组的位置应用到成员的总数,即count。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>实验:遍历10到100的偶数,如果数字所在的位置是3的倍数,显示成红色</h1><hr>
<c:forEach begin="10" end="100" step="2" var="i" varStatus="stat">
<c:if test="${stat.count % 3 == 0}">
<font color="red">
${i }
</font>
</c:if>
<c:if test="${stat.count % 3 != 0}">
<font color="blue">
${i }
</font>
</c:if>
</c:forEach>
<h1>循环执行指定的内容若干次</h1><hr>
<c:forEach begin="0" end="10" step="2" var="i" >
${i },
</c:forEach>
<h1>遍历Map中的数据</h1><hr>
<%
Map map = new LinkedHashMap();
map.put("name","曹操");
map.put("age","59");
map.put("wife","小乔");
map.put("gender","男");
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="entry" >
${entry.key }:${entry.value }<br>
</c:forEach>
<h1>遍历集合中的数据</h1><hr>
<%
List list = new ArrayList();
list.add("美国");
list.add("中国");
list.add("俄罗斯");
list.add("印度");
list.add("巴西");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list}" var="c">
${c }<br>
</c:forEach>
<h1>遍历数组中的数据</h1><hr>
<%
String [] city = {"北京","上海","广州","铁岭","葫芦岛"};
pageContext.setAttribute("city",city);
%>
<c:forEach items="${city}" var="c">
${c }<br>
</c:forEach>
</body>
</html>
7)<c:forTokens>用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<c:forTokens items="www.itheima.com" delims="." var="str">
${str }<br>
</c:forTokens>
</body>
</html>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。