ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《JSP+EL表达式+JSTL标签+Cookie 入门-学习笔记》

2022-06-29 00:36:04  阅读:165  来源: 互联网

标签:EL cookie name 对象 value JSTL JSP 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有