1. EL表达式
1.1 介绍
- EL全称Expression Language,表达式语言
- EL表达式主要用于代替jsp页面中的表达式脚本在jsp页面中进行数据的输出
- EL表达式的格式:${表达式}
- jsp脚本输出null值时,显示的是null字符串;EL表达式输出null值时,输出的是空串
- EL表达式主要是输出域对象中的数据,当4个域中都有相同key的数据时,EL表达式会按4个域从小到大的顺序进行搜索,找到就输出
1.2 EL表达式输出Bean对象
<%
Person person = new Person();
----对person对象进行初始化----
pageContext.setAttribute("p",person);
%>
输出Person:${p}<br/>
输出name字符串:${p.name}<br/>
输出phones数组:${p.phones}<br/>
输出cities集合:${p.cities[1]}<br/>
输出map集合:${p.map.key1}<br/>
1.3 EL表达式中的运算
EL表达式支持多种运算符,语法:${运算表达式}
- 关系运算:① ==或eq:等于;② !=或ne:不等于;③ <或lt:小于;④ >或gt:大于;⑤ <=或le:小于等于;⑥ >=或ge:大于等于
- 逻辑运算:① &&或and:与运算;② ||或or:或运算;③ !或not:取反运算
- 算术运算:① +:加法;② -:减法;③ *:乘法;④ /或div:除法;⑤ %或mod:取模
- empty运算:用于判断一个数据是否为空。语法:${empty 对象}
- 点运算和中括号运算:点运算可以输出Bean对象中某个属性的值,中括号运算可以输出有序集合中某个元素的值和map集合中某个key的value
1.4 EL表达式中11个隐含对象
EL表达式中11个隐含对象,是EL表达式自己定义的,可以直接使用:
变量 | 类型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 可以获取jsp中的九大内置对象 |
pageScope | Map<String,Object> | 可以获取pageContext域中的数据 |
requestScope | Map<String,Object> | 可以获取Request域中的数据 |
sessionScope | Map<String,Object> | 可以获取Session域中的数据 |
applicationScope | Map<String,Object> | 可以获取ServletContext域中的数据 |
param | Map<String,String> | 可以获取请求参数的值 |
paramValues | Map<String,String[]> | 可以获取多个请求参数的值 |
header | Map<String,String> | 可以获取请求头的信息 |
headerValues | Map<String,String[]> | 可以获取多个请求头的信息 |
cookie | Map<String,Cookie> | 可以获取当前请求的Cookie信息 |
initParam | Map<String,String> | 可以获取在web.xml中配置的<context-param>上下文参数u |
获取协议:${pageContext.request.scheme}<br>
获取服务器ip:${pageContext.request.serverName}<br>
获取服务器端口:${pageContext.request.serverPort}<br>
获取工程路径:${pageContext.request.contextPath}<br>
获取请求方法:${pageContext.request.method}<br>
获取客户端ip地址:${pageContext.request.remoteHost}<br>
获取会话id编号:${pageContext.session.id}<br>
2. JSTL
2.1 介绍
- JSTL全称JSP Standard Tag Library——JSP标准标签库
- EL表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本
- JSTL由五个不同功能的标签库组成
功能范围 | URI | 前缀 |
---|---|---|
核心标签库(重点) | http://java.sun.com/jsp/jstl/core | c |
格式化 | http://java.sun.com/jsp/jstl/fmt | fmt |
函数 | http://java.sun.com/jsp/jstl/functions | fn |
数据库(不使用) | http://java.sun.com/jsp/jstl/sql | sql |
XML(不使用) | http://java.sun.com/jsp/jstl/xml | x |
2.2 标签库的使用步骤
- 导入jstl所需要的jar包,或导入maven依赖(需导入jstl和标签库两个依赖)
- 使用taglib指令引入标签库
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.3 使用core核心库
2.3.1 set标签
- 作用:往域中保存数据,等同于:域对象.setAttribute(key,value)
- scope属性:设置保存到哪个域,page表示PageContext域(默认值)
- var属性:设置key
<c:set scope="request" var="abc" value="123"/>
${requestScope.abc}
2.3.2 if标签
- 作用:用于判断
- test属性:设置判断的条件,使用EL表达式输出
<c:if test="${10==10}">
<h1>10等于10</h1>
</c:if>
2.3.3 choose、when、otherwise标签
- 作用:多路判断,等同于switch - case - default
- 注意:标签中要使用jsp注释,不能使用html注释
<%
request.setAttribute("abc", 123);
%>
<c:choose>
<c:when test="${requestScope.abc>150}">
<h2>no.1</h2>
</c:when>
<c:when test="${requestScope.abc>120}">
<h2>no.2</h2>
</c:when>
<c:otherwise>
<h2>no.3</h2>
</c:otherwise>
</c:choose>
2.3.4 forEach标签
- 作用:遍历输出使用
- begin和end属性:表示遍历的开始和结束索引,可以和items属性结合使用
- step属性:遍历的步长
//普通遍历
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
//遍历对象类型的数组
<%
request.setAttribute("arr",new String[]{"123","456","789"});
%>
<c:forEach items="${requestScope.arr}" var="item">
${item}
</c:forEach>
//遍历Map集合
<%
HashMap<String, Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
request.setAttribute("map",map);
%>
<c:forEach items="${requestScope.map}" var="entry">
${entry}
${entry.key}
${entry.value}
</c:forEach>
3. 文件的上传和下载
3.1 文件的上传要求
- 要有一个form标签,method=post请求
- form标签的encType属性值必须为multipart/form-data值
- 在form标签中使用input type=file添加上传的文件
- 编写服务器代码接收、处理上传的数据
<form action="/EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br>
头像:<input type="file" name="photo"> <br>
<input type="submit" value="上传">
</form>
3.2 文件上传的Http协议内容介绍
- Content-Type:表示提交的数据类型,其值为enctype的值。multipart/form-data表示提交的数据以多段的形式进行拼接(每一个表单项一个数据段),然后以二进制流的形式发送给服务器
- boundary:表示每段数据的分隔符,由浏览器随机生成
3.3 在服务器中获取上传的文件信息
3.3.1 获取上传的文件信息
在Servlet中可以通过流的方式获取上传的文件信息:
ServletInputStream inputStream = req.getInputStream();
byte[] buffer = new byte[1024000];
int read = inputStream.read(buffer);
System.out.println(new String(buffer, 0, read));
3.3.2 解析上传的数据
有现成的jar包可用于解析上传的数据,导入commons-fileupload和commons-io两个jar包,其中ServletFileUpload类用于解析上传的数据,该类中提供了多种方法:
- boolean isMultipartContent(HttpServletRequest request):判断当前上传的数据是否是多段的格式
- List<FileItem> parseRequest(HttpServletRequest request):解析上传的数据为FileItem类型的列表
FileItem类中的方法用于辅助解析上传的数据:
- boolean isFormField():判断当前表单项是否是普通的表单项,false表示为上传的文件
- String getFieldName():获取当前表单项的name
- String getString():获取当前表单项的值
- String getName():获取上传的文件名
- void write(File var1):将上传的文件写到var1所指向的硬盘位置
if (ServletFileUpload.isMultipartContent(req)) {
FileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {
System.out.println(fileItem.getFieldName());
System.out.println(fileItem.getString("UTF-8"));
} else {
System.out.println(fileItem.getFieldName());
System.out.println(fileItem.getName());
fileItem.write(new File("D:/" + fileItem.getName()));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
3.4 文件下载的步骤
- 客户端发请求告诉服务器要下载的文件
- 服务器获取客户端要下载的文件名
- 服务器通过响应头告诉客户端返回的数据类型,以及收到的数据是用于下载使用
- 服务器读取要下载的文件内容
- 服务器把下载的文件内容回传给客户端
String downloadFile = "smile.jpg";
ServletContext servletContext = getServletContext();
String mimeType = servletContext.getMimeType("/file/" + downloadFile);
System.out.println(mimeType);
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFile);
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFile);
OutputStream outputStream = response.getOutputStream();
IOUtils.copy(resourceAsStream, outputStream);
注意:要下载的文件若不在resource目录下,则要手动设置文件所在目录为Tomcat编译目录