javaweb笔记

web访问的一个流程

1浏览器发送一个请求到服务器,去请求所需要的相关资源

2资源分为动态资源和静态资源,动态资源可以使用java代码按照servlet和jsp的规范编写的内容

3在java代码可以进行业务处理 也可以从数据库中读取数据

‘4拿到数据后,把数据交给html 页面进行展示,再结合css和javascript让展示效果更好

5服务端将静态资源响应给服务器

6浏览器将对这些资源进行解析

7解析后将效果展示在浏览器中,用户就可以看到最终结果。

http

超文本传输协议

请求数据的格式

三部分 请求行 请求头 请求体

请求行 http的第一行数据,请求行包括三块内容 分别是 GET请求方式/请求路径 HTTP/1.1[HTTP协议及版本]

请求头 第二行开始,格式为key:value形式

请求头中会包含若干个属性

host 请求主机名 user—agent 浏览器版本 accept标识浏览器能接受的资源类型

请求体 post请求的最后一部分,存储请求参数

username=superbaby&password=123456;

post和get之间有什么区别?

get请求 请求参数在请求行中即在第一行数据中。没有请求体 post请求请求参数在请求体中

get请求请求参数大小有限制,post没有

相应状态码

200 ok 客户端请求成功

404 Not Found 请求资源不存在

500 服务器发生不可预期的错误

tomcat服务器

开源免费的轻量级web服务器,支持servlet/jsp少量的javaEE规范

bin 可执行文件存放目录 conf 配置文件存放目录 lib tomcat依赖的jar包

logs 日志文件 temp临时文件 webapps 应用发布目录 work 工作目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lMX2Pf97-1689816134560)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230226175703857.png)]

解决中文乱码问题

conf/logging.prooperties 将utf-8 改为GBK;

可以修改端口号 在conf目录下 server.xml

默认的端口号是80

一闪而过是因为 JAVA_HOME 环境变量是否配置正确

一般javaweb项目会被打包成 war 包 让后将war包放到webapps目录下,tomcat会自动解压缩war文件

maven创建web项目

web项目的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvQvHwpy-1689816134561)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230226180247302.png)]

部署web项目

maven的使用

按 alt +insert 快速导入maven坐标

maven 在setting.xml 文件中引入阿里云的镜像文件可以快速构建项目

用骨架创建webapp项目

创建maven项目 选择apq的webapp,然后再补目录;

idea使用tomcat

用tomcat Maven插件 在pom文件里面进行修改

<build> <plugins> <!--Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>

servlet

javaweb最为核心的内容 ,它是java提供的一门 动态web开发资源

导入servlet依赖坐标

 javax.servlet javax.servlet-api 3.1.0  provided 

重写servlet中的方法,在service方法中打印hello world

启动tomcat 服务器,控制面板上会打印出hello world ;

Requst和Response

requst请求对象 response 是响应对象

服务器发送http请求到后台服务器 http请求中包含很多请求数据

后台服务器tomcat 会对http请求中的数据进行解析并把解析结果存入到一个对象中 所存入的对象即为requst对象 ,可以从requst对象中获取请求的相关参数

获取到参数数据后可以积雪后续的业务,比如获取用户名和密码,就可以实现登录操作

response

设置响应数据 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据,把响应数据封装到response对象中,后台服务器会解析response对象,按照相应行+响应头+响应体的格式拼接结果,浏览器最终解析结果,把内容展示再浏览器给用户浏览

requst对象

获取请求数据

requst对象 是存储http携带的数据[请求行+请求头+请求体]

requst继承体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-otIjk7Fn-1689816134561)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230226194458322.png)]

servletRequst 和HttpServletRequst 是继承关系,并且两个都是接口,接口是无法创建对象

request 继承了requstfacade

实现类 两个接口

Request的继承体系为ServletRequest–>HttpServletRequest–>RequestFacade

Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法

使用request对象,可以查阅JavaEE API文档的HttpServletRequest接口中方法说明

requst获取数据

获取请求行

请求行包括三块内容 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SB0H7rJR-1689816134562)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230226200408930.png)]

获取请求方式 GET

String getMethod()

获取虚拟目录(项目访问路径) /requst-demo

String getContextPath()

获取url (统一资源定位符)http://localhost:8080/request-demo/req1

String getRequstURL()

获取uri 统一资源标识符 /request-demo/req1

String getRequestURI()

获取请求参数(GET方式): username=zhangsan&password=123

String getQueryString()

获取请求头的数据
String agent = req.getHeader("user-agent"); System.out.println(agent);
获取请求体数据

浏览器在发送get请求的时候是没有请求体的,所以需要把请求方式变更为post

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TliL9Au2-1689816134562)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227183235359.png)]

两种方法

一个是获取字节流 如果发送的是字节数据,比如文件数据等

ServletInputStream getInputStream() 该方法可以获取字节
    

获取字符输入流,如果前端发送的是纯文本数据

BufferedReader getReader()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J37JoSnO-1689816134563)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227183551006.png)]

获取请求参数的方式

登录案例来说,就是用户名和密码是请求参数

请求数据 包括三个部分

请求参数是请求数据中的部分,get请求在请求中,post请求在请求体中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FHu2U4Fs-1689816134563)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227183836801.png)]

获取请求参数的方法

1根据不同的请求方式获取请求参数

2把获取到的内容进行分割

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y2c6BXE9-1689816134564)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227184022820.png)]

3把分割后的数据存入到map集合中去

因为参数的值可能是一个也可能多个,所以map的值为String数组

获取所有map集合

Map getParameterMap()

根据名称获取参数值(数组)

String[] getParameterValues(String name)

根据名称获取参数值(单个值)

String getParameter(String name)
  System.out.println("get...");
        //获取所有的map集合
        Map<String,String[]> map =req.getParameterMap();
        for (String key:map.keySet()){
            System.out.print(key+":");
            String [] values=map.get(key);

            for (String value:values){
                System.out.print(value+" ");
            }
            System.out.println();
        }
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTm6gBo1-1689816134565)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227185301787.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ucckIUYf-1689816134565)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227185313714.png)]

第三种方式用的多一些

POST请求乱码问题的解决

post请求参数是通过requst的getReader()获取流中的数据

tomcat 在获取流时是采用的编码iso-8859-1,是不支持中文的

设置字符输入流,设置的字符集要和页面保持一致

request.setCharacterEncoding("UTF-8");

GET请求解决方案

username = new String(username.getBytes(ISO_8859_1),UTF_8) ;
//前面的参数是对乱码数据进行编码,转为字节数组
//后面的参数 是字节数组解码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Vt31GVC-1689816134566)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227194456299.png)]

tomcat8.0之后,已经将get请求乱码问题解决

requst转发请求

浏览器发送请求给服务器,服务器中对应的资源A接收到请求

资源A处理完请求后发送给资源B,资源B处理完请求后将结果响应给浏览器

请求a-b的过程叫请求转发

req.getRequestDispatcher("资源B路径").forward(req,resp);

请求转发之间可以共享数据,使用requst对象

从a-b如何将资源传递,需要用到request对象提供的三个方法

数据存储到request中去

void setAttribute(String name,object o);

根据ket获取值

Object getAttribute(String name);

根据key删除该键值对

void removeAttribute(String name);

response 响应

用来相应数据

HTTP相应数据分为三个部分 分别是 响应行 响应头 响应体

响应行

比较常用的就是 状态码 void setStatus(int sc) ;

响应头

 void setHeader(String name,String value); 

响应体

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QapBpR7L-1689816134566)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227180023574.png)]

对于响应体,通过字符,字节输出流的方式往浏览器写

获取字符输出流

PrintWriter getWriter();

获取字节输出流

ServletOutputStream getOutputStream();

response重定向

一种资源的跳转 浏览器发送请求给服务器,服务器中对应的资源A接受到请求

资源A现在无法处理该请求,就会给浏览器响应一个302状态码 +location 的一个访问资源b的路径

// 直接跳转 
resposne.sendRedirect("/request-demo/resp2")

//重定向的特点

浏览器地址栏路径发生变化

当进行重定向,由于浏览器发送的两次请求,所以地址会发生变化

可以重定向到任何位置的资源(服务内容,外部均可·) 跳转到任何的网站

   resp.sendRedirect("https://www.baidu.com/");
//直接跳转百度网站 

两次请求 ,不能再多个资源使用request共享数据

因为浏览器发送了两次请求,是两个不同的requst对象,就无法通过requst对象进行共享数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6VoxIOZ-1689816134567)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227181645857.png)]

至于用到那个,是由业务决定的 ;

路径问题

转发请求路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aMhvyP0D-1689816134567)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227195230870.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yo1puigd-1689816134568)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227195241636.png)]

response响应字符数据

将字符数据写回浏览器需要两个步骤

通过response获取字符输出流 PrintWriter writer = resp.getWriter()

通过字符输出流写数据 writer.write(“aaa”);

返回中文字符串

//设置响应的数据格式及数据的编码 

response.setContentType("text/html;charset=utf-8"); 

writer.write("你好");

response响应字节数据

获取字节输出流

 ServletOutputStream outputStream =

resp.getOutputStream();

通过字节输出流写数据 outputStream.write(字节数据);

//返回一个图片文件到浏览器中去
 //读取文件 
        FileInputStream fis=new FileInputStream("C:\\Users\\周鑫\\Desktop\\母校行访问活动ppt\\QQ图片20230114201139.jpg");
        //获取response字节输出流
        
        ServletOutputStream outputStream = response.getOutputStream();
        //进行流的copy
        byte[] buff=new byte[1024];
        int len=0;
        while ((len=fis.read(buff))!=1){
            outputStream.write(buff,0,len);

        }
        fis.close();

优化代码

//引入坐标
<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.6</version> 
    </dependency>
    
  调用工具类方法
//fis:输入流 
 //os:输出流 
 IOUtils.copy(fis,os);
//直接一行代码搞定,前一个是输入流,后一个是输出流;

IOUtils.copy(fis,outputStream);

小练习 用户登录和用户注册功能

登录页面制作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbABXwxK-1689816134568)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227201045096.png)]

静态html页面 ——> loginservlet ——>usermapper ——>DB

静态页面

由css html 组成的静态页面

做准备 环境·

1.相应的html页面,静态页面的准备

2创建数据库,创建表,创建一个javabeanUser实体类

3配置pom.xml中的mybatis坐标和mysql坐标

 2 org.mybatis 3 mybatis 4 3.5.5 5  67  8 mysql 9 mysql-connector-java 10 5.1.34 11 

4创建mybatis—config.xml核心配置文件

UserMapper.xml映射文件 UserMapper 接口 两个放在相同的目录下面

5最终代码的实现

5.1在UserMapper 接口中提供一个根据用户名和密码查询用户对象的方法

使用的是注解开发

@Select("select * from tb_user where username = #{username} and password = #{password}")  
User select(@Param("username") String username,@Param("password") String password);

@parar注解的作用 用于传递参数,是方法的参数可以与sql中的字段名相对应

5.2修改login的代码 修改 from action 访问的地址

5.3编写loginServlet

//1接受用户名和密码 
String username = request.getParameter("username"); 

  String password = request.getParameter("password");
 

//2  mybatis应操作化过程

//3 获取字符输出流,设置content type 
//判断user是否为null 
if(user!=null){
      //登陆成功
      writer.write("登陆成功");}
else { 
    // 登陆失败
    writer.write("登陆失败");  }  }

用户注册的功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RH6Jy23O-1689816134568)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227201145349.png)]

用户填写用户名 密码等信息,点击注册按钮,提交到RegisterServlet

mybatis固定代码

//获取核心配置文件
 String resource="mybatis-config.xml";
//加载核心配置文件
 InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlsessionFactory对象
 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sql对象
 SqlSession sqlSession = sqlSessionFactory.openSession();
//调用mapper
 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//得到了usermapper代理对象
//后面再进行相应的事务处理

代码编写

1在usermapper中编写用户查询和用户添加方法

2修改register.html

3创建登录类

3.1 接受用户数据

String username =req.getParameter("username");
        String password =req.getParameter("password");

3.2封装用户对象

User user =new User();
user.setUsername(username);
user.setPassword(password);

3.3调用mapper类

3.4调用方法

User u = userMapper.selectByusername(username);

判断用户对象

if(u==null){
用户名不存在 就添加用户
userMapper.add(user);
        resp.getWriter().write("恭喜你注册成功,您的账号为"+username+"密码为"+password);
            //提交事务
            sqlSession.commit();
            sqlSession.close();
}else{
用户名存在,给出提示信息
resp.setContentType("text/html;charset=utf-8");
 resp.getWriter().write("用户名已经存在");
}
创建sqlsessionfactory优化

重复代码 工厂对象不用创建多次

用静态代码块,抽取一个工具类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bgooD2Ae-1689816134569)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227203316065.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RYfe3tU4-1689816134569)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227203323281.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ql64Vxx2-1689816134569)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230227203331796.png)]

会话技术 cookie 和session

会话 就是浏览器和服务器进行的连接过程

共享数据 购物车

验证码 生产验证码和输入验证码点击注册也是两次请求,这两次的请求要进行对比,相同则允许注册,不相同拒绝注册

浏览器和浏览器之间使用的http请求来进行数据传输的,**Http协议是无状态的,**每次浏览器向服务器请求时,服务器都会将该请求视为新的请求

客户端会话跟踪技术 cookie 存储在浏览器里面

服务端会话跟踪技术 session 服务器里面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-82gy8zJh-1689816134570)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230301184323081.png)]

cookie的基本使用

发送cookie 和获取cookie 打开浏览器cookie查询的方式

设置里面 cookie和网站权限 找到查询所有的cookie数据

创建 cookie

//创建cookie对象
        Cookie cookie =new Cookie("username","zs");

        resp.addCookie(cookie);

获取cookie 以数组的形式获取

// 获取cookie数组
        Cookie [] cookies =req.getCookies();

        for (Cookie cookie :cookies){
            String name =cookie.getName();
            if("username".equals(name)){
                String value=cookie.getValue();
                System.out.println(name+":"+value);
                break;
            }
        }

cookie原理分析

cookie是基于http协议的,设计到http协议中的两个请求头信息

响应头 set -cookie

请求头 cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnv23UnW-1689816134570)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230301190611797.png)]

cookie存活的时间

当浏览器关闭时,内存释放,有些需求就无法实现了

持久化存储

SetMaxAge(int seconds)

参数值

正数 将cookie写入浏览器所在的电脑硬盘,持久化存储,到时间自动删除

负数 默认值 cookie在当前浏览器内存中,当浏览器关闭,cookie被销毁

零 删除对应的cookie

cookie.setMaxAge(606024*7); 一周7天

cookie存储中文会出现问题;不能直接存储中文

解决方案

对a中的中文进行url编码,采用URLEmcoder.encode(),将编码后的值存放在cookie中

在b中获取cookie的值,获取的值为url编码后的值

将获取的值进行url解码,采用URLDecoder.decode() 就可以获取到对应的中文值

  String value ="张三";
        value= URLEncoder.encode(value);

        System.out.println("存储数据"+value);
        
        Cookie cookie =new Cookie("username",value);
        //发送cookie 和response
        resp.addCookie(cookie);
        
         Cookie [] cookies =req.getCookies();

        for (Cookie cookie :cookies){
            String name =cookie.getName();
            if("username".equals(name)){
                String value=cookie.getValue();
                //进行解码
                value = URLDecoder.decode(value,"UTF-8");

                System.out.println(name+":"+value);
                break;
            }

小结

存活时间 setMaxaAge()api的使用

存储中文 需要掌握URL编码和解码的使用

Session

服务端会话跟踪技术 将数据保存到服务端的

存储在客户端的数据容易被窃取和截获,存在很多不安全的因素

存储在服务端的数据相比于客户端来说更安全

基本的使用

session 使用的是requst对象

 HttpSession session =req.getSession();

session对象提供的功能

//将数据存储到session域中去
void setAttribute(String name ,object o);
根据key值获取值
Object getAttribute (String name);
根据key 删除该键值对
void removeAttribute(String name)

代码

 //获取session对象
        HttpSession session =req.getSession();

        //存储数据
        session.setAttribute("username","zs");


 HttpSession session=req.getSession();

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

        System.out.println(username);
    }

原理分析

使用细节

第一个 钝化和活化

session正常关闭和启动 session中的数据是可以被保存下来的

具体原因就是 Session的钝化和活化

钝化:在服务器正常关闭后,Tomcat 会自动将Session数据写入硬盘的文件中

活化 :再次启动服务器,从文件中加载数据到Session中

小结

session数据存储在服务端,服务器重启后,session数据会被保存

浏览器被关闭启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新

的对象

session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存数据

cookie是存储在客户端,是可以长期保存

第二个是session的销毁

默认情况下 无操作 ,30分钟自动销毁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AjyKHKKh-1689816134571)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230301194111986.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EnUjqrtW-1689816134571)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230301194117830.png)]

//销毁的方法
session.invalidate();

cookie和session的区别

区别

存储位置 c是将数据存储在客户端 s将数据存储在服务端

安全性 c不安全 s安全

数据大小 c最大3kb,s无大小限制

存储时间 c可以通过setMaxAge()长期存储 session默认30分钟

服务性能 cookie不占服务资源 Session 占用服务器资源

应用场景

购物车 使用cookie来存储

以登录用户名的名称展示 使用session存储

记住我的功能 使用cookie存储

验证码 用session来存储

结论 cookie是用来保证用户在未登录情况下的身份识别

session是用来保存用户登录后的数据

小案例

用户登录注册案例

需求分析

1 完成用户登录功能 如果用户勾选记住用户,则下次访问登录页面自动填充用户名 密码

2完成注册功能,并实现验证码功能

用户登录成功后,跳转到列表页面,并在页面上展示当前登录的用户名称;

用户登录失败后,跳转回登录页面,并在页面上展示对应的错误信息 ;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Foz8XtLu-1689816134572)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230301201638211.png)]

前端通过表单发送请求和数据给Web层的loginServlet;

在loginServlet中接收请求和数据

loginServlet 接收到请求和数据后,调用service层完成用户名和密码查询对象

在Service层需要编写UserService类,在类中实现login方法,方法中调用dao层的UserMapper ;

在userMapper接口中,声明一个根据用户名和密码查询用户信息的方法

dao层把数据查询出来以后,将返回数据封装到User对象,将对象交给Service层

Service 层将数据返回给web层

web层获取到Uer对象后,判断User对象如果为null 则将错误信息响应给登录页面,如果不为bull,则跳转到列表页面,并把当前登录用户的信息存入Session中去

Filter

filter是过滤器,javawen三大组件之一,过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能

过滤器一般完成一些通用的操作,**比如每个资源都要写一些代码完成功能,**将代码写在过滤器中,因为每个资源都需要经过过滤器

三步实现

1 定义类 实现filter接口,并重写其所有方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElKdrQmW-1689816134572)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230305194509205.png)]

2配置 filter拦截路径,在类上定义 *@webFilter注解,****/表示拦截所有的资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4KTTJhc-1689816134572)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230305194537841.png)]

3在dofilter方法中输出一句话,并放行

  System.out.println(" filter 被执行了");
filterChain.doFilter(servletRequest,servletResponse);

filter执行的流程

执行放行逻辑前-> 放行 -> 访问资源->执行放行后逻辑

访问资源 会先到filter当中去走一下

filter拦截路径的配置 有四种配置方式

拦截具体的资源 /index.jsp:只有访问index.jsp时才会被拦截

目录拦截 :/user/*:访问/user下的所有资源,都会被拦截

后缀名拦截 :*.jsp:访问后缀名为jsp的资源,都会被拦截

拦截所有 :/* 访问所有资源,都会被拦截

过滤器链

在一个web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83YSRVnW-1689816134573)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230302193855373.png)]

执行流程

  1. 执行 Filter1 的放行前逻辑代码

  2. 执行 Filter1 的放行代码

    1. 执行 Filter2 的放行前逻辑代码
    2. 执行 Filter2 的放行代码
      4. 5. 访问到资源
      6. 6. 执行 Filter2 的放行后逻辑代码
      7. 7. 执行 Filter1 的放行后逻辑代码

过滤器执行的优先级 是按照过滤器类名(字符串)的自然排序

登陆前还需要有放行的逻辑

案例

@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
//判断访问资源路径是否和登录注册相关
//1,在数组中存储登陆和注册相关的资源路径
String[] urls =
{"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeS
ervlet"};
//2,获取当前访问的资源路径
String url = req.getRequestURL().toString();
//3,遍历数组,获取到每一个需要放行的资源路径
for (String u : urls) {
//4,判断当前访问的资源路径字符串是否包含要放行的的资源路径字符串
/*
比如当前访问的资源路径是 /brand-demo/login.jsp
而字符串 /brand-demo/login.jsp 包含了 字符串 /login.jsp ,所以这个字符串就需要放行
*/
if(url.contains(u)){
//找到了,放行
chain.doFilter(request, response);
//break;
return;
}
}
//1. 判断session中是否有user
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
//2. 判断user是否为null
if(user != null){
// 登录过了
//放行
chain.doFilter(request, response);
}else {
// 没有登陆,存储提示信息,跳转到登录页面
req.setAttribute("login_msg","您尚未登陆!");
req.getRequestDispatcher("/login.jsp").forward(req,response);
}
}

listener

监听器 监听器可以窃听就是在application session requst 三个对象创建、销毁或者网其中添加修改删除属性时自动执行代码的功能组件

ServletContextListener

接口下面有两个方法

void contextInitialized(ServletContextEvent sce) : ServletContext 对象被创建了会自动执行的方法 void contextDestroyed(ServletContextEvent sce) : ServletContext 对象被销毁时会自动执行的方法

@WebListener
public class ListenerDemo1 implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextLoaderListener...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

随着服务器的启动而创建的对象

启动服务器,就可以在启动的日志信息中看到 contextInitialized() 方法输出的内容,同时也说明了 ServletContext 对象在服务器启动的时候被创建了。

Ajax

有两个作用

与服务器进行数据交换 通过ajax可以给服务器发送请求,服务器将数据直接响应回给浏览器

用html +ajax 来替换 jsp页面 调用完业务层逻辑之后将数据直接响应会给浏览器,页面使用HTML来进行数据展示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZyeL22CK-1689816134573)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230302200454428.png)]

异步交互 可以不重新加载整个页面的情况下,与服务器交换数据,并更新部分网页的技术 如搜索联想 用户名是否可以校验等等

同步和异步的思想

同步发送请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6OCZWvMW-1689816134573)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230302200811380.png)]

异步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTAHpsOi-1689816134574)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230302200823304.png)]

ajax代码书写

//不同的系统 创建的对象是不同的
<script>
//1. 创建核心对象
var xhttp;
if (window.XMLHttpRequest) {
xhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}


//2. 发送请求
xhttp.open("GET", "http://localhost:8080/ajax-demo/ajaxServlet");
xhttp.send();
//3. 获取响应
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
alert(this.responseText);
}
};
</script>

案列

在完成用户注册时,当用户输入框失去焦点时,检查用户名是否在数据库中已存在

前端

axios

使用也是比较简单的

首先引入文件


发送get请求

axios({
method:"get",
url:"http://localhost:8080/ajax-demo1/aJAXDemo1?username=zhangsan"
}).then(function (resp){
alert(resp.data);
})

发送post请求

axios({
method:"post",
url:"http://localhost:8080/ajax-demo1/aJAXDemo1",
data:"username=zhangsan"
}).then(function (resp){
alert(resp.data);
});

axios是用来发送异步请求的,小括号中使用js对象传递相关请求参数

method 属性 用来设置请求方式 取值为 get 或post

url属性 用来写资源路径的,如果get请求,需要将请求参数拼接到路径后面 格式为:url?参数名=参数值&参数名2=参数值2;

data属性 :用来作为请求被发送的数据,如果是post请求,数据需要作为data属性的值

then()需要传递一个匿名函数,将then()中传递的匿名函数称为回调函数 ,再发送请求时不会被封装,而是再成功响应后调用函数。

请求方法的别名 get请求方法 get 请求 : axios.get(url[,config])

post请求方法 post 请求: axios.post(url[,data[,config])

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wYU5dWIj-1689816134574)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230305200558232.png)]

JSON

javascript对象表示法

js 和json数据格式特别像,只不过js对象中的属性名可以使用引号

而json格式中的建需要必须使用双引号括起来

json的语法

var 变量名 = '{"key":value,"key":value,...}'

JSON 串的键要求必须使用双引号括起来,而值根据要表示的类型确定。

value 的数据类型分为如下 数字(整数或浮点数) 字符串(使用双引号括起来) 逻辑值(true或者false) 数组(在方括号中) 对象(在花括号中) null

示例

var jsonStr = '{"name":"zhangsan","age":23,"addr":["北京","上海","西安"]}'

获取json串中的name属性值 如何处理

js对象,就通过js对象.属性名 js提供了一个对象json

parse(str) 将json串为换为js对象 var jsObject = JSON.parse(jsonStr);

stringify(obj) :将 js 对象转换为 JSON 串。使用方式是: var jsonStr = JSON.stringify(jsObject)

发送异步请求携带参数

var jsObject = {name:"张三"};
axios({
method:"post",
url:"http://localhost:8080/ajax-demo/axiosServlet",
data: jsObject
}).then(function (resp) {
alert(resp.data);
})
axios是一个很强大的工具,只要将提交的数据封装成js对象,并将js对作为axios的data属性值进行,它会自动将js对象转为json串进行提交 
    

json串和java对象的相互转换

以后我们会以json格式的数据进行前后端交互,前端发送请求时,如果时复杂的数据就会以json提交给后端,而后端如果需要响应复杂的数据时,也需要以json格式将数据响应给浏览器[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3mAB5LHO-1689816134575)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230302202138012.png)]

fastjson

是阿里巴巴提供的一个java语言编写的高性能json库,目前java语言中最快的json库,可以实现java对象和json字符串的相互转换;

请求数据时 将json字符串转为java对象

响应数据时 java对象转为json字符串

alibava提供的规范

使用的基本步骤

1导入坐标

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>

2java对象转为json

String jsonStr = JSON.toJSONString(obj);

3JSON字符串转为java对象

User user = JSON.parseObject(jsonStr, User.class);
//

//实例 
public class FastJsonDemo {
public static void main(String[] args) {
//1. 将Java对象转为JSON字符串
User user = new User();
user.setId(1);
user.setUsername("zhangsan");
user.setPassword("123");
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);//{"id":1,"password":"123","username":"zhangsan"}
//2. 将JSON字符串转为Java对象
User u = JSON.parseObject("
{\"id\":1,\"password\":\"123\",\"username\":\"zhangsan\"}", User.class);
System.out.println(u);
}
}

前后端分离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IOdqZbxr-1689816134575)(C:\Users\周鑫\AppData\Roaming\Typora\typora-user-images\image-20230302205809535.png)]

brand.html

页面加载完成后发送异步请求,获取列表数据, 遍历集合数据,展示表格

web层

SelectAllServlet

调用service查询

将list集合转为json

响应json

Service层

调用brandemapper查询

后端实现

调用service方法查询所有逻辑处理。

将查询到的集合转换为json数据,这个称为序列化

如果时将json数据转为java对象,称为反序列化

将json数据响应回给浏览器,设置响应数据的类型 和字符集
中最快的json库,可以实现java对象和json字符串的相互转换;

请求数据时 将json字符串转为java对象

响应数据时 java对象转为json字符串

alibava提供的规范

使用的基本步骤

1导入坐标

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>

2java对象转为json

String jsonStr = JSON.toJSONString(obj);

3JSON字符串转为java对象

User user = JSON.parseObject(jsonStr, User.class);
//

//实例 
public class FastJsonDemo {
public static void main(String[] args) {
//1. 将Java对象转为JSON字符串
User user = new User();
user.setId(1);
user.setUsername("zhangsan");
user.setPassword("123");
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);//{"id":1,"password":"123","username":"zhangsan"}
//2. 将JSON字符串转为Java对象
User u = JSON.parseObject("
{\"id\":1,\"password\":\"123\",\"username\":\"zhangsan\"}", User.class);
System.out.println(u);
}
}

前后端分离

[外链图片转存中…(img-IOdqZbxr-1689816134575)]

brand.html

页面加载完成后发送异步请求,获取列表数据, 遍历集合数据,展示表格

web层

SelectAllServlet

调用service查询

将list集合转为json

响应json

Service层

调用brandemapper查询

后端实现

调用service方法查询所有逻辑处理。

将查询到的集合转换为json数据,这个称为序列化

如果时将json数据转为java对象,称为反序列化

将json数据响应回给浏览器,设置响应数据的类型 和字符集

你可能感兴趣的:(笔记,java)