Session、jsp、EL

一。Session: 服务器中的会话技术
在这里插入图片描述
存储数据 - 域对象
域对象范围: 一次会话

  • 获得session对象:
    // 当客户端第一次调用该方法, 服务器会创建一个session对象并返回
    // 当客户端再次调用该方法, 服务器直接将之前的session返回
    request.getSession();

    服务器第一次为客户端创建Session对象的时候, 会分配一个JSESSIONID编号
    并且将 JSESSIONID 传递给客户端的cookie进行保存

    一次会话结束, 下次会话想要继续访问之前的session,
    需要将 JSESSIONID 进行持久化

  • session的生命周期:
    创建: 客户端第一次调用getSession()方法时
    销毁: 1.手动销毁 session.invalidate();
    2.服务器非正常关闭
    注:服务器正常关闭, session不会消失, 会变成文件保存在本地磁盘 - session钝化
    3.超时 超时在web.xml配置文件写
    《session-config》
    《session-timeout》几分钟《/session-timeout》
    《/session-config》

  • 域对象:
    ServletContext: 服务器启动期间
    session: 一次会话
    request: 一次请求
    pageContext: page域


public class SessionServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //session要依赖cookie将cookie带给客户端来分辨session数据是否要被客户端获取
        //获得session对象
        HttpSession session = request.getSession();//创建出来就会有JSESSIONID
        //获取session对象的id
        String jsession=session.getId();
        //3.创建一个一摸一样的cookie给客户端用
        Cookie cookie=new Cookie("JSESSIONID",jsession);//cookie
        cookie.setPath(request.getContextPath());//设置cookie路径也要和session相同
        //4.设置cookie持久化
        cookie.setMaxAge(60*10);
        //5.覆盖原来的cookie,即带给客户端
        response.addCookie(cookie);//JSESSIONID=1CD3EF6DCE420E7131543C2982F70E37
        //6.向session中存数据
        session.setAttribute("name","zhangsan");
    }
    ------------------------------------------------
     //获取session对象
        HttpSession session = request.getSession();
        String sessionname=(String) session.getAttribute("name");
        System.out.println(sessionname);
        response.getWriter().println(sessionname+";;;"+session);
        ------------------------------------------------
         HttpSession session = request.getSession();
        //销毁session
        //1.手动销毁
        session.invalidate();
        /*
        2.超时自动销毁。在配置文件设置
         <session-config>
        <session-timeout>1</session-timeout>//单位分钟
         </session-config>
         */
        //3.服务器非正常关闭会销毁。但是正常关闭不会销毁。正常关闭数据存放在本地硬盘,当重新开启服务器,数据又到内存中去

二。JSP

1.jsp脚本和注释

  • .jsp文件第一次运行之前会先翻译成xx_jsp.java文件, 再编译成xx_jsp.class。jsp 本质就是Servlet

  • jsp脚本和注释:
    <% 普通java代码 %>: 翻译到service方法中
    <%=表达式 %>: 翻译到service方法中, out.print(表达式);
    <%! 声明语句 %>: 翻译成 xx_jsp 类的成员

    html注释 : JSP源码 java代码 前端页面
    // Java注释 : JSP源码 java代码
    <%-- JSP注释 --%> : JSP源码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
<%  int a=0; for(a=0;a<10;a++){%>
<h2><%= a %></h2>
 <%
}
%>


<%= a=3%>

<%!  public void get(int m){};//声明语句,翻译成类的成员(成员变量、成员方法)%>

<!--html注释-->
<%-- jsp注释 --%>

</body>
</html>
  1. JSP指令
    -1.page指令:
    page: <%@ page 属性 %>
    contentType: response.setContentType(“text/html;charset=utf-8”)
    language: java语言
    session: true-默认
    pageEncoding: response.setContentType(“text/html;charset=utf-8”)

    buffer: out缓冲区大小, 默认8kb, 设置关闭=none
    extends: 继承 HttpJspBase
    import: 导包
    isErrorPage: 是否是错误页面, 默认false
    errorPage: 错误页面, 当前页面出现异常后转发到的页面
    isELIgnored: 是否忽略EL表达式, 默认"false"

    2.include指令
    include: <%@ include%> 静态包含
    引入文件, 属性file=“不加虚拟目录uri”
    3.taglib指令
    taglib: <%@ taglib%> 标签库
    uri:jar路径 prefix:前缀

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<%@page buffer="8kb" %>
<%@page errorPage="/jsp1.jsp"  %>
<html>
<head>
    <title>jsp指令</title>
</head>
<body>
aaaaa
<% session.setAttribute("name","zhangsan");%>
<% List<String>list=new ArrayList<>();%>
<%out.write("cccc");%>
<%out.print("dddd");%>
<% response.getWriter().write("eeee");%>
<%--<% int a=1/0; //生成一个错误 %>--%>

<%--
jsp属性out有缓冲区(out的类型:JspWriter),会在缓冲完后再加到response缓冲区中。可以通过设置buffer="none"将数据直接加到respons缓冲区
<%@page errorPage="/jsp1.jsp"%> 设置errorPage属性会在页面出错后跳转到那个页面
import属性用来导入java的包
--%>

<%@include file="/includeB.jsp"%>

</body>
</html>
  • jsp属性out有缓冲区(out的类型:JspWriter),会在缓冲完后再加到response缓冲区中。可以通过设置buffer=“none"将数据直接加到respons缓冲区
    <%@page errorPage=”/jsp1.jsp"%> 设置errorPage属性会在页面出错后跳转到那个页面
    import属性用来导入java的包
    在这里插入图片描述

  • JSP内置对象9个: 在<% %>中可以直接使用的对象
    HttpServletRequest request
    HttpServletResponse response
    PageContext pageContext
    pageContext.findAttribute(“name”)
    从 page->request->session->application 按顺序搜索name对应的值, 直到找到为止, 并返回
    HttpSession session: session = true
    ServletContext application
    ServletConfig config
    JspWriter out
    Object page = this
    Throwable exception: isErrorPage = true

<body>

<%  pageContext.setAttribute("name","zhansan",PAGE_SCOPE);%>
<%  pageContext.setAttribute("name", "lisi",REQUEST_SCOPE);%>
<%  pageContext.setAttribute("name", "wangwu",SESSION_SCOPE);%>
<%  pageContext.setAttribute("name", "hongqi",APPLICATION_SCOPE);%>
<!--
1.	pageContext是一个域对象
2.	pageContext可以向指定的其他域中存取数据
-->
<%= pageContext.getAttribute("name",PAGE_SCOPE)%>
<%= pageContext.getAttribute("name",REQUEST_SCOPE)%>
<%= pageContext.getAttribute("name",SESSION_SCOPE)%>
<%=pageContext.getAttribute("name",APPLICATION_SCOPE)%>
</body>
----------------------------------------------
<body>
<%= pageContext.getAttribute("name",PAGE_SCOPE)%>
<%= pageContext.getAttribute("name",REQUEST_SCOPE)%>
<%= pageContext.getAttribute("name",SESSION_SCOPE)%>
<%=pageContext.getAttribute("name",APPLICATION_SCOPE)%>
<!--换了一个应用,只能访问到session会话和application-->

<!--findAttribute依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找 -->
<%= pageContext.findAttribute("name") %>
</body>
  1. JSP动态标签:
    意义-减少java脚本的书写
    <jsp:include page=“uri”> 动态包含
    <%@ include file=“uri” %> 静态包含

    <jsp:forward page=“uri”/>页面转发

<!--jsp标签之 页面包含 和 页面转发-->
<jsp:include page="pageContext1.jsp"/>
<jsp:forward page="PageContext2.jsp"/>

三。EL

  • expression language 对象属性导航语言 OGNL
    作用: 为了取代get方法
    ${对象.属性} - 对象.get属性()
  <% // 模拟向域中存值
        request.setAttribute("name", "zhangsan");
        Cookie cookie1 = new Cookie("user", "tom");
        Cookie cookie2 = new Cookie("password", "12345");

        response.addCookie(cookie1);
        response.addCookie(cookie2);
    %>
    <%--  <%=request.getAttribute("name")%> --%>
    ${requestScope.name}<br>

    <%--  request.getParameter("username")  --%>
    ${param.username} -- ${param["username"]}
    <br>

    <%-- request.getHeader("user-agent") --%>
    ${header["user-agent"]}<br>
    <%-- Cookie[] cookies = request.getCookies()其中name=user的cookie对象
         for(int i ) {
            cookies[i].getName() == "user"
            cookies[i].getValue() -> tom
         }

         cookie.user -- Cookie对象
    --%>
    ${cookie}<br>
    ${cookie.user.name}  --- ${cookie.user.value}
    -----------------------------------------------
     <% // 模拟向域中存数据
        request.setAttribute("name", "张三");
        session.setAttribute("name", "李四");

        // 存储User对象
        User user = new User();
        user.setId(1);
        user.setUsername("tom");
        pageContext.setAttribute("user", user);

        // 存储List<String>集合
        List<String> strList = new ArrayList<>();
        strList.add("小王");
        strList.add("小赵");
        strList.add("小谢");
        strList.add("小张");
        request.setAttribute("strList", strList);

        // 存储List<User>集合
        List<User> userList = new ArrayList<>();
        userList.add(new User(1, "谢逊"));
        userList.add(new User(2, "张无忌"));
        userList.add(new User(3, "赵敏"));
        userList.add(new User(4, "张翠山"));
        request.setAttribute("userList", userList);
        // 存 Map<String , String>
        Map<String, String> strMap = new HashMap<>();
        strMap.put("谢逊", "金毛狮王");
        strMap.put("张无忌", "九阳神功");
        strMap.put("赵敏", "郡主");
        strMap.put("张翠山", "打酱油");
        request.setAttribute("strMap", strMap);

    %>
    <%--  pageContext.findAttribute("name")  --%>
    ${name}<br>
    ${user.username}<br>
    <%-- strList.get(3) --%>
    ${strList[3]}<br>
    <%--  List<User> list = pageContext.findAttribute("usrList")
          User user = list.get(2)
          user.getUsername()
      --%>
    ${userList[2].username}<br>
    <%-- strMap.get("张无忌") --%>
    ${strMap["张无忌"]}
    -------------------------------------------------
    <!--EL获得Map<String, List<User>>的值-->
<% List<User> userList = new ArrayList<>();
    List<User> userList1 = new ArrayList<>();
    Map<String, List<User>> listMap = new HashMap<>();
    userList.add(new User(1, "欧阳锋"));
    userList.add(new User(2, "黄药师"));
    userList.add(new User(3, "洪七"));
    userList.add(new User(4, "张无忌"));
    listMap.put("map", userList);

    userList1.add(new User(5, "赵敏"));
    userList1.add(new User(6, "张翠山"));
    listMap.put("map2",userList1);

    request.setAttribute("pemap", listMap);
%>

<!-- [User{id=1, username='欧阳锋'}, User{id=2, username='黄药师'},
User{id=3, username='洪七'},User{id=4, username='张无忌'}]-->
${pemap.map}<br>

<!--User{id=1, username='欧阳锋'}-->
${pemap.map[0]}<br>

<!--欧阳锋-->
${pemap.map[0].username}<br>

<!--1-->
${pemap.map[0].id}<br>

${pemap.map2}<br>
${pemap.map2[1].username}<br>
${pemap.map2[1].id}<br>

路径中不加虚拟目录:
1.转发
2.errorPage
3.include中file属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值