JavaWeb知识点

目录

常见问题解决

1.解决请求和响应时的中文乱码

public class MServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决请求时的乱码
        req.setCharacterEncoding("utf-8");
		//解决响应时的乱码
        resp.setContextType("text/html;charset=utf-8");
    }

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

2.解决tomcat控制台中文乱码

在这里插入图片描述

在这里插入图片描述
然后重启IDEA

3.解决tomcat控制台中输出中文时的乱码

在这里插入图片描述

4.解决请求和响应时的中文乱码

//在servlet doGet方法中添加这两句话
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");

Maven

用于管理项目的工具。

如管理项目中所需的jar文件、打包项目等。

通过在Maven项目中加入某个jar文件所需的dependency(依赖),让其自动从Maven仓库中下载对应jar文件。

Maven依赖官网

地址https://mvnrepository.com/,在这个网站中查询所需的jar文件的依赖
在这里插入图片描述

Maven本地仓库

Maven默认的配置文件会从官网下载jar文件,速度较慢,并且下载的jar文件保存在c盘。

这里在D盘的根目录下新建了一个MavenRepository的本地仓库,用于保存下载后的jar文件,

设置国内镜像下载。

在这里插入图片描述

配置文件

<?xml version="1.0" encoding="UTF-8"?>


<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    
	<!--设置下载的Jar文件的保存目录-->
	<localRepository>D:\MavenRepository\maven_jar</localRepository>

	
	<mirrors>
        <!--设置国内阿里云下载镜像-->
		<mirror>
			<id>aliyunmaven</id>
			<mirrorOf>*</mirrorOf>
			<name>aliyun</name>
			<url>https://maven.aliyun.com/repository/public</url>
		</mirror>
	</mirrors>

</settings>

使用

  • 下载配置https://maven.apache.org/

在这里插入图片描述

  • 使用IDEA自带

    在新建项目时选择Maven项目即可,在设置中更改IDEA自带的Maven配置

在这里插入图片描述
在这里插入图片描述

Tomcat

由Apecha、Sun公司及其他公司和个人共同开发的web服务器。

免费、开源、轻量级、在中小型系统中普遍使用。

是学习和开发web项目的首选服务器。

下载

tomcat官网https://tomcat.apache.org/

根据jdk和操作系统选择合适的版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用

下载成功后无需安装,解压到某个盘下即可。
解压后的目录
在这里插入图片描述

目录说明
bin保存tomcat中的可执行文件,如启动tomcat的startup.bat文件等
conf保存tomcat的配置文件,如server.xml文件可以修改默认的8080端口
lib保存tomcat运行时所需的jar文件
logs保存tomcat运行时产生的日志文件
temp保存tomcat运行时产生的临时
webapps保存发布在tomcat上的应用程序
work保存tomcat运行时产生的编译文件

启动tomcat

打开bin目录下的startup.bat文件,tomcat启动后的默认端口号为8080。
在浏览器中输入localhost:8080或127.0.0.1:8080,即可进入tomcat默认启动页面。
该页面位于ROOT目录下,名为index.jsp,localhost:8080表示进入ROOT目录下访问index文件。
在这里插入图片描述

部署项目到tomcat中

将项目整个目录,保存到webspps下,在bin目录中打开startup.bat文件,等待启动成功后,
在浏览器中输入"localhost:8080/自定义项目目录名"或"127.0.0.1:8080/自定义项目目录名"访问。
如果将项目放在ROOT目录下,在启动定义一个index页面,就能直接省略自定义项目名,直接通过localhost:8080访问

修改本地hosts文件,设置默认本机ip127.0.0.1的域名

新建hosts文件,不要后缀名,替换系统中默认的hosts文件,然后可以通过xxx.com代替127.0.0.1

easyexcel

使用easyexcel实现读写excel文件

新建项目

在这里插入图片描述
设置Maven配置
在这里插入图片描述

导入所需依赖

在Maven依赖官网搜索easyexcel
easyexcel使用文档https://easyexcel.opensource.alibaba.com/
在这里插入图片描述
选择版本
在这里插入图片描述
复制依赖
在这里插入图片描述
粘贴到项目的pom.xml文件的dependencies标签中
普通Maven项目没有dependencies标签,需要自己编辑
在这里插入图片描述
pom文件更新后,需要刷新Maven,让其自动下载所需依赖

在这里插入图片描述

要读取的excel文件
在这里插入图片描述

编写实体类

属性上使用**@ExcelProperty(“列名”)**注解设置要读取的excel文件表头

/*
* 员工表对应实体类
* 这里省略
* get/set
* toString()
* 全参构造
* 无参构造
* */
public class Employee {
    @ExcelProperty("编号")
    private int id;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("性别")
    private String sex;
    @ExcelProperty("身份证")
    private String idcard;
    @ExcelProperty("部门")
    private String dept;
    @ExcelProperty("入职时间")
    private String joinDate;
    @ExcelProperty("电话")
    private String phone;
}

读excel

//要读取的文件,必须存在
File file = new File("C:\\Users\\Administrator\\Desktop\\员工信息.xlsx");

// EasyExcel.read(要读取的文件,要读取的实体类.class,PageReadListener对象,参数为一个lambda表达式).sheet().doRead();
//PageReadListener对象需要设置泛型为要读取的实体类型,lambda表达式参数为读取到的数据集合
EasyExcel.read(file, Employee.class, new PageReadListener<Employee>((emps) -> {
    for (Employee emp : emps) {
        System.out.println(emp);
    }
})).sheet().doRead();

写excel

//要写入的文件,可以不存在
File target = new File("d:\\employee.xlsx");

// EasyExcel.write(要写入的目标文件,要写入的实体类.class).sheet("表名").doWrite(要写入的数据集合)
EasyExcel.write(target, Employee.class).sheet("员工信息").doWrite(数据集合);

如何在IDEA中创建基于Maven的Web项目

1.新建webapp模板

在这里插入图片描述

2.在src目录下新建文件夹,之后在此创建java文件

在这里插入图片描述

选择main\java

在这里插入图片描述

3.修改项目中web.xml版本为4.0

打开项目结构
在这里插入图片描述

移除默认2.3版本的web.xml文件,移除后一定要apply应用,重新添加web.xml文件,选择4.0版本
在这里插入图片描述

4.配置tomcat服务器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.将项目部署在tomcat中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.启动项目

启动tomcat
在这里插入图片描述

默认启动成功后会自动打开浏览器访问项目,也可以通过
"localhost:8080/项目名"访问。
这里看到的页面,是web项目中自带的index.jsp文件
在这里插入图片描述

web资源目录结构

webapp下如果有index文件,访问项目后会自动访问index文件,如果没有名为index的文件,就会出现404,表示index页面不存在

项目上下文路径

域名+端口+项目名 称为项目上下文路径
如localhost:8080/web01就是项目上下文路径,可以理解为项目根目录webapp目录直接通过项目上下文路径访问,无需显式写出
在这里插入图片描述
更新了项目中的内容后,根据需要选择重启还是重新部署
在这里插入图片描述

修改项目编译时的jdk版本

修改web模块的jdk版本
在这里插入图片描述
修改当前项目的jdk版本
在这里插入图片描述

Servlet

Servlet表示Server+Applet,意味运行在服务器上的程序。是一个被动运行程序,每次请求都要执行。
BS结构客户端访问服务器端的流程
在这里插入图片描述

编写Servlet的步骤

1.在项目中导入Servlet所需依赖

在这里插入图片描述

<!-- servlet所需依赖 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

粘贴在pom.xml文件中的dependencies标签下

2.在项目的java目录下,新建一个类,继承HttpServlet,重写doGet和doPost方法

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

/*
 * 编写Servlet的步骤
 * 1.导入依赖
 * 2.创建一个类,继承HttpServlet,重写doGet和doPost方法
 * 3.在web.xml中设置访问该类的url映射
 * */
public class FirstServlet extends HttpServlet {
    //普通的控制台项目,需要主动运行main方法执行程序
    //web项目中的java程序,需要被动运行,在用户通过浏览器访问某个程序的url映射时执行

    /*
     * 当浏览器发送的是get类型的请求,执行这个方法
     * */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("get请求");
    }

    /*
     * 当浏览器发送的是post类型的请求,执行这个方法
     * */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("post请求");
    }
}

3.在web.xml文件下,配置Servlet

<?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">

    <!--xml是一个配置文件,属于一种标记语言,通过标签定义内容-->
    <!--声明Servlet-->
    <servlet>
        <!--servlet命名-->
        <servlet-name>firstServlet</servlet-name>
        <!--servlet类的全限定名(路径+文件名)-->
        <servlet-class>FirstServlet</servlet-class>
    </servlet>
    <!--定义Servlet的请求映射-->
    <servlet-mapping>
        <!--要映射的servlet名,与上方定义的servlet-name一致-->
        <servlet-name>firstServlet</servlet-name>
        <!--请求映射url,必须以/开头-->
        <!--之后通过项目上下文路径+该路径,就能访问FirstServlet类-->
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
</web-app>

复制资源的相对路径

在这里插入图片描述
在这里插入图片描述

启动tomcat,访问"localhost:8080/项目路径/first"即可访问自定义servlet类中的doGet方法

JSP

Java Server Pages

使用Java开发,运行在服务器上的页面,称为JSP。

JSP页面的后缀名为.jsp

由于最初由Servlet编写页面,会在Servlet中出现大量的HTML代码,使用极不方便,

由SUN公司主导推出JSP,在HTML页面中嵌入Java代码,简化了页面的编写过程,页面也成为动态页面。

JSP实际是一个java类,具体为一个Servlet,第一次访问某个JSP页面,相当于编译运行Servlet,所以会慢一些。

访问JSP的流程:编译对应的Servlet–>运行Servlet。

JSP的生命周期同Servlet。

使用JSP时,可以导入该依赖,在JSP中方便提示

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
    <scope>provided</scope>
</dependency>

JSP的组成

1.HTML元素*

2.Java脚本*

<%
	java代码;
%>

3.表达式*

用于在页面中输出变量或字符串。

无需分号。

<%=变量%>

4.注释

jsp注释在访问jsp时不会在浏览器中看到

html注释在访问jsp时会再浏览器中看到

<%--注释--%>

5.指令

<%@ 指令名 属性="值"%>
  • page指令
    • 用于设置当前页面的属性
  • include指令
    • 用于嵌入其他页面
  • taglib指令
    • 用于导入其他标签库

6.声明

可以在这里定义方法、全局变量等

<%! 
    void fun(){}
%>

7.动作

使用标签定义一些功能。

<jsp:单词></jsp:单词> 
//包含另一张页面
<jsp:include page="路径"></jsp:include> 

路径问题

绝对路径

完整路径

相对路径

  • /

    从项目根目录出发。即域名+端口号

  • ./

    从当前位置出发

  • …/

    退出当前目录后出发

如当前位于localhost:8080/shop/pages/index.html

在该页面中,如果使用

<img src='/xxx.jpg'>
表示访问localhost:8080/xxx.jpg

<img src='./xxx.jpg'>
表示访问localhost:8080/shop/pages/xxx.jpg

<img src='../xxx.jpg'>
表示访问localhost:8080/shop/xxx.jpg

跳转

HTML to HTML/JSP

<a href="另一个页面的路径">跳转</a>

<form action="另一个页面的路径">
    <input type="submit">
</form>

HTML to Servlet

<a href="某个servlet的URL映射">跳转</a>

<form action="某个servlet的URL映射">
    <input type="submit">
</form>

Servlet/JSP to Servlet/JSP/HTML

请求转发
request.getRequestDispatcher("目的路径").forward(request,response)
  • 使用请求转发跳转到目的地后,浏览器的地址栏是最初访问的路径
  • 可以在请求转发时,在request对象中保存数据,如request.getParameter()、request.setAttribute()
  • 在执行查询时,通常将查询后的结果保存在request对象中后,使用请求转发跳转到页面中

在这里插入图片描述

重定向
response.sendRedirect("目的路径");
  • 使用重定向跳转到目的地后,浏览器的地址栏是最终访问的目的地路径
  • 如果在重定向时使用request对象保存数据,后续无法获取保存的内容
  • 在执行增删改后使用重定向跳转到目的地,防止重复提交

在这里插入图片描述

跳转过程中传递参数

  • 由页面发送数据到servlet或jsp,通常使用表单元素或在某个URL后使用"?参数=值"方式提交参数,获取时使用request.getParameter(“参数”)获取

    <a href="xxxx?id=11">删除</a>
    
    <form action="xxxx" >
        <input type="hidden" name="id" value="11">
    </form>
    
    
    //返回值为String
    String str=request.getParameter("id");
    
  • 由servlet发送数据到页面,使用request.setAttribute(String str,Object obj)保存obj到请求对象中,命名为str,获取时使用request.getAttribute(String str)

    public class XXXServlet extends HttpServlet{
        protected void service(HttpServletRequest req,HttpServletResponse resp){
            List obj = new ArrayList();
            req.setAttribute("list",obj);
            req.getRequestDispatcher("xxx.jsp").forward(req,resp)
        }
    }
    
    <%
    	//返回值为Object类型
    	Object obj = request.getAttribute("obj");
    	List list = (List) obj;
    %>
    

Ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

任何的浏览器都支持ajax。通过原生的js使用ajax极不方便,这里使用jquery封装后的ajax使用。

使用

1.在页面中引入jquery文件

<script src="jquery文件路径"></script>

2.给某个节点绑定事件后使用ajax提交数据

<script>
	$("#btn").click(()=>{
        $.ajax({
            //访问的地址
            url:'URL地址',
            //提交的数据,以键值对的形式提交,也可以提交单个数据
            data:{
                id:123,
                op:"xxx"
            },
            //提交方式
            type:"post",
            //访问成功后的回调函数
            succuss:(res)=>{//res为访问URL地址后的返回值
                
            },
            //访问失败后的回调函数
            error:(res)=>{}
        });
    });
</script>

EL

Expression Language 表达式语言

是为了使JSP中的输出写起来更加简便,替换JSP中的<%=%>,即表达式。

主要输出保存在某个作用域中的数据。

特点

  • 减少代码(获取对象、转换对象、获取对象属性)

    • 如果通过"某个作用域对象.setAttribute(String str,Object obj)"方法保存的对象,

      在JSP页面中,如果用表达式,写为<%=str>;如果使用EL,写为${str}。

      会依次从pageContext–>request–>session–>application中获取指定对象,如果一旦从某个作用域中获取到了对象,就不再判断后续作用域。

      也可以指定从某个作用域中获取对象,如${session.str}表示从session作用域中获取对象。

  • 免去非空判断

    • 如果要使用的某个对象不存在,不会输出null,而是输出空字符串""

使用

1.获取保存在作用域中的对象

  • 获取保存在某个作用域中的对象:${对象名}

  • 从指定的作用于中获取对象

    作用域单词对应作用域代码
    pageScope当前页pageContext${pageScope.对象}
    requestScope请求request${requestScope.对象}
    sessionScope会话session${sessionScope.对象}
    applicationScope项目application${applicationScope.对象}
  • 输出对象的属性

    ${对象名.属性名}   
    ${对象名["属性名"]}    
    
    要保证该属性有对应的get方法    
    
  • 输出对象的方法返回值

    ${对象名.方法名()}   
    
举例
//在servlet中,将一个集合保存在请求对象request中
//Person有name、sex和age属性
Person p1 = new Person("a","男",20);
Person p2 = new Person("b","男",20);
Person p3 = new Person("c","女",20);
List list = new ArrayList();
list.add(p1);
list.add(p2);
list.add(p3);
req.setAttribute("list",list);

使用请求转发跳转到页面中

<!--传统JSP中的表达式-->
<%
List list = (List)request.getAttribute("list");
//需要获取、转换后才能遍历使用
%>
<table>
    <%
    for(Object obj in 集合){
        %>

    <td><%=obj.get属性()%></td>

    <%
    }
    %>
</table>


<!--使用EL和JSTL后-->
<table>
    <c:forEach items="${list}" var="p">
        <!--使用EL-->
        <td>${p.name}</td>>
        <td>${p.sex}</td>>
        <td>${p.age}</td>>
    </c:forEach>
</table>

2.用户获取当前项目上下文路径(根目录+项目名)

如http://localhost:8080/book_shop是一个项目上下文路径。

在JSP中使用**${pageContext.request.contextPath}**获取项目上下文路径

<form action="${pageContext.request.contextPath}/book?op=xxx"></form>

<a href="${pageContext.request.contextPath}/book?op=xxx"></a>

<img src="${pageContext.request.contextPath}/pages/imgs/xxx.jpg">

<script>
	$.ajax({
        url:"${pageContext.request.contextPath}/book?op=xxx"
    });
</script>

3.在页面中获取请求中携带的参数

可以使用EL获取表单提交或地址中?后传递的数据

使用**${param.参数}**表示request.getParameter(“参数”)方法获取的数据

<form action="xxx.jsp">
    <input type="text" name="username">
    <input type="submit">
</form>

<a href="xxx.jsp?username=admin"></a>

在xxx.jsp中

${param.username}获取提交的数据

注意

  • web.xml版本在4.0之后,在JSP中使用EL时,默认可以识别。

  • 如果JSP中无法识别EL,原样输出${}符号时,在指令(<%@ %>)中加入 isELIgnored=“false” 表示不忽略EL

    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
    
  • 如果在使用EL的过程中,出现PropertyNotFoundException异常,表示未发现指定属性,原因有

    • 缺少指定属性
    • 指定属性没有对应的get方法

JSTL

Java Server Page Standarded Tag Library JSP标准标签库

可以使用JSTL中的特定标签,来替换JSP中常见的java代码,如循环判断等。减少JSP中的java代码,提高页面的可读性。

使用

  • 导入jstl依赖

    <!-- jstl -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    
  • 在JSP页面中,加入标签库指令

  <!--在当前页面中使用jstl,以c为标签前缀-->
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

这句话可以在使用循环时自动生成

  • 具体使用

    • 定义变量或给变量赋值

      <c:set var="变量名" value=""></c:set>
      <c:set var="name" value="admin"></c:set>
      
    • if判断

      <c:if test="判断条件">
      	满足时执行
      </c:if>
      
      session.setAttribute("user",用户对象);
      
      <c:if test="${empty user}">
      	<span>请登录</span>
      </c:if>
      
      <c:if test="${!empty user}">
      	<span>${user.username}</span>
      </c:if>
      
    • 遍历List集合

      //如在servlet中,将查询到的集合保存在request对象中
      request.setAttribute("list",查询到的集合)
      <table>
          <!--<c:forEach items="要遍历的集合" var="遍历出的每个对象">-->
          <c:forEach items="${list}" var="obj"> 
              <tr>
                  <td>${obj.属性}</td>
              </tr>
          </c:foreach>
      </table>
      
    • 遍历Map集合

      <%
          HashMap<String,String> hm = new HashMap();
          hm.put("yyds","永远单身");
          hm.put("awsl","阿伟死了");
          hm.put("u1s1","有一说一");
          application.setAttribute("hm",hm);
      %>
      <c:forEach items="${hm}" var="kv">
          <%--${键值对.key} 获取键   ${键值对.value} 获取值   --%>
          <h2>${kv.key}--${kv.value}</h2>
      </c:forEach>
      

使用JSTL和EL输出购物车中的信息

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.hqyj.book_shop.util.Cart" %>
<%@ page import="com.hqyj.book_shop.entity.BookInfo" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }

            body {
                background-color: #f5f5f5;
            }

            .main {
                width: 1240px;
                height: 628px;
                margin: 20px auto 20px;
                background-color: #fff;
            }

            table {
                float: left;
                width: 600px;
                margin-top: 50px;
                margin-left: 320px;
                border-collapse: collapse;
            }

            th, td {
                width: 120px;
                height: 20px;
                border: 1px solid skyblue;
            }
        </style>
    </head>
    <body>
        <jsp:include page="top.jsp"></jsp:include>
        <div class="main">
            <table>
                <tr>
                    <th>图书编号</th>
                    <th>图书名称</th>
                    <th>图书单价</th>
                    <th>购买数量</th>
                    <th>小计</th>
                    <th>操作</th>
                </tr>
                <c:if test="${empty cart.getCart()}">
                    <tr>
                        <td colspan="6">当前购物车中无商品</td>
                    </tr>
                </c:if>
                <c:if test="${!empty cart.getCart()}">
                    <%--定义变量表示总合--%>
                    <c:set var="sumPrice" value="0"></c:set>
                    <c:forEach items="${cart.getCart()}" var="kv">
                        <tr>
                            <td>${kv.key.bookId}</td>
                            <td>${kv.key.bookName}</td>
                            <td>${kv.key.bookPrice}</td>
                            <td>${kv.value}</td>
                            <%--el中可以使用算术运算--%>
                            <td>${kv.key.bookPrice*kv.value}</td>
                            <td>
                                <a href="${pageContext.request.contextPath}book?op=remove&bookId=${kv.key.bookId}">移除</a>
                            </td>
                            <%--每次循环将小计累加到总价中--%>
                            <c:set var="sumPrice" value="${sumPrice + kv.key.bookPrice * kv.value}"></c:set>
                        </tr>
                    </c:forEach>
                    <tr>
                        <td colspan="4">总计</td>
                        <td>${sumPrice}</td>
                        <td><a href="${pageContext.request.contextPath}/book?op=clear">清空购物车</a></td>
                    </tr>
                </c:if>
            </table>
        </div>
    </body>
</html>

JSP内置对象

在JSP中,可以不用定义,就能直接使用的对象,称为内置对象。

一共有9个内置对象

“rrppsoace”

  • pageContext

    作用域对象,当前页面作用域。

  • request

    作用域对象,请求作用域。

  • session

    作用域对象,会话作用域。

  • application

    作用域对象,项目作用域。

  • response

    响应对象

  • out

    输出对象,相当于Servlet中的response.getWriter()方法的返回值对象

  • page

    表示当前页面自身对象,相当于servlet中的this

  • config

    配置对象,获取servlet的配置信息

  • exception

    异常对象,只能使用在有isErrorPage="true"声明的jsp页面中,用于获取异常对象

Session和Cookie

session

session称为会话,是一个作用域,使用session.setAttribute()保存数据,使用session.getAttribute()获取数据。

默认session会话有效期为30分钟,可以更改,超时或关闭浏览器,session失效。

保存在session中的数据,可以在同一个站点下的不同页面中共享。

session共享数据的原理

  • 访问任意JSP页面时,默认都会创建一个JSESSIONID(可以取消自动创建),是一段session编号,保存在一个cookie文件中

    <%--所有jsp页面中,默认开启了session--%>
    <%@ page session="true"%>
    
    <%--让页面默认不使用session--%>
    <%@ page session="false"%>
    

    自动生成的cookie文件信息,可以看出,随着浏览器关闭,session到期
    在这里插入图片描述

  • 再次访问该页面时,会查询JSESSIONID是否存在,如果存在,直接使用,如果不存在,重新创建新的JSESSIONID

  • 保存该JSESSIONID的cookie文件,有效期为浏览会话结束。所以关闭浏览器,session失效

session对象常用方法

常用方法说明
getAttribute(String str)获取session中保存的数据,返回值为Object类型
setAttribute(String str,Object obj)将obj保存在session中,命名为str
removeAttribute(String str)移除保存在session中的对象str
invalidate()销毁session
getId()获取JSESSIONID
getMaxInactiveInterval()获取session有效时长,单位为秒,默认为1800
setMaxInactiveInterval(int second)设置session有效时长,单位为秒
getCreationTime()获取session创建时间,返回值为时间毫秒
getLastAccessedTime()获取最后一次访问session的时间,返回值为时间毫秒

设置项目全局session有效时长

在web.xml文件中设置,单位为分钟

<!--设置项目中所有session的有效时长,单位分钟-->
<session-config>
    <session-timeout>5</session-timeout>
</session-config>

cookie

cookie是一个用于保存数据的对象,实际是一个保存在客户本地的文件。关闭浏览器,cookie依然存在。手动清理或自动超时清理后,数据随之消失。

cookie通常用于更久地保存数据,即便关闭浏览器,也能一直存在。如登录信息、购物车信息等

cookie中保存的数据有上限(4kb),

cookie在浏览器中保存的数量也有上限(30~300根据浏览器不同略有变化)。

创建cookie

//Cookie(String name,String value);
Cookie ck = new Cookie("str","hello");
//设置有效时长,单位为秒,如果不设置,关闭浏览器,cookie失效
ck.setMaxAge(7*24*3600);//7天

保存cookie

response.addCookie(ck);

遍历cookie

Cookie[] cks = request.getCookies();
for(Cookie ck : cks){
    ck.getName();//获取name
    ck.getValue();//获取value
}

session和cookie的对比

  • session中保存的数据可以是任意类型,没有大小限制;cookie中保存的是键值对,单个值大小上限为4kb

  • session中保存的数据存在服务器中,cookie中保存的数据存在浏览器中。

  • session到期或随着浏览器关闭而失效,cookie如果设置了有效时长,即使关闭浏览器也会存在,在到期或手动清理时失效

过滤器Filter

是一个特殊的servlet

在这里插入图片描述

使用

1.新建一个类,继承HttpFilter

2.重写doFilter()方法,设置过滤条件

package com.hqyj.book_shop.filter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
 * 自定义过滤器
 * 1.创建一个类,继承HttpFilter
 * 2.重写受保护的doFilter方法
 * 3.配置过滤器
 * */
public class MyFilter extends HttpFilter {

    @Override
    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
        //获取当前访问的uri(地址)
        String uri = req.getRequestURI();
        System.out.println(uri + "访问过滤器");
        //如果登录成功后,session会保存customer。
        //过滤器中判断当前session中是否存在customer
        if (req.getSession().getAttribute("customer") != null) {
            chain.doFilter(req, res);
            return;
        }
        //如果session中没有customer,只能放行登录、注册页及其相关静态资源和customer模块
        if (uri.contains("html")  || uri.contains("jquery")|| uri.contains("customer")) {
            chain.doFilter(req, res);
        }else{
            //否则跳转登录页
            res.sendRedirect("http://localhost:8080/book_shop/pages/login.html");
        }
    }
}

3.配置过滤器,过滤一切请求

<!--声明一个过滤器-->
<filter>
    <!--过滤器名,无限制-->
    <filter-name>myFilter</filter-name>
    <!--过滤器类全限定名-->
    <filter-class>com.hqyj.book_shop.filter.MyFilter</filter-class>
</filter>
<!--配置过滤器映射-->
<filter-mapping>
    <!--过滤器名,与上方对应-->
    <filter-name>myFilter</filter-name>
    <!--过滤一切请求-->
    <url-pattern>/*</url-pattern>
</filter-mapping>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值