Java-JavaWeb—(3)Web核心-Part2

1.会话技术

1.1会话概论

这里的会话,指的是web开发中的一次通话过程,当打开浏览器,访问网站地址后,会话开始,当关闭浏览器(或者到了过期时间),会话结束。

作用:需要在多次请求间实现数据共享,就可以考虑使用会话管理技术

会话管理分类:客户端会话管理技术和服务端会话管理技术。

客户端会话管理技术:把要共享的数据保存到了客户端(也就是浏览器端)。每次请求时,把会话信息带到服务器,从而实现多次请求的数据共享。

服务器会话管理技术:它本质仍是采用客户端会话管理技术,只不过保存到客户端的是一个特殊的标识,并且把要共享的数据保存到了服务端的内存对象中。每次请求时,把这个标识带到服务器端,然后使用这个标识,找到对应的内存空间,从而实现数据共享。

1.2客户端会话管理技术

1.2.1Cookie介绍

把要共享的数据保存到客户端。每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享!

作用:可以保护客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率!

1.2.2Cookie属性

属性名称属性作用是否重要
namecookie的名称必要属性
valuecookie的值(不能是中文)必要属性
pathcookie的路径重要
domaincookie的域名重要
maxAgecookie的生存时间。重要
versioncookie的版本号。不重要
commentcookie的说明。不重要

Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。同时,所有网站的cookie总数不超过300个。

当删除Cookie时,设置maxAge值为0。当不设置maxAge时,使用的是浏览器的内存,当关闭浏览器之后,cookie将丢失。设置了此值,就会保存成缓存文件(值必须是大于0的,以秒为单位)。

1.2.3Cookie方法

Cookie(String name,String value):构造方法创建对象

属性对应的set和get方法:赋值和获取值

HttpServletResponse中有方法向客户端添加Cookie:void addCookie(Cookie cookie)

HttpServletRequest中有方法可以获取所有的Cookie:Cookie[] getCookies()

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/servletDemo01")
public class ServletDemo01  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.通过响应对象写出提示信息
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = resp.getWriter();
        pw.write("欢迎访问网站,你的最后访问时间为:<br/>");

        //2.创建Cookie对象,用于记录最后访问时间
        Cookie cookie = new Cookie("time",System.currentTimeMillis()+"");

        //3.设置最大存活时间
        cookie.setMaxAge(3600);

        //4.将Cookie对象添加到客户端
        resp.addCookie(cookie);

        //5.获取Cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie1 : cookies) {
            if("time".equals(cookie1.getName())){
                //6.获取Cookie对象中的value
                String value = cookie1.getValue();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                pw.write(sdf.format(new Date(Long.parseLong(value))));
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req,resp);
    }
}

 1.2.4Cookie的Path细节

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
Cookie的路径限制
取自第一次访问的资源路径前缀
只要以这个为前缀,只要以这个为开头就能访问到
 */

@WebServlet("/aaa/servletDemo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建Cookie并添加
        Cookie cookie = new Cookie("username","zhangsan");
        cookie.setMaxAge(3600);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req,resp);
    }
}
package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/aaa//servletDemo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //2.获取Cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            if("username".equals(cookie.getName())){
                String value = cookie.getValue();
                resp.getWriter().write(value);
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req,resp);
    }
}
package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/aaa/bbb/servletDemo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //2.获取Cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            if("username".equals(cookie.getName())){
                String value = cookie.getValue();
                resp.getWriter().write(value);
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req,resp);
    }
}
package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/bbb/servletDemo05")
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //2.获取Cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            if("username".equals(cookie.getName())){
                String value = cookie.getValue();
                resp.getWriter().write(value);
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req,resp);
    }
}

在ServletDemo02中添加cookie,在03,04中可以获取到相应的Cookie,而05中无法获取。

由于02中添加的时候链接在/aaa/目录下,所以该目录的页面和子目录客服获取到cookie,而和它同级或者更高级的无法获取

1.3服务端会话管理概述

1.3.1HttpSession

本质也是采用客户端会话管理技术。

只不过在客户端保存的是一个特使表示,而共享的数据保存到了服务器端的内存对象中

每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享

它是Servlet规范中提供的一个接口。 该对象用于提供一种通过多个页面请求或访问网站来标识用户并存储有关该用户的信息的方法。简单说它就是一个服务端会话对象,用于存储用户的会话数据。

它也是Servlet规范中四大域对象之一的会话域对象。

域对象作用范围使用场景
ServletContext整个应用范围当前项目中需要数据共享时,可以使用此域对象。
ServletRequest当前请求范围在请求或者当前请求转发时需要数据共享可以使用此域对象。
HttpSession会话返回在当前会话范围中实现数据共享。它可以在多次请求中实现数据共享。

1.3.2HttpSession常用方法

void serAttribute(String name,Object value):设置共享数据

Object getAttribute(String name):获取共享数据

void removeAttribut(String name):移除共享数据

String getId():获取唯一标识名称

void Invalidate(): 让session立即失效

1.3.3HttpSession获取

HttpSession实现类对象是通过HttpServletRequest对象来获取的:

        HttpSession get Session():获取HttpSession对象

        HttpSession getSession(boolean create):获取HttpSession对象,未获取到是否自动创建

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取HttpSession对象
        String username = req.getParameter("username");

        //2.获取HttpSession的对象
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());

        //3.将用户名信息添加到共享数据中
        session.setAttribute("username",username);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求的用户名
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());

        //2.获取共享数据
        Object username = session.getAttribute("username");

        //3.将数据响应给浏览器
        resp.getWriter().write(username+"");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

 

1.3.4HttpSession细节 

浏览器上可以直接查看Cookie的值

 

 浏览器Cookie的禁用

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/*
Cookie的禁用
 */

@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取HttpSession对象
        HttpSession session = req.getSession();
        System.out.println(session);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

禁用后,再次获取Session是,获取不到Session,就自动创建了新的对象了

 解决方式一:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/*
Cookie的禁用
 */

@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取HttpSession对象
        HttpSession session = req.getSession(false);
        System.out.println(session);
        if(session==null){
            resp.getWriter().write("为了不影响正常的使用,请不要禁用浏览器的Cookie");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

解决方式二:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求的用户名
        String username = req.getParameter("username");

        //2.获取HttpSession的对象
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());

        //3.将用户名信息添加到共享数据中
        session.setAttribute("username",username);

        //实现url 重写 相当于在地址栏后面拼接了一个jsessionid
        resp.getWriter().write("<a href='"+resp.encodeURL("http://localhost/session/servletDemo03")+"'>go servletDemo03</a>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

 

钝化和活化

        钝化:把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上。

        活化:相反的状态

如何钝化:

        第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行持久化。

        ​ 第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行持久化

注意

        ​ HttpSession的持久化由服务器来负责管理,我们不用关心。

2.JSP

2.1介绍

JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。

类别适用场景
HTML只能开发静态资源,不能包含java代码,无法添加动态数据。
Servlet写java代码,可以输出页面内容,但是很不方便,开发效率极低。
JSP它包括了HTML的展示技术,同时具备Servlet输出动态资源的能力。但是不适合作为控制器来用。

2.2JSP的简单使用

index.jsp文件,不能通过浏览器直接查看,必须要通过服务器才可以

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>JSP</title>
  </head>
  <body>
    这是我的第一个jsp
  </body>
</html>

 

JSP的原理:​ 客户端提交请求

​ ——Tomcat服务器解析请求地址

​ ——找到JSP页面

​ ——Tomcat将JSP页面翻译成Servlet的java文件

​ ——将翻译好的.java文件编译成.class文件

​ ——返回到客户浏览器上。

JSP它是一个特殊的Servlet,主要是用于展示动态数据。它展示的方式是用流把数据输出出来,而我们在使用JSP时,涉及HTML的部分,都与HTML的用法一致,这部分称为jsp中的模板元素,在开发过程中,先写好这些模板元素,因为它们决定了页面的外观。

2.3语法

2.3.1注释

        <%--注释--%>

2.3.2Java代码块

        <% 此处写java代码 %>

2.3.3表达式

        <%=表达式%>

2.3.4声明

        <%! 声明的内容 %>


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--这是注释--%>
    <%
        out.println("1.Hello JSP<br/>");
        String str = "2.hello<br/>";
        out.println(str);
    %>
<%--    表达式,相当于对  out.println("Hello ") 的简化--%>
    <%="3.Hello<br/>"%>
<%--
jsp中的声明(方法)
加感叹号  代表的是声明成员变量
不加感叹号  代表的是声明局部变量
声明方法必须加感叹号
--%>
    <%! String s= "abc";%>
    <% String s= "abc";%>
    <%=s%>
</body>
</html>

 2.4JSP指令

        page指令:<%@page 属性名=属性值 属性名=属性值....%>

language:告知引擎,脚本使用的是java,默认是java,支持java。不写也行。

extends:告知引擎,JSP对应的Servlet的父类是哪个,不需要写,也不需要改。

import:告知引擎,导入哪些包(类)。

session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认是true。

buffer:JspWriter用于输出JSP内容到页面上。告知引擎,设定他的缓存大小。默认8kb。

errorPage:告知引擎,当前页面出现异常后,应该转发到哪个页面上(路径写法:/代表当前应用)

isErrorPage:告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception对象,打印异常的详细信息。默认值是false。

contentType:告知引擎,响应正文的MIME类型。contentType="text/html;charset=UTF-8"

​ 相当于response.setContentType("text/html;charset=UTF-8");

pageEncoding:告知引擎,翻译jsp时(从磁盘上读取jsp文件)所用的码表。pageEncoding="UTF-8"相当于告知引擎用UTF-8读取JSP

isEIgnored*:告知引擎,是否忽略EL表达式,默认值是false,不忽略。

<%@ page import="java.util.ArrayList" %>
<%--
    1.page指令
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="/error.jsp" %>
<%--
    2.include指令
--%>
<%@include file="include.jsp"%>
<html>
<head>
    <title>jsp指令</title>
</head>
<body>
    <% ArrayList list = new ArrayList();%>
    <%=s%>
</body>
</html>

2.5JSP中的细节

隐式对象名称类型备注
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
sessionjavax.servlet.http.HttpSessionPage指令可以控制开关
applicationjavax.servlet.ServletContext
pageJava.lang.Object当前jsp对应的servlet引用实例
configjavax.servlet.ServletConfig
exceptionjava.lang.Throwablepage指令有开关
outjavax.servlet.jsp.JspWriter字符输出流,相当于printwriter
pageContextjavax.servlet.jsp.PageContext

PageContext对象: 它是JSP独有的对象,Servlet中没有这个对象。本身也是一个域(作用范围)对象,但是它可以操作其他3个域对象中的属性。而且还可以获取其他8个隐式对象。

四大域对象:

域对象名称范围级别备注
PageContext页面范围最小,只能在当前页面用因范围太小,开发中用的很少
ServletRequest请求范围一次请求或当期请求转发用当请求转发之后,再次转发时请求域丢失
HttpSession会话范围多次请求数据共享时使用多次请求共享数据,但不同的客户端不能共享
ServletContext应用范围最大,整个应用都可以使用尽量少用,如果对数据有修改需要做同步处理

MVC模型:

M:model ,通常用于封装数据,封装的是数据模型。

V:view ,通常用于展示数据。动态展示用jsp页面,静态数据展示用html。

C:controller ,通常用于处理请求和响应。一般指的是Servlet。

3.EL表达式

3.1介绍

EL表达式,全称是Expression Language。意为表达式语言。

作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。

EL表达式的语法格式非常简单,写为:${表达式内容

3.2创建

<%--
  Created by IntelliJ IDEA.
  User: 戴尔
  Date: 2021/9/1
  Time: 15:51
  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>
    <%--1.向域对象中添加数据--%>
    <%request.setAttribute("username","zhangsan");%>

    <%--2.获取表达式--%>
    Java代码块:<% out.println(request.getAttribute("username"));%><br/>

    JSP表达式:<%=request.getAttribute("username")%><br/>

    EL表达式:${username}
</body>
</html>

3.3EL表达式获取数据

<%@ page import="servlet.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: 戴尔
  Date: 2021/9/1
  Time: 15: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>
    <%--1.获取基本数据类型--%>
    <% pageContext.setAttribute("num",10); %>
    基本数据类型:${num}<br/>
    <%--2.获取自定义对象类型--%>
    <%
        Student stu = new Student("张三",20);
        pageContext.setAttribute("stu",stu);

    %>
    自定义对象:${stu}<br/>
    学生姓名:${stu.name}<br/>
    学生年龄:${stu.age}<br/>
    <%--3.获取数组类型--%>
    <%
        String[] arr = {"Hello","work!"};
        pageContext.setAttribute("arr",arr);

    %>
    数组:${arr}<br/>
    0号数组:${arr[0]}<br/>
    1号数组:${arr[1]}<br/>
    <%--4.获取List集合--%>
    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        pageContext.setAttribute("list",list);
    %>
    List集合:${list}<br/>
    0元素集合:${list[0]}<br/>
    <%--5.获取Map集合--%>
    <%
        HashMap<String,Student> map = new HashMap<>();
        map.put("001",new Student("李四",20));
        map.put("002",new Student("王五",23));
        pageContext.setAttribute("map",map);
    %>
    Map集合:${map}<br/>
    第一个学生对象:${map.get("001")}<br/>
    第一个学生对象的姓名:${map.get("001").name}<br/>
    <%--1.向域对象中添加数据--%>
</body>
</html>

 3.4注意事项

EL表达式中没有空指针异常

EL表达式中没有索引越界异常

EL表达式中没有字符串拼接的效果

3.5EL表达式运算符

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: 戴尔
  Date: 2021/9/1
  Time: 17:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--empty运算符:
            它会判断:对象是否为null,字符串是否为空字符串,集合中元素是否是0个
        --%>
    <% String str = null;
        String str1 = "";
        List<String> slist = new ArrayList<String>();
        pageContext.setAttribute("str", str);
        pageContext.setAttribute("str1", str1);
        pageContext.setAttribute("slist", slist);
    %>
    ${empty str}============当对象为null返回true<br/>
    ${empty str1 }==========当字符串为空字符串是返回true(注意:它不会调用trim()方法)<br>
    ${empty slist}==========当集合中的元素是0个时,是true
    <hr/>
    <%--三元运算符
         条件?真:假
    --%>
    <% request.setAttribute("gender", "female"); %>
    <input type="radio" name="gender" value="male" ${gender eq "male"?"checked":""} >男
    <input type="radio" name="gender" value="female" ${gender eq "female"?"checked":""}>女
</body>
</html>

 

3.6EL使用细节

<%--
  Created by IntelliJ IDEA.
  User: 戴尔
  Date: 2021/9/1
  Time: 17:07
  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>
    <%--获取四大域对象中的数据--%>
    <%
        pageContext.setAttribute("username1","zhangsan");
        request.setAttribute("username2","zhangsan");
        session.setAttribute("username3","zhangsan");
        application.setAttribute("username4","zhangsan");
    %>
    ${username1}
    ${username2}
    ${username3}
    ${username4}<br/>

    <%--获取JSP中其他八个隐式对象--%>
    <%=request.getContextPath()%>
    ${pageContext.request.contextPath}
</body>
</html>

3.7 EL隐式对象

EL中的隐式对象类型对应JSP隐式对象备注
PageContextJavax.serlvet.jsp.PageContextPageContext完全一样
ApplicationScopeJava.util.Map没有应用层范围
SessionScopeJava.util.Map没有会话范围
RequestScopeJava.util.Map没有请求范围
PageScopeJava.util.Map没有页面层范围
HeaderJava.util.Map没有请求消息头key,值是value(一个)
HeaderValuesJava.util.Map没有请求消息头key,值是数组(一个头多个值)
ParamJava.util.Map没有请求参数key,值是value(一个)
ParamValuesJava.util.Map没有请求参数key,值是数组(一个名称多个值)
InitParamJava.util.Map没有全局参数,key是参数名称,value是参数值
CookieJava.util.Map没有Key是cookie的名称,value是cookie对象
<%--
  Created by IntelliJ IDEA.
  User: 戴尔
  Date: 2021/9/1
  Time: 17:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式11个隐式对象</title>
</head>
<body>
    <%--pageContext对象 可以获取其他三个域对象和JSP中八个隐式对象--%>
    ${pageContext.request.contextPath}<br/>

    <%--applicationScope seccionScope requestScope pageScope 操作四大域对象中的数据 --%>
    <% request.setAttribute("username","zhangsan"); %>
    ${username}<br/>
    ${requestScope.username}<br/>

    <%--header headerValues 获取请求头数据 --%>
    ${header["connection"]}<br/>
    ${headerValues["connection"][0]}<br/>

    <%--param paramValues 获取请求参数数据 --%>
    ${param.username}<br/>
    ${paramValues.hoppy[0]}<br/>
    ${paramValues.hoppy[1]}<br/>

    <%--initParam 获取全局参数配置 --%>
    ${initParam["pname"]}<br/>

    <%--cookie 获取cookie信息 --%>
    ${cookie}<br/><%--获取map集合 --%>
    ${cookie.JSESSIONID} <br/><%--获取map集合中的第二个元素 --%>
    ${cookie.JSESSIONID.name}<br/><%--获取cookie对象的名称 --%>
    ${cookie.JSESSIONID.value}<br/><%--获取cookie对象的数据值 --%>
</body>
</html>

 4.JSTL

4.1介绍

JSTL的全称是:JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。

这个也提供给开发人员一个标准通用的标签库。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,江都程序的维护难度。

组成作用说明
Core核心标签库。通用逻辑处理
Fmt国际化有关。需要不同地域显示不同语言时使用
FunctionsEL函数EL表达式可以使用的方法
SQL操作数据库。不用
XML操作XML。不用

4.2核心标签库

标签名称功能分类分类作用
<c:if>流程控制核心标签库用于判断
<c:choose> ,<c:when>,<c:otherwise>流程控制核心标签库用于多个条件判断
<c:foreache>迭代操作核心标签库用于循环遍历

5.Filter过滤器

5.1介绍

过滤器——Filter,它是JavaWeb三大组件之一,属于接口。另外两个是Servlet和Listener。

它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。

常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。

在程序中访问服务器资源是,当一个请求到来,服务器首先判断是否有过滤器与请求资源相关联,如果有,过滤器可以将请求拦截下来,完成一些特定的功能,再由过滤器决定是否交给请求资源。如果没有则像之前那样直接请求资源了。响应也是类似!

过滤器一般用于完成通用的曹祖,例如:登陆验证、统一编码处理、敏感字符过滤等等~~

5.2方法

void init(FilterConfig config):初始化方法

void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):对请求资源和响应资源过滤

void destroy():销毁方法

配置方式:注解,配置文件

FilterChain是一个接口,代表过滤器链对象。方法void doFilter(ServletRequest request,ServletResponse response),可以用来放行的操作。

5.3案例

5.3.1注解配置

package filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;


@WebFilter("/*")
public class FilterDemo01 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo01执行了....");

        //处理乱码
        servletResponse.setContentType("text/html;charset=UTF-8");

        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo01执行了...");
        //resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("servletDemo01执行了....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

 5.3.2配置文件

单个:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置过滤器-->
    <filter>
        <filter-name>filterDemo01</filter-name>
        <filter-class>filter.FilterDemo01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo01</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

多个:

先后顺序为filter-mapping的先后顺序

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置过滤器-->
    <filter>
        <filter-name>filterDemo01</filter-name>
        <filter-class>filter.FilterDemo01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo01</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>filterDemo02</filter-name>
        <filter-class>filter.FilterDemo02</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo02</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

 5.4生命周期

创建:当应用加载时实例化对象并致信发init初始化

服务:对象提供服务的过程,执行doFilter方法

销毁:当应用卸载时或服务器停止时对象销毁。执行dostroy方法

package filter;

import javax.servlet.*;
import java.io.IOException;


//@WebFilter("/*")
public class FilterDemo03 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("对象初始化成功.....");
    }

    /*
    提供服务
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo03执行了....");

        //处理乱码
        servletResponse.setContentType("text/html;charset=UTF-8");

        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    /*
    对象销毁
     */

    @Override
    public void destroy() {
        System.out.println("对象销毁了....");
    }
}

5.5FilterConfig对象

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置过滤器-->

    <filter>
        <filter-name>filterDemo04</filter-name>
        <filter-class>filter.FilterDemo04</filter-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo04</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
package filter;

import javax.servlet.*;
import java.io.IOException;
/*
FilterConfig过滤器配置对象的使用
 */

//@WebFilter("/*")
public class FilterDemo04 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("对象初始化成功.....");

        //获取过滤器名称
        String filterName = filterConfig.getFilterName();
        System.out.println(filterName);

        //根据name获取value
        String username = filterConfig.getInitParameter("username");
        System.out.println(username);
    }

    /*
    提供服务
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo04执行了....");

        //处理乱码
        servletResponse.setContentType("text/html;charset=UTF-8");

        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    /*
    对象销毁
     */

    @Override
    public void destroy() {
        System.out.println("对象销毁了....");
    }
}

5.6过滤器的五种拦截行为

Filter过滤器默认拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤,要想使用,就需要我们配置。

<!--配置过滤器-->
<filter>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>com.itheima.web.filter.FilterDemo1</filter-class>
    <!--配置开启异步支持,当dispatcher配置ASYNC时,需要配置此行-->
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <url-pattern>/ServletDemo1</url-pattern>
    <!--过滤请求:默认值。-->
    <dispatcher>REQUEST</dispatcher>
    <!--过滤全局错误页面:当由服务器调用全局错误页面时,过滤器工作-->
    <dispatcher>ERROR</dispatcher>
    <!--过滤请求转发:当请求转发时,过滤器工作。-->
    <dispatcher>FORWARD</dispatcher>
    <!--过滤请求包含:当请求包含时,过滤器工作。它只能过滤动态包含,jsp的include指令是静态包含-->
    <dispatcher>INCLUDE</dispatcher>
    <!--过滤异步类型,它要求我们在filter标签中配置开启异步支持-->
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>

6.监听器Listener

6.1观察者设计模式

观察者模式通常由以下三部分组成:

​ 事件源:触发事件的对象。

​ 事件:触发的动作,里面封装了事件源。

​ 监听器:当事件源触发事件时,要做的事情。一般是一个接口,由使用者来实现。

在程序中,我偶们可以对:对象的 创建。域对象中属性的变化。会话相关内容进行监听。

Servlet规范中共计8个监听器,监听器都是以接口形式提供,具体功能需要我们创建接口类才能完成

6.2监听对象的监听器

ServletContextListener:用于监听ServletContext对象的创建和销毁

方法:

        void  contextInitialized(ServletComnEvent sce):对象创建时执行该方法

        void contextDestroyed(ServletContextEvent sce):对象销毁时执行方法

ServletContextEvent代表事件对象,事件对象中封装了事件源,也就是ServletContext

HttpSessionListener:用于监听HttpSession对象的创建和销毁

方法:

        void sessionCreated(HttpSessionEvent se):对象创建时执行方法

        void sessionDestroyed(HttpsessionEvent se):对象销毁时执行该方法

HttpSessionEvent代表事件对象,事件对象中封装了事件源,也就是HttpSession,真正的事件指的是创建或销毁HTTP Session对象的操作。

ServletRequestListener:用于监听ServletRequest对象的创建和销毁

方法:

        void requesInitialized(ServletRequestEvent sre):对象创建时执行该方法

        void requestDestroved(ServletRequestEvent sre):对象销毁时执行该方法

ServletRequestEvent代表事件对象,事件对象中封装了事件源,也就是ServletRequest,真正的事件指的是创建或销毁ServletRequest对象的操作

6.3监听域对象属性变化的监听器

ServletContextAttributeListener:用于监听ServletContext应用域中属性的变化

方法:

        void attributeAdded(ServletContextAttributeEvent scae):域中添加属性时执行该方法

        void attributeRemoved(ServletContextAttributeEvent scae):域中移除属性时执行该方法

        void attributeReplaced(ServletContextAttributeEvent scae):域中替换属性时执行该方法

ServletContextAttributeEvent代表事件对象,事件对象中封装了事件源,也就是ServletContext,真正的事件指的是添加、移除、替换应用域中属性的操作

HttpSessionAttributeListener:用于监听HttpSession会话域中属性的变化

方法:

        void attributeAdded(HttpSessionBindingEvent se):域中添加属性时执行该方法

        void attributeRemoved(HttpSessionBindingEvent se):域中移除属性时执行该方法

        void arrtibuteReplaced(HttpSessionBindingEvent se):域中替换属性时执行该方法

HttpSessionBindingEvent代表事件对象,事件对象中封装了事件源,也就是HttpSession,真正的事件指的是添加、移除、替换会话域中属性的操作

ServletRequestAttributeListener:用于监听SevletRequest请求与中属性的变化

方法:

        void attributeAdded(ServletRequestAttributeEvent srae):域中添加属性时执行该方法

        void attributeRemoved(ServletRequestAttributeEvent srae):域中移除属性时执行该方法

        void attributeReplaced(ServletRequestAttributeEvent srae):域中替换属性时执行该方法

ServletRequestAttributeEvent代表事件对象,事件对象中封装了事件源,也就是ServletRequest,真正的事件指的是添加、移除、替换会话域中属性的操作

6.4监听会话相关的感知型监听器

HttpSessionBindingListener:用于感知对象和会话域绑定的监听器

方法:

        void valueBound(HttpSessionBindingEvent event):数据添加到会话域中(绑定)时执行该方法

        void valueUnbound(HttpSessionBindingEvent event):数据从会话域中移除(解绑)时执行该方法

HttpSessionBindingEvent代表事件对象,事件对象中封装了事件源,也就是HttpSession,真正的事件指的是添加、移除会话域中属性的操作

HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器

方法:

        void sessionWillPassivate(HttpSessionEvent se):会话域中数据钝化时执行该方法

        void sessionDidActivate(HttpSessionEvent se):会话域中数据活化时执行该方法

HttpSessionEvent代表事件对象,事件对象中封装了事件源,也就是HttpSession,真正的事件指的是会话域中数据钝化、活化的操作

6.5监听器的使用

package listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/*
    ServletContext对象的创建和销毁的监听器
 */
@WebListener
public class ServletContextListenerDemo implements ServletContextListener {
    //servletContext对象创建的时候执行此方法
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听到了对象的创建...");

        //获取对象
        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext);
    }
    //servletContext对象销毁的时候执行此方法
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听到了对象的销毁...");
    }
}

---------------------------------------------------------------------------------------------------------------------------------

内容有部分存在书籍、课堂、网络记录,如有雷同纯属巧合
 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值