JSP技术
概念
Java Server Pages:java 服务器端页面
- 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
-
用于简化书写
原理:JSP本质上就是一个Servlet -
JSP在第一次被访问时会被web容器翻译成Servlet,再执行。
过程:第一次访问→helloServlet.jsp→helloServlet_jsp.java→编译运行
被翻译后的Servlet在Tomcat的work目录可以找到
JSP脚本和注释
- <%代码%>:内部的java代码翻译后,在Service方法中。Service方法中可以定义什么,该脚本中就可以定义什么。
- <%!代码%>:内部的java代码翻译后,在jsp转换后的java类的成员位置。
- <%=代码%>:内部的java代码翻译后,会输出到页面上[out.print()]。输出语句中可以定义什么,该脚本就可以定义什么。
JSP注释:不同的注释可见范围不同
- html注释:<!–注释内容 –>:可见范围JSP源码、翻译后的Servlet、页面显示html源码
- java注释://单行注释/*多行注释*/:可见范围JSP源码、翻译后的Servlet
- JSP注释:<%–注释内容–%>:可见范围JSP源码
JSP指令
JSP的指令是指导JSP翻译和运行的命令,用于配置JSP页面,导入资源文件
格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2…%>
分类:
page:配置JSP页面,根据不同的属性,指导整个页面特性。
-
contentType:等同于response、setContentType()
- 设置响应体的MIME类型以及字符集
- 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要pageEncoding属性设置当前页面的字符集)
- pageEncoding:当前JSP文件的本身编码,内部可以包含contenType
- import:导入java的包
- session:是否JSP在翻译时自动创建session
- errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
-
isErrorPage:标识当前页面是否为错误页面
true:是,可以使用内置对象exception
false:否,默认值,不可以使用内置对象exception
include:页面包含的,导入页面的资源文件
页面包含(静态包含)指令,可以将一个JSP页面包含到另一个JSP页面中
格式:<%@include file=“被包含的文件地址”%>
taglib:导入资源
在JSP页面中引入标签库[JSTL标签库、struts2标签库]
格式:<%@taglib uri = “标签库地址” prefix=“前缀”%>
JSP的内置对象
在jsp页面中不需要获取和创建,可以直接使用的对象
JSP一共有9个内置对象:
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页才起作用 |
-
out对象
out的类型:JSPWriter
out的作用就是向客户端输出内容,方法:out.write()
out缓冲区默认8kb[buffer=“8kb”],可以设置成none,代表关闭out缓冲区,内容将直接写到response缓冲区 -
pageContext对象
JSP页面的上下文对象,作用如下:- pageContext是一个域对象,范围:当前页面
-
pageContext可以向指定的其他域中存取数据
setAttribute(String name,Object obj,int scope)
getAttribute(String name,int scope)
removeAttribute(String name,int scope)
findAttribute(String name)
依次从pageContext域,request域,session域,application域中获取属性,某个域中获取后将不再向后寻找
四大作用域总结:
- page域:当前JSP页面范围
- request域:一次请求
- session域:一次会话
- application域:整个web应用
-
可以获得其他8大隐式对象
例如:pageContext.getRequest(),pageContext.getSession()等。
JSP标签(动作)
- 页面包含(动态包含):<jsp:include page=“被包含的页面”/>
- 请求转发:<jsp:forward page=“要转发的资源”/>
思考:静态包含与动态包含的区别?
静态包含生成一个文件
动态包含生成两个文件
EL技术
EL表达式概述
概念:Expression Language 表达式语言,表达式可以嵌入在jsp页面内部
作用:要替代和简化jsp页面中脚本的编写
语法:${表达式}
注意:jsp默认支持el表达式的。如果要忽略el表达式
- 设置jsp中page指令中:isELIgnored=”true“忽略当前jsp页面中所有的el表达式
- ${表达式}:忽略当前的这个el表达式
EL表达式的使用
运算
运算符
- 算数运算符:+、-、*、/(div)、%(mod)
- 比较运算符:>、<、>=、<=、==、!=
- 逻辑运算符:&&(and)、||(or)、!(not)
-
空运算符:empty
功能:用于判断字符串、集合、数组对象是否为null或者长度为0
${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
${not empty str}:判断字符串、集合、数组对象是否不为null并且者长度>0
获取值
el表达式只能从域对象中获得值
语法:
1. ${域名称.键名}:从指定域中获取指定键的值
域名称:
pageScope -> pageContext
requestScope -> request
sessionScope -> session
applicationScope -> application(ServletContext)
举例:在request域中存储了name = 张三
获取:${requestScope.name}
2.${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止 等同于findAttribute(String name)
3. 获取对象、List集合、Map集合的值
i 对象:${域名称.键名.属性名}
本质上会去调用对象的getter方法
ii List集合:${域名称.键名[索引]}
iii Map集合:
${域名称.键名.key名称}
${域名称.键名[“key名称”]}
举例:
- EL获得普通字符串
- EL获得User对象的值
- EL获得List<String>的值
- EL获得List<User>的值
- EL获得Map<String,String>的值
- EL获得Map<String,User>的值
- EL获得Map<String,List<User>>的值
<%--EL最常用的功能:从域对象中获取数据--%>
<%
String name = "张三";
request.setAttribute("name",name);
String[] arr = new String[]{"苹果","香蕉","柿子","李子","栗子","梨"};
request.setAttribute("strArr",arr);
User user = new User("2","mike","12345");
request.setAttribute("user",user);
Car car = new Car("劳斯莱斯","黑色");
User user1 = new User("15","jackson","12345",car);
request.setAttribute("user1",user1);
List<String> list = new ArrayList<>();
list.add("面");
list.add("饭");
list.add("馒头");
request.setAttribute("strList",list);
ArrayList<User> users = new ArrayList<>();
users.add(new User("1","lucy","111"));
users.add(new User("2","john","222"));
users.add(new User("3","nancy","333"));
users.add(new User("4","rose","444"));
request.setAttribute("userList",users);
HashMap<String, String> strMap = new HashMap<>();
strMap.put("yellow","黄色");
strMap.put("red","红色");
strMap.put("blue","蓝色");
strMap.put("green","绿色");
request.setAttribute("strMap",strMap);
HashMap<String, User> userMap = new HashMap<>();
userMap.put("Q",new User("1","q","111"));
userMap.put("W",new User("2","w","112"));
userMap.put("E",new User("3","e","113"));
userMap.put("R",new User("4","r","114"));
request.setAttribute("userMap",userMap);
HashMap<String, List<User>> listMap = new HashMap<>();
listMap.put("Q",users);
listMap.put("W",users);
listMap.put("E",users);
listMap.put("R",users);
listMap.put("T",users);
request.setAttribute("listMap",listMap);
%>
<%--pageContext.findAttribute("name")--%>
普通字符串类型:${name} <br>
字符串数组类型:${strArr[2]} <br>
User对象类型:${user.username} ${user1.car.name} <br>
String类型的集合:${strList[1]} <br>
User集合类型:${userList[2].username} <br>
String Map类型:${strMap.red} <br>
User Map类型:${userMap.E.username} <br>
List Map类型:${listMap.W[1].username} <br>
隐式对象
el表达式中有11个隐式对象
- pageScope、requestScope、sessionScope、applicationScope 获取jsp中域中的数据
- param、paramValues 接收参数 等同于:request.getParameter()、request.getParameterValues()
- header、headerValues 获取请求头信息 等同于:request.getHeader(name)
- initParam 获取全局初始化参数 等同于:this.getServletContext().getInitParameter(name)
- cookie WEB开发中cookie 等同于:request.getCookies()、cookie.getName()、cookie.getValue()
-
pageContext 可以获得其他八大对象
重点:${pageContext.request.contextPath}:动态获取虚拟目录
JSTL技术
JSTL概述
JavaServer Pages Tag Library,JSP标准标签库,可以嵌入在JSP页面中使用标签的形式完成业务逻辑等功能。是由Apache组织提供的开源的免费的jsp标签。
JSTL出现的目的同EL一样也是要替换和简化JSP页面中的脚本代码
标签库 | 标签库的URI | 前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
使用步骤
- 导入jstl相关jar包
- 引入标签库:taglib指令 <%@ tablib %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用标签
常用的JSTL标签
<c:if test=””>
if:相当于java代码的if语句
属性:
-
test 必须属性,接受boolean表达式
如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
一般情况下,test属性值会结合el表达式一起使用
注意:c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签
<c:forEach>
foreach:相当于java代码的for语句
使用方法有两种组合形式:
<%-- 1. 模拟:for (int i = 0; i <= 5; i++) { sout(i) } --%>
<%-- begin: 从⼏开始
end: 到⼏结束(包含)
var: 临时变量, 将现在循环的值 i 存⼊到了page域中
--%>
<c:forEach begin="0" end="9" step="1" var="i">
${i}
</c:forEach>
<%-- 2. 模拟:String[] strList = {"lucy", "tom", "jack"};
for(String str : strList) { sout(str) }
--%>
<%-- items: 要遍历的集合或者数组
var: 遍历出来的每⼀个元素, 将这个元素存⼊到了page域中 起名为xx
varStatus: 记录当前遍历状态的对象, index-下标 count-序号
--%>
<c:forEach items="${strList}" var="str" varStatus="s">
${s.count} -- ${str} <br>
</c:forEach>
举例:
- 遍历List的值
- 遍历List的值
- 遍历Map<String, String>的值
- 遍历Map<String, User>的值
- 遍历Map<User, Map<String, User>>的值
<%
List<String> list = new ArrayList<>();
list.add("面");
list.add("饭");
list.add("馒头");
request.setAttribute("strList",list);
ArrayList<User> users = new ArrayList<>();
users.add(new User("1","lucy","111"));
users.add(new User("2","john","222"));
users.add(new User("3","nancy","333"));
users.add(new User("4","rose","444"));
request.setAttribute("userList",users);
HashMap<String, String> strMap = new HashMap<>();
strMap.put("yellow","黄色");
strMap.put("red","红色");
strMap.put("blue","蓝色");
strMap.put("green","绿色");
request.setAttribute("strMap",strMap);
HashMap<String, User> userMap = new HashMap<>();
userMap.put("Q",new User("1","q","111"));
userMap.put("W",new User("2","w","112"));
userMap.put("E",new User("3","e","113"));
userMap.put("R",new User("4","r","114"));
request.setAttribute("userMap",userMap);
HashMap<User, Map<String, User>> userMapHashMap = new HashMap<>();
userMapHashMap.put(new User("1","q","111"),userMap);
userMapHashMap.put(new User("2","w","112"),userMap);
userMapHashMap.put(new User("3","e","113"),userMap);
userMapHashMap.put(new User("4","r","114"),userMap);
request.setAttribute("userMapHashMap",userMapHashMap);
%>
<%--循环List类型--%>
<c:forEach items="${strList}" var="str">
${str} <br>
</c:forEach>
<%--循环user类型的集合--%>
<c:forEach items="${userList}" var="user">
${user.id} -- ${user.username} -- ${user.password} <br>
</c:forEach>
<%--循环map--%>
<c:forEach items="${strMap}" var="entry">
${entry.key} -- ${entry.value} <br>
</c:forEach>
<%--循环map<String,User>--%>
<c:forEach items="${userMap}" var="entry">
${entry.key} -- ${entry.value.id} -- ${entry.value.username} -- ${entry.value.password} <br>
</c:forEach>
<%--循环Map<User, Map<String, User>>--%>
<c:forEach items="${userMapHashMap}" var="entry">
${entry.key.id} -- ${entry.key.username} -- ${entry.key.password} --
<c:forEach items="${entry.value}" var="entry1">
${entry1.key} -- ${entry1.value.id} -- ${entry1.value.username} -- ${entry1.value.password}
</c:forEach> <br>
</c:forEach>