《JSP+EL表达式+JSTL标签+Cookie 入门-学习笔记》
作者:互联网
JSP
1 JSP说明
JSP(Java Server Page)是JavaEE规范中的Web组件,用来编写动态页面
JSP文件中的内容就是 HTML+Java代码,静态部分使用HTML和文本即可,动态部分使用Java代码
JSP的本质就是Servlet,不过是服务器将JSP进行了翻译和编译;可以说,JSP也是一个Java类;
index.jsp 欢迎界面,配置文件 或index.html
tomcat启动时会运行
1.实现动态网页技术
2.在jsp文件中,可以写html(js和jquery)代码也可以写java代码
3.执行过程:翻译-编译-运行
jsp文件先翻译成java文件,再编译成class文件执行
2 JSP语法
标签内部是java代码。通过java代码实现动态拼到html页面内容
1.指令
1.1 页面设置指令
<%@page contentType="text/html;charset=UTF-8" language="java" %>
1.2 引入项目中的其他文件(通用逻辑代码复用)
<%@include file="common.jsp" %>
1.3引入JSTL标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
2.语法
1.写java代码
<% java代码%>
2.输出到页面内容
<%= 输出 %>
3.声明方法
<%! %>
案例:员工信息动态呈现在网页上
/*
java代码部分用<%%>包含起来,html代码部分放在外面
*/
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
</tr>
从tr头开始 遍历
<%
for (User user : users) {
%>
<tr>
<td><%=user.getUserId()%></td>
<td><%=user.getUserName()%></td>
<td><%=user.getUserPwd()%></td>
</tr>
<%
}
%>
</table>
3 JSP的九大内置对象
Jsp页面加载完毕之后自动帮开发者创建好了这些对象,就叫做内置对象。
Jsp文件翻译成java文件时,有一些对象被自动写在了java文件中,这些被自动写进去的对象叫内置对象。
JSP就是一个servlet
所以jsp文件创建好之后翻译后,自动拥有servlet的一些对象
request,response,session,application(request.getServletContext)
out(相当于输出流 resp.getWriter())
page:当前jsp文件自身对象,相当于this
pagecontext :用来获取四大域对象
config获取配置信息
exception异常信息,配置异常页面
3.1 JSP 的内置对象的特点
- 由 JSP 规范提供,不用编写者实例化;
- 通过 Web 容器实现和管理;
- 所有 JSP 页面均可使用;
- 只有在脚本元素的表达式或代码段中才能使用。
<%--JSP脚本--%>
<%
/*将数字1绑定到pageContext对象上*/
pageContext.setAttribute("id",1);
request.setAttribute("name","maria");
session.setAttribute("address","河南");
application.setAttribute("sex","男");
/*从域对象上获取值*/
Integer id = (Integer) pageContext.getAttribute("id");
Object address = session.getAttribute("address");
%>
?
<%--在JSP中,获取给项目配置的虚拟路径--%>
//请求对象。获得全局对象。获得虚拟路径
<%=request.getServletContext().getContextPath()%>
//请求对象。获得虚拟路径
<%=request.getContextPath()%>
//服务器对象。获得当前虚拟路径
<%=application.getContextPath()%>
3.2 四种作用域
从大到小
ServletContext 作用域 application 服务器
httpSession 作用域 session 浏览器
httpServletRequest 作用域 request 某次请求中
Pagecontext 作用域 page域 当前页面
都可以用3个方法操作数据
setAttribute
getAttribute
removeAttribute
3.3 四作用域的特点
page | 属性保存到 pageContext 中,则它的作用域是 page。 | 当前JSP页面,跳转后失效 |
request | 属性保存到request中,作用域为request | 服务器转发有效,服务器浏览器重定向无效 |
session | 属性保存到session中,作用域为session | 当前会话范围内有效,网页关闭后无效 |
application | 属性保存到application中,作用域为application | 服务器重启失效 |
4. JSP转发和重定向
不同组件之间转发和重定向 servlet和jsp结合
4.1 转发 req.getRequestDisparther("/").forward(req,rest)
request信息不丢失,pageContext丢失
1.转发
服务器内部跳转,浏览器页面不改变,携带信息,处理后返回
使用request对象调用把请求对象和响应对象与要跳转的地址共享
使用request对象共享数据
req.getRequestDispatcher("转发路径").forward(req,resp);
4.2 重定向 resp.setRedirect("/")
request信息丢失,pageContext丢失,以上的不丢失
2.通过response对象调用,2次请求,2次响应
使用session对象共享数据
响应重定向通过response对象调用,让浏览器向重定向的地址重新发送一次请求
response.sendRedirect("error.jsp");
4.3 区别
转发(常用,效率高) | 重定向(不常用) |
---|---|
浏览器url不变 | 浏览器url改变 |
服务器内部跳转 | 服务器接到请求,响应让浏览器再次请求,然后二次响应 |
浏览器只请求了一次 | 浏览器请求至少2次 |
跳转之间浏览器request信息不丢失 | 浏览器的请求request信息会丢失 |
5 EL表达式
从域对象或参数中取值并输出到页面中 可以是req,resp,session,application
5.1 EL表达式语法
首先:域对象要绑定值,才可以使用EL表达式拿到域对象里参数的值
req.setAttribute("user",user);
req.getRequestDisparcher("/").forward(req,resp);
"/页面内"
获取对象的属性${user.getUserName()}
获取集合中的对象,例如:${newsList[0]}??
允许使用运算符
(),
+-*/%,
==,!=,等
&$,||,!
?:三元
empty:用于检测变量是否为空/null 返回值是boolean
${empty user}
<%--${empty 值}:判断--%>
<%--user1存在,false--%>
${empty user1}
<%--${not empty 值}:该值是否存在--%>
<%--true--%>
${not empty user1}
EL表达式隐式对象,取值范围优先级从小到大
pageScope
requestScope
sessionScope
applicationScope
<%--使用EL表达式从域对象获取值--%>
<%--根据一定的顺序取值:page、request、session、application--%>
${name}
<%--获取指定域对象上的值--%>
${sessionScope.name}
${requestScope.name}
参数访问对象
param
paramValues
<%--接收前端参数值--%>
<%--http://localhost:8080/day10/jsp/el.jsp?name=maria&hobby=sing&hobby=dance--%>
${param.name} 从前端提交过来的url获取值
${paramValues.hobby[1]}
jsp配置对象
pageContext
6 JSTL标签
作用是配合EL表达式实现逻辑控制
需要jar包支持
下载jstl.jar和standard.jar包
在使用jstl的页面中,需要加入taglib指令,导入核心标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
6.1 作用
<c: ></c> 双标签
设置值 c:set
输出值 c:out
判断 c:if
跳转 c:redirect
遍历 c:forEach
移除值 c:remove
<%--设置值--%> var=key value=value scope=作用域
<c:set var="name" value="jack" scope="page"></c:set>
<c:set var="name" value="tom" scope="request"></c:set>
这里的value指的是key
<c:out value="name" value="tom" ></c:set>
<%--移除值--%> 在指定域移除指定key对应的value
<c:remove var="name" scope="page"></c:remove>
<%--输出值--%>
<%--javax.el.PropertyNotFoundException: Property [name] not found on type [org.apache.jasper.runtime.PageContextImpl]--%>
<%--<c:out value="${pageContext.name}"></c:out>--%>
<%--判断--%>
${empty name}
<c:if test="${not empty name}">
<%--进入主界面main.jsp--%>
<%--跳转--%>
<%--相对路径:main.jsp--%>
<%--根路径:/jsp/main.jsp--%>
<%--<c:redirect url="/jsp/main.jsp"></c:redirect>--%>
</c:if>
<%--遍历--%>
<%
User user1 = new User();
user1.setUserId(1);
user1.setUserName("tom");
user1.setUserPwd("1234");
User user2 = new User();
user2.setUserId(2);
user2.setUserName("jack");
user2.setUserPwd("1234");
/*把User对象放到集合中*/
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
/*把上述值绑定到域对象上*/
request.setAttribute("users",users);
%>
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
</tr>
<%--遍历--%>
<c:forEach var="user" items="${users}">
<tr>
<td>${user.userId}</td>
<td>${user.userName}</td>
<td>${user.userPwd}</td>
</tr>
</c:forEach>
</table>
</html>
Cookie
浏览器-服务器 会话跟踪
背景:HTTP协议,一次请求一次响应就结束,是一种无状态协议,无法跟踪用户路径,知道用户是谁
浏览器多次请求,服务器不知道浏览器是谁,例如:账号登录。
会话跟踪的方式:
1.url跟踪,直接把需要保存的信息加到url后面
2.隐藏域方式,使用hidden表单<input type="hidden" name=“status" value=“true">
3.session方式,把信息存入服务器会话中,通过唯一的session ID值绑定客户端信息
4.Cookie方式,n 将状态信息保存到客户端,服务器能够获得相关信息进行分析,
从而生成对客户端的响应;例如简化登录功能就可以使用Cookie实现;
cookie存储的形式
一条cookie的属性 是由不同的值用 "; "分号和空格间隔开的
name=value;Domain;Path;expires/MaxAge;Size;HttpOnly;Secure;SamePage;Priority;
常用属性 name=value; path=/; expires ;
创建(设置)cookoe的语法
/* name=value; Path=/; */
alc = sarAz7695dPmNhFZG2qWmg==; Path=/; HttpOnly;SameSite=None;Secure;
从请求中获得cookie //格式是name=value; name=value; name=value; ....
__jdu=16525183911271319951529;shshshfpa=92829409-ff3b-9a32-2fe6-3ef0c0d97143-1652518396; shshshfpb=cbrVtp5fbKnnOFNyfqG2Lrw;
js中操作cookie
获取并 读取cookie 删除cookie
var cookie=document.Cookie;
//__jdu=16525183911271319951529;shshshfpa=92829409-ff3b-9a32-2fe6-3ef0c0d97143-1652518396; shshshfpb=cbrVtp5fbKnnOFNyfqG2Lrw;
//上面就是获取的cookie
//要去到name和value 拆分cookie
var cookies= cookie.solit("; ")//根据分号拆分开
/* 此时cookies name=value
cookies[0] :__jdu=16525183911271319951529
cookies[1] :shshshfpa=92829409-ff3b-9a32-2fe6-3ef0c0d97143-1652518396
cookies[2] :shshshfpb=cbrVtp5fbKnnOFNyfqG2Lrw
....
*/
//根据等号拆分前2个内容
var cookieName= cookies[0].split("=");
name=cookieName[0],value=cookieName[1];
//获得了cookie的name和value
设置cookie(新增,修改,删除)
新增cookie的方法时直接写cookie即可
document.cookie=name=value;path=/;expire=new Date; 直接设置cookie
修改cookie 先获取cookie找到相应的cookie,在直接写cookie
document.cookie=name=newValue .....
删除cookie//为了删除指定名称的cookie,可以将其过期时间设定为一个过去的时间
function delCookie(name){
var date = new Date();
date.setTime(date.getTime() - 10000);
document.cookie = name + "=a; expires=" + date.toGMTString();
}
java操作cookie
@WebServlet("/cookie")
public class CookieDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 服务端:想让客户端保存数据-Cookie(通行证)
// 创建Cookie对象
Cookie cookie = new Cookie("name","tom");
// 设置路径
// 同path下,同name,替换/覆盖原来值
cookie.setPath("/");
// 设置最大的年龄 过期时间
// cookie.setMaxAge(24*60*60);//单位是秒 正数,过期时间;保存时间很长
// cookie.setMaxAge(-1);//负数,临时Cookie,当浏览器关闭,删除Cookie
cookie.setMaxAge(0);//0,删除Cookie
// 想让客户端保存数据cookie
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("ok");
writer.close();
}
}
@WebServlet("/cookie2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取当前客户端发过来的Cookie中的数据
Cookie[] cookies = req.getCookies();
// 解析
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+" "+cookie.getValue());
// 需求:tom->jack
if("name".equals(cookie.getName())){
cookie.setValue("jack");
// 覆盖操作,设置path
cookie.setPath("/");
cookie.setMaxAge(10*60*60);
// 想让客户端保存数据jack
resp.addCookie(cookie);
}
}
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("ok");
writer.close();
}
}
WebStorage 用来在客户端保存数据
发送请求时,不会吧对应的数据发送过去
localStroge:
设置值:localStorage.key=val localStorage.setItem(key.val)
获取值:localStorage.key localStorage.getItem(key)
删除值:localStorage.removeItem(key) 清空 localStorage.clear();
sessionStorage 同上
区别,浏览器关闭时,sessionStorage中的数据没有了
标签:EL,cookie,name,对象,value,JSTL,JSP,Cookie 来源: https://www.cnblogs.com/04251213yuRain/p/16421768.html