==============================================================================
empty运算可以判断一个数据是否为空,如果为空,则输出true,不为空输出false。
什么情况下EL表达式为空?
-
值为null值得时候,为空。
-
值为空串的时候,为空。
-
值是Object类型数组,长度为零的时候。
-
list集合,元素个数为零。
-
map集合,元素个数为零。
<%@page import=“java.util.HashMap”%>
<%@page import=“java.util.Map”%>
<%@page import=“java.util.ArrayList”%>
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%
//1.值为null值得时候,为空。
request.setAttribute(“emptyNull”, null);
//2.值为空串的时候,为空。
request.setAttribute(“emptyStr”, “”);
//3.值是Object类型数组,长度为零的时候。
request.setAttribute(“emptyArr”, new Object[]{});
//4.list集合,元素个数为零。
request.setAttribute(“emptyList”, new ArrayList());
//5.map集合,元素个数为零。
request.setAttribute(“emptyMap”, new HashMap());
%>
${ empty emptyNull }
${ empty emptyStr }
${ empty emptyArr }
${ empty emptyList }
${ empty emptyMap }
6. EL表达式 三元运算 , .点运算符,[]中括号运算符
==============================================================================================
EL中三元表达式如下:
${ 表达式1?表达式2:表达式3 }
例如:${ 12>3 ? “胡说3大于12”:true}
.点运算,可以输出类对象中某个属性的值,就是负责调用的。
[]中括号运算,可以输出有序集合中某个元素的值。
并且[]中括号运算,还可以输出map集合中key里含有特殊字符的key的值,就像下面的案例一样,本质上就是区分一些特殊字符的情况。
<%@page import=“java.util.HashMap”%>
<%@page import=“java.util.Map”%>
<%@page import=“java.util.ArrayList”%>
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%
Map<String,Object> map = new HashMap<String,Object>();
map.put(“a.a.a”, “value1”);
map.put(“b+b+b”, “value2”);
map.put(“c-c-c”, “value3”);
request.setAttribute(“map”, map);
%>
${ map }
${ map.a.a.a }
${ map[‘a.a.a’]} 或者 ${ map[“a.a.a”] }
${ map[‘b+b+b’]} 或者 ${ map[“b+b+b”] }
${ map[‘c-c-c’]} 或者 ${ map[“c-c-c”] }
==============================================================================
EL表达式的11个隐含对象,是它自己定义的(内置),可以直接使用。
| 特定域属性 | 特定域 |
| — | — |
| pageScope | pageContext域 |
| requestScope | Request域 |
| sessionScope | Session域 |
| applicationScope | ServletContext域 |
<%@page import=“java.util.HashMap”%>
<%@page import=“java.util.Map”%>
<%@page import=“java.util.ArrayList”%>
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%
pageContext.setAttribute(“key1”, “pageContext1”);
pageContext.setAttribute(“key2”, “PageContext2”);
request.setAttribute(“key1”, “request1”);
request.setAttribute(“key2”, “request2”);
session.setAttribute(“key1”, “session1”);
session.setAttribute(“key2”, “session2”);
application.setAttribute(“key1”, “application1”);
application.setAttribute(“key2”, “application2”);
%>
${ key1 }
${ key2 }
*******************
${ pageScope.key1 }
${ pageScope.key2 }
${ requestScope.key1 }
${ requestScope.key2 }
${ sessionScope.key1 }
${ sessionScope.key2 }
${ applicationScope.key1 }
${ applicationScope.key2 }
pageContext使用跟正常使用没什么差别,方法就是正常的通过对应的get方法来调用方法。
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
------------
<%=request.getScheme() %>
1.协议:${ pageContext.request.scheme }
------------
<%=request.getServerName() %>
2.服务器ip:${ pageContext.request.serverName }
------------
<%=request.getServerPort() %>
3.服务器端口:${ pageContext.request.serverPort }
------------
<%=request.getContextPath() %>
4.获取工程路径:${ pageContext.request.contextPath }
------------
<%=request.getMethod() %>
5.获取请求方法:${ pageContext.request.method }
------------
<%=request.getRemoteHost() %>
6.获取客户端ip地址:${ pageContext.request.remoteHost }
------------
<%=session.getId() %>
7.获取会话id编号:${ pageContext.session.id }
------------
在企业中,常用一种更为方便的方式来定义上面的信息,如下:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%
pageContext.setAttribute(“req”, request);
%>
${ req.scheme }
${ req.serverName }
7.4.1 param和paramValues使用
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
${ param }
${ param.username } , ${ param.age }
${ paramValues.hobby[0] }
${ paramValues.hobby[1] }
请求网址测试如下:http://localhost:8080/EL_JSTL/a.jsp?username=zhangsan&age=18&hobby=eat&hobby=work
param和paramValues使用:
-
param的使用: 它对应map<String , String> , 它可以获取浏览器端发送的参数,但是对于重复的数据,例如:?hobby=eat&hobby=work 它只能获取单个。
-
paramValues的使用,它对应map<String , String[]> , 它可以获取多个值得使用用,例如:?hobby=eat&hobby=work。
7.4.2 header 和 headerValues
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
${ header }
${ header.user-agent }
${ header[‘user-agent’] }
${ header.connection }
${ headerValues }
${ headerValues[‘user-agent’][0] }
-
header的作用就是获取请求头的内容。
-
headerValues的作用获取所有请求头参数内容,形式和paramValues一样。
7.4.3 EL表达式 cookie使用
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
${ cookie }
${ cookie.JSESSIONID }
${ cookie.JSESSIONID.name }
${ cookie.JSESSIONID.value }
7.4.4 EL表达式 initParam
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
${ initParam }
输出<Context-param>:${ initParam.username }
输出<Context-param>:${ initParam.password }
- initParam的作用就是获取我们在web.xml配置的context-param参数。
============================================================================
JSTL标签库 全称是指Jsp Standard Tag Library , JSP标准标签库。是由Apache组织提供的开源的免费的jsp标签。
JSTL标签库是一个不断完善的开发源代码的JSP标签库。
**EL表达式主要是为了替代jsp中的表达式脚本。
而标签库是为了替换代码脚本。这样使得整个jsp页面变得更佳简洁。**
上面的标签库:需要用taglib来导入:
(prefix是前缀的意思。)
=========================================================================
作用:用于简化和替换jsp页面上的java代码,如果不是JSTL那么使用for循环时,就只能一节一节的<%%>脚本代码块缝合起来的样子很麻烦!。
使用步骤:
-
1.导入jstl相关jar包。
-
2.引入标签库:taglib指令: <%@ taglib %>
-
3.使用标签。
有关jstl的jar下载如下:
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
–
常用的JSTL标签:
-
if :相当于java代码的if语句。
-
choose:相当于java代码的switch语句。
-
foreach:相当于java代码的for语句。
对标签的解释:
<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
prefix是前缀的意思,就是相当于给标签库起前缀名,前缀名通常命名为 c 。、
对于后面内容uri属性,我们导入两个jar包后,自然会补齐。
=========================================================================
这里prefix前缀也是命名为c了。
c:if标签:
-
1.属性:
-
test 是必须设置的属性,接受boolean 表达式。
-
如果表达式为true,则显示if标签体内容;如果表达式为false,则不显示标签体内容。
-
一般情况下,test属性值会结合el表达式一起使用。
-
2.注意:
-
c:if标签是没有else的情况!
<%@page import=“java.util.ArrayList”%>
<%@page import=“java.util.List”%>
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%
//判断request域中的一个list集合是否为空,如果不为null则显示遍历集合。
List list = new ArrayList();
list.add(“aaa”);
request.setAttribute(“list”, list);
%>
<c:if test=“${ not empty requestScope.list }”>
<%=request.getAttribute(“list”) %>
</c:if>
<%
session.setAttribute(“number”, 10);
%>
<c:if test=“${ sessionScope.number % 2 == 0 }”>
session的number数值为偶数
</c:if>
=============================================================================
c:choose标签:
-
使用choose标签取出数字, 相当于switch声明。
-
使用when标签做数字判断,相当于case。
-
otherwise标签做其他情况的声明, 相当于default。
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<% request.setAttribute(“number”, 8); %>
<c:choose>
<c:when test=“${requestScope.number == 1}”>星期一</c:when>
<c:when test=“${requestScope.number == 2}”>星期二</c:when>
<c:when test=“${requestScope.number == 3}”>星期三</c:when>
<c:when test=“${requestScope.number == 4}”>星期四</c:when>
<c:when test=“${requestScope.number == 5}”>星期五</c:when>
<c:when test=“${requestScope.number == 6}”>星期六</c:when>
<c:when test=“${requestScope.number == 7}”>星期七</c:when>
<c:otherwise>星期八</c:otherwise>
</c:choose>
==============================================================================
foreach:相当于java代码的for语句:
1.完成重复的操作
**for(int i = 0;i < 10;i++){
}**
-
属性:
-
begin:开始值
-
end:结束值
-
var:临时变量(就是上面的i)
-
step:步长 (这个步长就是i++位置要修改的内容啥的)
-
varStatus:循环状态对象
-
**(有两个方法调用index和count:
index:容器中元素的索引,从0开始。
count:循环次数,从1开始。
)**
2.遍历容器
**List list;
for(User user : list){
}**
-
属性:
-
items:容器对象。
-
var:容器中元素的临时变量。
-
varStatus:循环状态对象
-
index:容器中元素的索引,从0开始。
-
count:循环次数,从1开始。
<%@page import=“java.util.List”%>
<%@page import=“java.util.ArrayList”%>
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%–
foreach:相当于java代码的for语句
1.完成重复的操作
for(int i = 0;i < 10;i++){
}
- 属性:
begin:开始值
end:结束值
var:临时变量(就是上面的i)
step:步长 (这个步长就是i++位置要修改的内容啥的)
varStatus:循环状态对象
(有两个方法调用index和count:
index:容器中元素的索引,从0开始。
count:循环次数,从1开始。
)
2.遍历容器
List list;
for(User user : list){
}
- 属性:
items:容器对象。
var:容器中元素的临时变量。
varStatus:循环状态对象
index:容器中元素的索引,从0开始。
count:循环次数,从1开始。
–%>
<c:forEach begin=“1” end=“10” var=“i” step=“2” varStatus=“s”>
${i}, ${ s.index } , ${ s.count }
</c:forEach>
<%
List list = new ArrayList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);
request.setAttribute(“list”, list);
%>
<c:forEach items=“${ list }” var=“str” varStatus=“s”>
${ s.index }, ${ s.count } , ${ str }
</c:forEach>
==========================================================================
<c:set /> 作用:set标签可以往域中保存数据。
作用:set标签可以往域中保存数据。
-
scope属性有四个对应值:
-
page表示PageContext域(默认值)。
-
request表示Request域。
-
session表示Session域。
-
application表示ServletContext域。
-
var属性:设置key。
-
value属性:设置值。
<%@page import=“java.util.List”%>
<%@page import=“java.util.ArrayList”%>
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
保存之前:${ requestScope.abc }
<c:set scope=“request” var=“abc” value=“zhangsan”/>
保存之后:${ requestScope.abc }
=======================================================================
步骤如下:
-
1.要有一个form标签,method=post请求。
-
2.form标签的encType属性值必须为multipart/form-data值。
-
3.在form标签中使用input type=file添加上传的文件。
-
4.编写服务器代码(Servlet程序)接受,处理上传的数据。
encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。
multipart/form-data格式的http请求体如下:
平时,我们默认的发送数据都是下面这种类型:
jsp页面代码:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
用户名:
头像:
, file类型要记一下!
Servlet代码:
package com.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(“/touxiang”)
public class touxiang extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println(“文件上传中…”);
//首先,我们传入的参数并不是application/x-www-form-urlencoded , 因此接收不到参数
//System.out.println(req.getParameter(“username”));
//System.out.println(req.getParameter(“photo”));
//我们使用流的方式来接受内容
ServletInputStream inputStream = req.getInputStream();
byte[] buffer = new byte[1024];
int read = inputStream.read(buffer);
while(read!=-1) {
System.out.println(new String(buffer,0,read));
read = inputStream.read(buffer);
}
}
}
14.2 commons-fileupload.jar 常用API介绍和使用
我们上传文件需要commons-fileupload.jar包,而它需要依赖commons-io.jar这个包,所以两个包我们都要引入。
**commons-fileupload.jar中的ServletFileUpload类:就是用来解析上传的数据;
FileItem类:表示每一个表单项。**
commons-fileupload.jar和commons-io.jar包中我们常用的方法:
文件上传的大体思路:
package com.test;
import java.io.File;
import java.io.IOException;
import java.util.List;
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
read));
read = inputStream.read(buffer);
}
}
}
14.2 commons-fileupload.jar 常用API介绍和使用
我们上传文件需要commons-fileupload.jar包,而它需要依赖commons-io.jar这个包,所以两个包我们都要引入。
**commons-fileupload.jar中的ServletFileUpload类:就是用来解析上传的数据;
FileItem类:表示每一个表单项。**
commons-fileupload.jar和commons-io.jar包中我们常用的方法:
文件上传的大体思路:
package com.test;
import java.io.File;
import java.io.IOException;
import java.util.List;
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
[外链图片转存中…(img-ZxEY54Rb-1719263923977)]
[外链图片转存中…(img-ndtjAKIk-1719263923978)]
[外链图片转存中…(img-Pc9qlhwk-1719263923978)]
[外链图片转存中…(img-LcMCgpF8-1719263923978)]
[外链图片转存中…(img-vt4PnrDD-1719263923979)]
[外链图片转存中…(img-2EOojCZ3-1719263923979)]
[外链图片转存中…(img-S8xwkLJR-1719263923979)]
[外链图片转存中…(img-qgkwUUjY-1719263923980)]
[外链图片转存中…(img-J6Rsh5aU-1719263923980)]