今日内容
-
Session
-
JSP
-
EL
-
JSTL
Session
#### 概念
它属于服务器端的一种会话机制,在一次会话的多次请求中实现数据的共享,将数据保存在服务器端的对象中。
HttpSession
-
快速入门:
-
常用的api方法:
-
获取session:request.getSession()
-
三个方法:
-
setAttribute(String name,Object value) 存储值
-
getAttribute(String name): ------>Object value 获取指定的值
-
removeAttribute(String name): 删除会话中指定的值
-
-
-
原理:Session对象的实现需要依赖于Cookie
-
注意:
-
两次打开客户端,服务器端不关闭,两次是否获取的是同一个session?
-
默认情况下:不是
-
需要手动指定cookie中的JSESSIONID,通过响应头的形式发送给客户端,设置cookie的存活时间
-
步骤:
Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(60); response.addCookie(cookie);
-
-
客户端不关闭,服务器端关闭,两次获取的session对象是不是同一个对象?
肯定不是,tomcat服务器内部做了优化,自动完成两项工作
-
session的钝化:序列化
-
session的活化:反序列化
-
-
session对象的销毁时机?
-
服务器关闭
-
session对象的存活时间 默认时间为30分钟
修改session默认存活时间
<session-config></session-config>
-
手动失效 invalidate() 销毁session对象
-
-
session特点:
-
session数据是保存在服务器端,cookie是保存在客户端中
-
session数据存储没有大小限制,cookie有,默认大小为4kb,同一个 域名下总cookie数量限制在20个以内
-
session数据是较为安全的,cookie数据相对不安全。
-
-
JSP
概念
Java Server Pages: 支持Java语言编写的运行在服务端上的页面。
JSP =HTML+JAVA
简化Servlet代码
原理
-
JSP本质上就是一个Servlet
JSP脚本:
-
概念:JSP定义使用 Java代码的方式、规范
-
第一种方式: <% java代码 %> 。被tomcat解析之后生成的代码是存放在哪个位置 service()方法中
-
第二种方式: <%! java代码 %>。被tomcat解析后生成的代码文件,位置在Servlet类的成员位置。可以定义成员变量也可以定义成员方法。
-
第三种方式: <%= java代码 %> 。 被tomcat解析后生成 的代码信息,会出现在页面中 通过打印流写入到页面中
JSP九大内置对象
-
在jsp页面中不用创建可以直接使用的对象,称之为内置对象
-
九大内置对象:
内置对象 真实对象类型 作用
-
request HttpServletRequest 获取请求资源,request域对象(一次请求多个资源共享)
-
response HttpServletResponse 响应,响应的数据封装到响应对象
-
session HttpSession 实现多个用户之间数据共享
-
out JspWriter 输出对象,把信息输出到页面中
-
config ServletConfig 配置Serlet信息
-
exception Throwable 异常对象 (当前页面需要声明 isErrorPage = true)
-
pageContext PageContext 当前页面实现数据共享
-
application ServletContext 全局域对象 代表整个web应用
-
page Object(当前Servlet对象--->当前页面) 当前页面
-
-
JSP指令
-
作用:配置当前jsp页面,可以导入一些外部资源
-
语法格式:
-
<%@ 指令名称 属性名= 属性值 属性名2 = 属性值2 ....%>
-
-
分类:
-
page -----> 配置当前的页面
-
contentType:等同于 response.setContentType("text/html;charset=utf-8")
设置响应体的mime类型以及编码字符集
-
设置当前页面的编码 可以使用pageEncoding = UTF-8
-
import : 导包 导入外部的一些类库资源
-
errorPage : 指定当前页面发生异常跳转的目标页面,会自动跳转过去
-
isErrorPage:确定是否使用exception内置对象 true-->使用 false-->不用,同时标识本页面为错误页面
-
-
include: ----> 包含其他页面信息
-
语法格式: <%@ include file = "资源路径" %>
-
结合使用 <jsp:include file = "资源路径">
-
-
taglib: 引入外部的标签库资源
-
语法格式: <%@ taglib prefix = "前缀" uri = "资源路径" %> 前缀可以自定义,但是一般使用默认的
-
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-
-
注释:
-
html注释
-
格式: <!-- html注释内容 -->
-
-
jsp注释: 一般使用jsp注释
-
格式: <%-- java代码、html代码 --%> 客户端是不显示的,服务器端对于jsp注释是不发送的。
-
-
MVC:开发模式
-
概念:
-
M:Model 模型-----> JavaBean
-
用于封装数据、处理业务逻辑(三层架构)--->Service
-
-
V: View 视图-----> JSP
-
展示数据
-
-
C: Controller 控制器------>Servlet 中枢大脑
-
获取表单输入的数据
-
关联模型和视图
-
给客户端响应一些业务结果(需要首先把数据传输给视图)
-
-
EL表达式
-
概念:Expression Language 表达式语言 只能在JSP页面上使用
-
作用:简化jsp页面中的java代码
-
语法: ${表达式}
-
注意事项:
-
对于jsp页面默认是支持el表达式。如果想要忽略el表达式
-
第一种 使用 isELIgnored = “true” 禁止当前页面使用EL表达式
-
第二种:
\${表达式} 忽略掉当前的EL表达式 如 ${3 > 4 ? true : false}
-
-
-
具体的使用:
-
运算:
-
运算符:
-
算术运算符 + - * / %
-
比较运算符 > < >= <= != ==
-
逻辑运算符 && (and) 与 || (or ) 或 !(not) 非
-
空运算符 empty
-
功能:判断域中存储的对象是否为空 对象为null或者给对象为容器,容器的长度为0
-
语法格式: ${empty 目标对象}:判断 字符串、数组、集合是否为null或者长度为0------>或
-
不为空 ${not empty 目标对象}:判断字符串、数组、集合不为null并且长度也不为0---->与
-
${empty 目标对象} 如果为空返回true 如果不为空返回false
-
${not empty 目标对象} 如果为空返回false,如果不为空返回true
-
-
-
-
-
从域中取值 request、ServletContext session pageContext
-
大小范围 : ServletContext > session > request > pageContext
-
在EL表达式中有对应的名字 applicationScope > sessionScope > requestScope > pageScope
-
-
el表达式只能从域中取值
-
语法格式: ${域名称.key名称}
-
-
EL取值时可以省略域名称
-
语法格式: ${key名称} 取值顺序:从最小的域中到最大的域中查找,直到查到为止。
如果没有查到,不显示,也不报错。
-
获取域中存储的对象中属性值:
语法格式:${对象名称.属性名称}
注意事项:映射JavaBean中的方法后面的名字 如getAge()----> Age---->age
获取集合中对象的属性值
list集合: ${key名称.get(索引).属性名}
map集合: ${key名称.get(key名称).属性名}
-
优化做法:
-
list集合: ${域名城.key名称[索引]}
-
map集合: ${域名城.key名称["key名称"]}
${域名城.key名称.key名称}
-
-
-
隐式对象获取方式: 可以通过pageContext获取到其他八大内置对象
-
EL表达式中有11个隐式对象
-
-
编译器代码
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello,word");
}
}
public class User implements Serializable {
/*private Integer age;
private String name;
private String password;
private Date birthday;*/
private Integer age;
private String name;
private String password;
private Date birthday;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(Integer age, String name, String password, Date birthday) {
super();
this.age = age;
this.name = name;
this.password = password;
this.birthday = birthday;
}
@Override
public String toString() {
return "User [age=" + age + ", name=" + name + ", password=" + password + ", birthday=" + birthday + "]";
}
}
EL表达式
%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="" %>
<html>
<head>
<title>入门</title>
</head>
<body>
<!--el表达式只能在jsp页面上使用 -->
<hr>
\${3 > 4 ? true : false}
<%-- <hr>
${3>4}
<hr>
\${3>4?true:false}
--%>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: admin
Date: 2021/1/14
Time: 16:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>算术运算符</title>
</head>
<body>
<hr>
${3+4}
<hr>
${3-4}
<hr>
${3*4}
<hr>
${3 % 4}
<hr>
${3 / 4}
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: admin
Date: 2021/1/14
Time: 16:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>比较运算符</title>
</head>
<body>
<hr>
${ 3 > 4 } <br>
${ 3 != 4} <br>
${ 3 < 4} <br>
${ 3 == 4} <br>
</body>
</html>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: admin
Date: 2021/1/14
Time: 17:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>逻辑运算符</title>
</head>
<body>
<%
ArrayList<Object> list = new ArrayList<>();
HttpSession session2 = pageContext.getSession();
session2.setAttribute("list", list);
%>
<hr>
${3 > 4 && 3 < 4} <br>
${3 > 4 and 3 < 4} <br>
${3 > 4 || 3 < 4} <br>
${3 > 4 or 3 < 4} <br>
${!(3 > 4)} <br>
${not(3>4)} <br>
<hr>
<hr>
${ not empty list}
</body>
</html>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: admin
Date: 2021/1/14
Time: 17:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式取值</title>
</head>
<body>
<%-- <%
session.setAttribute("username", "张三");
pageContext.setAttribute("password", "123456");
application.setAttribute("age", 18);
request.setAttribute("birthday", new Date());
%>
<hr>
姓名:${sessionScope.username}<br>
<hr>
密码:${pageScope.password} <br>
<hr>
年龄:${applicationScope.age} <br>
<hr>
生日:${requestScope.birthday} --%>
</body>
</html>
<%@ page import="java.util.Date" %>
<%@ page import="com.zhiyou100.pojo.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: admin
Date: 2021/1/14
Time: 17:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>取值顺序</title>
</head>
<body>
<%
session.setAttribute("username", "张三");
pageContext.setAttribute("password", "123456");
pageContext.setAttribute("username", "李四");
application.setAttribute("age", 18);
request.setAttribute("birthday", new Date());
User user = new User();
user.setAge(18);
user.setName("张三");
user.setPassword("123456");
user.setBirthday(new Date());
session.setAttribute("user", user);
ArrayList<User> list = new ArrayList<>();
list.add(user);
session.setAttribute("users", list);
HashMap<String, User> map = new HashMap<>();
map.put("one",user);
session.setAttribute("map", map);
%>
<h3>省略域名称</h3>
姓名: ${username2}
<hr>
<h3>取出对象中的属性值</h3>
${user.birthday}
${user.age}
<hr>
<h3>获取集合中对象的属性值</h3>
年龄:${users.get(0).age}
<hr>
<h3>优化list操作</h3>
年龄:${users[0].age}
<hr>
<hr>
<h3>优化map操作</h3>
年龄:${map["one"].age} <br>
年龄:${map.one.age}
<hr>
年龄 :${map.get("one").age}
</body>
</html>