后端学习笔记(二)——JSP、el表达式+JSTL
后端一、JSP一、JSPSSM的模板,传统模式还可以使用,前后端分离不可以使用(1). JSP原理jsp页面 = (html+css+js) + Java脚本(<%%>)jsp -> 翻译 .java -> 编译 .class (tomcat/work路径下)(2)JSP七个组成部分HTML静态内容 HTML + CSS +JS指令 <%@keyword %>p
一、JSP(很少使用)
理解:
SSM的模板,传统模式还可以使用,前后端分离不可以使用
发展—servlet的升级(java为主)—JSP(HTML为主)
开始用于做动态网站,现在仅仅是模板,被替代
JSP本质依旧是Java,由容器翻译成.java文件,后编译为.class文件,就可以在虚拟机中运行。文件放在tomcat的work路径下
更改HTML困难
(1). JSP原理
- jsp页面 = (html+css+js) + Java脚本(<%%>)
- jsp -> 翻译 .java -> 编译 .class (tomcat/work路径下)
第一次已经翻译编译过所以第二次之后不再翻译编译,速度变快(同servlet)
(2)JSP七个组成部分
JSP=静态内容+Java代码(小脚本)
1. HTML静态内容 HTML + CSS +JS】
脚本:<% %>
2. 指令<%@keyword %>
- page : 必须有的指令,在jsp页面的第一行,可以拆分多个page。定义页面属性数据。
- include:包含,可以在一个jsp页面中包含另一个页面。(一般不用)
- taglib:标签库,可以引入标签进行开发,可以简化小脚本。除官方外,可以自定义。例如:jstl
vue中的原型
3. 表达式 <%= %> :
小脚本的升级
替代了小脚本中的输出out.print();让jsp在html页面中输出更简单。
4. 小脚本 <% %>
=Java代码 。存在例外:System.out.print() -> out.print(); request.getSesson() -> session
(session是JSP的内置对象,而在servlet中属于request对象的一个属性)
- 方法声明
<%! %>
jsp页面中声明一个方法,可以多次调用。 - 标准动作
<jsp:keyword></jsp>:
标签的基础,但是没人用。 - 注释:<%-- jsp注释内容 --%>
等价于Java中的注释,不用
<!--html注释-->
<%
//Java单行注释
/*
* Java多行注释
* */
%>
<%--jsp注释--%>
(3)JSP九个内置对象
JSP中九大内置对象为:
- pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
2. request 请求对象
类型 javax.servlet.ServletRequest 作用域 Request
前端——>后端
设置请求字符编码
获取数据
3. response 响应对象
类型 javax.servlet.SrvletResponse 作用域 Page
后端——>前端
设置请输出响应求字符编码
输出数据
//1、设置编码格式。
request.setCharacterEncoding("utf-8");
//2、获得表单数据
String start = request.getParameter("_start");
String limit = request.getParameter("_limit");
//3、封装message对象
//4、调用dao实现插入操作
List<Message> messageList = new MessageDaoImpl().getMessageByPage(Integer.parseInt(start),Integer.parseInt(limit));
//5、设置编码格式
response.setContentType("text/html; charset=utf-8");
//6、ajax返回结果 1/0 object -> json
PrintWriter out = response.getWriter();
String ret = JSON.toJSONString(messageList);
out.print(ret);
out.close();
4. session 会话对象
类型 javax.servlet.http.HttpSession 作用域 Session
- application 应用程序对象
类型 javax.servlet.ServletContext 作用域 Application
6. out 输出对象
类型 javax.servlet.jsp.JspWriter 作用域 Page
out.print()
- config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
- exception 异常对象 类型 javax.lang.Throwable 作用域 page
- page 页面对象 类型javax.lang.Object 作用域 Page
(4)四大作用域
- 域对象作用:保存数据和获取数据,用于数据共享。
- 域对象方法:
setAttribute(“name”,Object) 保存数据
getAttribute(“name”) 获取数据
removeAttribute(“name”) 清除数据 - 域对象作用范围:
page域: 只能在当前jsp页面中使用(当前页面)
request域: 只能在同一个请求中使用(转发)
session域: 只能在同一个会话(session对象)中使用(重定向)
application域: 只能在同一个web应用中使用。(全局的)
(5)转发和重定向【难点】
(传统模型):
- 结果指向都是JSP或者另一个servlet。
- 前后端分离无需转发和重定向,传统方式才需要后续操作。
转发
url地址不变。
一次请求响应过程,request数据传递。
request
重定向
url会发生改变
两次请求响应过程,session传参。
response
(6)session和cookie
-
会话:浏览器和服务器之间进行一次连接多次对话的总称。
-
session的作用域就是一次会话。
session创建:浏览器第一次与服务器进行通信的时候,在服务器创建session对象。
session销毁:关闭浏览器(延时)、session超时(30)、session.invalidate() -
session和cookie的区别:
当用户量过大时使用session,由服务器开辟,属于内存对象,存放在内存中,内存会崩掉。session id存放在cookie中
选择cookie,存放在客户端,属于text文本,cookie是明文存储,需要自行加密。不如session安全
HTML5后选择 sessionStorage
会话:当第一次访问某网站时,开辟一个内存空间,拥有一个私人的session id返给浏览器session id存在cookie中;当再访问该网站时可以用该session id来取出存放的东西,比如user id,可以不用登录;持续活跃时空间一致保留,但是一定时间不用30min(超时,监控浏览器而不是标签)或者自己归还空间主动关闭浏览器(定期回收),就释放。还可以程序回收,但不会用。
- 栗子①:
(传统模式下的登录验证)
直接访问index.jsp,显示未登录
先访问login.jsp后访问index.jsp,显示欢迎10001
- 补充:
getAttribute() 方法返回指定属性名的属性值。
提示:如果您希望以 Attr 对象返回属性,请使用 getAttributeNode。
(7)前后端分离登录验证JWT (大多token)重点在加密解密算法
- 栗子②:
前后端分离(微信小程序也可以使用)——在nginx中获取页面,tomcat中获取数据。【token解决】
- 栗子③:
在HTML页面之间传递数据【建议使用sessionstorage】
- token是一个可加密可解密的字符串,可以在token中存放一些信息,例如用户ID,用户名等。
- token可以自定义格式,也可以按照标准定义(三部分)。
https://www.jianshu.com/p/576dbf44b2ae
单点登录、跨平台——token
存在客户端,而不是服务器
任意网站登录,其他网站(连锁店)也可以直接登录
补充 :websocket——前端局域网的跳转——客服
(8)JSP使用方法
- 需要引用
- 在webapp下新建index.jsp
配置指令
https://www.cnblogs.com/dayandday/p/10681565.html配置tomcat
- 以wabapp为根路径 localhost:8080/ 虚拟(可有可无)/(想查询的文件)
虚拟路径
- 单纯 / 代表根路径
- 目的:区分前台后台两个项目,做权限控制/区别时,以:
localhost:8080/admin/***
为路径的在数据库加权限;没有admin的无需加权限
二、el表达式+JSTL(分别替代JSP的表达式和脚本)
jsp的简化操作,简化数据展示和操作(共性)
(1)el表达式
(输出+简单操作 类似vue)
${ }
- 配置指令
<%@ page isELIgnored="false" %>
- 语法规则
//obj.attr
${user.id}
${user.userName}
//obj[]
${user["id"]}
${users[0].userName}
- 隐式对象 - 11个
- 作用域对象可以省略,按 application -> session ->request ->page 查找,没有不输出。
正常情况下——jsp.request.getpremeter() /request.getSession() 取得值打印出来;
使用el表达式——直接打印值,会自动的按照作用域由大到小找值,没有时不输出。且不用做非空判断。
四个作用域中由多个存在并想要固定输出时(user),可以加(requestScope.user)前缀,则去固定作用域取值。
(2)JSTL
标签库:替代jsp脚本。实现页面全标签操作。一般jstl+el联合使用
(3)使用方法
- 准备工作
导入jar (jstl和standard)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
页面引入taglib(标签库)_JSP指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
//这里prefix里面是c,则图中标签均为c:
常用标签:
<c:forEach> 类似于vue中的v-for,替代for循环
总结
JSP=HTML静态内容+指令+表达式 el表达式+小脚本 JSTL
除指令外其余均用标签,实现页面标签化,无Java语法。
逐渐被thymeleaf替代
更多推荐
所有评论(0)