JavaWeb

JavaWeb

使用Java开发基于互联网的项目

软件架构

C/S

Client/Server 客户端/服务器端

在用户本地有一个客户端程序 在远程有一个服务器端程序

  • 优点

    • 用户体验好
  • 缺点

    • 开发 安装 部署 维护麻烦

B/S

Browser/Server 浏览器/服务器端

用户在浏览器中通过不同的URL 访问不同的服务器端程序

  • 优点

    • 开发 安装 部署 维护简单
  • 缺点

    • 如果应用过大 用户的体验可能会收到影响

    • 对硬件就要求高

  • 资源分类

    • 静态资源

      如果用户请求的是静态资源 服务器直接静态资源发送给浏览器 浏览器中内置了静态资源的解析引擎 可以展示静态资源

    • 动态资源

      如果用户请求的是动态资源 服务器会执行动态资源 转换为静态资源 再发送给浏览器

网络通信三要素

  • IP

    电子设备(计算机)在网络中的唯一标识

  • 端口

    应用程序在计算机中的唯一标识

  • 传输协议

    规定了数据传输的规则

请你谈谈网站是如何进行访问的?

  • 输入一个域名;回车

  • 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;

    • 有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问

      127.0.0.1   www.yiqiandewo.com
      
    • 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;

在这里插入图片描述

HTTP

Hyper Text Transfer Protocol 超文本传输协议

  • 特点

    • 基于TCP/IP的高级协议

    • 默认端口号:80

    • 基于请求/响应模式 一次请求对应一次响应

    • 无状态的 每次请求之间相互独立 不能交互数据

  • 请求消息

    • 请求行

      请求方式 请求url 请求协议/版本

    • 请求头

    • 请求空行

    • 请求体

      只有post请求方式 才有请求体 在请求体中封装了post请求的请求参数

  • 响应消息

    服务器端发送给客户端的数据

    • 响应行

      组成:协议/版本 响应状态码 状态码描述

    • 响应头

    • 响应空行

    • 响应体

      传输的数据

Servlet

server applet 运行在服务器端的小程序
Servlet就是一个接口 定义了Java类被浏览器访问到的规则

原理

  • 当服务器接收到客户端浏览器的请求后 会解析url路径 获取访问的servlet的资源路径

  • 查找web.xml文件 是否有对应的<url-pattern></url-pattern>标签体内容

  • 有就找到对应的<servlet-class></servlet-class>全类名

  • tomcat会将字节码文件加载进内存 并且创建其对象

  • 调用方法

生命周期

web.xml

<servlet>
      <!-- 
        当值为负数 表示第一次被访问时创建servlet
        当值为正数或0 表示服务器启动时创建servlet
      -->
      <load-on-start>1</load-on-start>
</servlet>

servlet的init方法只执行一次 说明servlet是单例的

注解配置

@WebServlet(“资源路径”)

request对象

tomcat会创建request和response对象 request对象中封装请求消息 传递给service方法

  • 获取请求消息

      //获取请求方式
      String request.getMethod();
      //获取虚拟目录
      String request.getContextPath();
      //获取Servlet路径
      String request.getServletPath();
      //获取get方式请求参数
      String request.getQueryString();
      //获取请求URI
      String request.getRequestURI();
      StringBuffer request.getRequestURL();
      //获取协议及版本
      String request.getProtocol();
      //获取客户机的IP地址
      String request.getRemoteAddr();
      //获取请求头数据
      String request.getHeader(String name);//通过请求头的名称获取请求头的值
      Enumeration<String> request.getHeaderNames();//获取所有的请求头名称
      //获取请求参数通用方式
      String request.getParameter(String name);//根据参数名称获取参数值
      String[] request.getParameterValues(String name);//根据参数名称获取参数值的数组
      Enumeration<String> request.getParameterNames();//获取所有请求的参数名称
      Map<String,String[]> request.getParameterMap();//获取所有参数的map集合
      //在获取参数前,设置request的编码
      request.setCharacterEncoding("utf-8");
    
  • 请求转发:一种在服务器内部的资源跳转方式

    • 步骤

      //通过request对象获取请求转发器对象
      RequestDispatcher getRequestDispatcher(String path);
      //使用RequestDispatcher对象来进行转发
      forward(ServletRequest request, ServletResponse response);
      
    • 特点:

      • 浏览器地址栏路径不发生变化
      • 只能转发到当前服务器内部资源中
      • 转发是一次请求 可以使用request对象来共享数据
  • 共享数据

    • 域对象:一个有作用范围的对象,可以在范围内共享数据

    • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

      //存储数据
      void setAttribute(String name,Object obj);
      //:通过键获取值
      Object getAttitude(String name);
      //通过键移除键值对
      void removeAttribute(String name);
      
  • 获取ServletContext

    ServletContext getServletContext();
    

response对象

  • 设置响应消息

    //设置状态码
    response.setStatus(int sc);
    //设置响应头
    response.setHeader(String name, String value);
    //设置编码,是在获取流之前设置
    response.setContentType("text/html;charset=utf-8");
    //重定向方法
    response.sendRedirect(String value);
    /*重定向的特点
        1.地址栏发生变化
        2.重定向可以访问其他站点(服务器)的资源
        3.重定向是两次请求。不能使用request对象来共享数据
    */
    

    判断路径是给谁用的

    给客户端浏览器使用,需要加虚拟目录(项目的访问路径) eg.重定向

    给服务器使用,不需要 eg.请求转发

  • 输出字符数据

    //获取流对象之前 这是流的默认编码
    response.setCharacterEncoding("utf-8");
    
    //告诉浏览器 服务器发送的消息的编码 建议浏览器以此编码解码
    response.setHeader("content-type", "text/html;charset=utf-8");
    //response.setContentType("text/html;charset=utf-8");
    
    //获取字符输出流
    PrintWriter pw = response.getWriter();
    
    //输出数据
    pw..wrier("xxx");
    
  • 输出字节数据

    response.setContentType("text/html;charset=utf-8");
    
    //获取字节输出流
    ServletOutPutStream sos = response.getOutPutStream();
    
    sos.write("xxx".getBytes("utf-8"));
    
    

ServletContext

  • web容器在启动的时候,它会为每个web程序创建一个对应的ServletConte xt对象,代表整个web应用,可以和程序的容器(服务器)来通信

在这里插入图片描述

```Java  
//通过request对象获取
ServletContext request.getServletContext();

//通过HttpServlet获取
ServletContext this.getServletContext();

//获取MIME类型:
//MIME类型:在互联网通信过程中定义的一种文件数据类型

//格式 大类型/小类型 text/html image/jpeg
String context.getMimeType(String file);

//域对象:共享数据
//ServletContext对象范围:所有用户所有请求的数据
setAttribute(String name,Object value);

getAttribute(String name);
removeAttribute(String name);

//获取文件的真实(服务器)路径
String context.getRealPath(String path);
//web目录下资源访问
String b = context.getRealPath("/b.txt");
//WEB-INF目录下的资源访问
String c = context.getRealPath("/WEB-INF/c.txt");
//src目录下的资源访问
String a = context.getRealPath("/WEB-INF/classes/a.txt");
```

会话技术

一次会话中包含多次请求和响应

一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止

在一次会话的范围内的多次请求间,共享数据

Cookie

客户端会话技术,将数据保存到客户端

//创建Cookie对象,绑定数据
new Cookie(String name, String value);
//发送Cookie对象
response.addCookie(Cookie cookie);
//获取Cookie,拿到数据
Cookie[]  request.getCookies();
  • 实现原理

    基于响应头set-cookie和请求头cookie实现

  • cookie的细节

    • 一次可不可以发送多个cookie?

      可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。

    • cookie在浏览器中保存多长时间?

      默认情况下,当浏览器关闭后,Cookie数据被销毁

      持久化存储

      setMaxAge(int seconds);

      • 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
      • 负数:默认值
      • 零:删除cookie信息
    • cookie共享问题

      • 在一个tomcat服务器中,多个web项目中cookie默认情况下不能共享

        setPath(String path);
        //设置cookie的获取范围。默认情况下,设置当前的虚拟目录
        //如果要共享,则可以将path设置为"/"
        
      • 不同的tomcat服务器间cookie共享问题

        setDomain(String path);
        //如果设置一级域名相同,那么多个服务器之间cookie可以共享
        
  • Cookie的特点和作用

    • cookie存储数据在客户端浏览器
    • 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
    • cookie一般用于存出少量的不太敏感的数据
    • 在不登录的情况下,完成服务器对客户端的身份识别

Session

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中

  • 获取HttpSession对象

    HttpSession session = request.getSession();
    
    //使用HttpSession对象:
    Object getAttribute(String name);
    void setAttribute(String name, Object value);
    void removeAttribute(String name);
    
  • 原理

    Session的实现是依赖于Cookie的
    第一次获取session 没有cookie 会在内存中创建一个新的session对象 session对象有唯一
    响应服务器的时候会发送响应头:set-cookie:JSSEIONID=xxxx
    下一次客户端浏览器访问服务器资源时 发送请求头cookie:JSSEIONID=xxxx 服务器就是根据JSSEIONID来保证一次会话范围内 多次获取的session对象是同一个

  • 细节

    • 当客户端关闭后,服务器不关闭,意味着会话结束,所以两次获取session默认情况下不是同一个。如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。

      HttpSession session = request.getSession();
      Cookie c = new Cookie("JSESSIONID",session.getId());
      c.setMaxAge(60*60);
      response.addCookie(c);
      
    • 客户端不关闭,服务器关闭后,session对象被销毁,再次打开服务器,会重新创建session对象,所以两次获取的session不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作

      • session的钝化

        在服务器正常关闭之前,将session对象系列化到硬盘上

      • session的活化

        在服务器启动后,将session文件转化为内存中的session对象即可。

    • session什么时候被销毁?

      • 服务器关闭

      • session对象调用invalidate()

      • session默认失效时间 30分钟
        在web.xml中选择性修改配置

        <session-config>
            <session-timeout>30</session-timeout>
        </session-config>
        
  • session的特点

    • session用于存储一次会话的多次请求的数据,存在服务器端
    • session可以存储任意类型,任意大小的数据
  • session与Cookie的区别:

    • session存储数据在服务器端,Cookie在客户端
    • session没有数据大小限制,Cookie有
    • session数据安全,Cookie相对于不安全

Filter:过滤器

当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…

实现Filter接口

@WebFilter(“资源路径”)

//放行
filterChain.doFilter(servletRequest,servletResponse);
  • 过滤器执行流程

    • 执行过滤器
    • 执行放行后的资源
    • 回来执行过滤器放行代码下边的代码
  • 过滤器生命周期方法

    • init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
    • doFilter:每一次请求被拦截资源时,会执行。执行多次
    • destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
  • 拦截路径配置:

    • 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
    • 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
    • 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
    • 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
    • 拦截方式配置:资源被访问的方式
      • 注解配置:
      • 设置dispatcherTypes属性
        • REQUEST:默认值。浏览器直接请求资源
        • FORWARD:转发访问资源
        • INCLUDE:包含访问资源
        • ERROR:错误跳转资源
        • ASYNC:异步访问资源
  • 过滤器链(配置多个过滤器)

    • 执行顺序:如果有两个过滤器:过滤器1和过滤器2

      1. 过滤器1
      2. 过滤器2
      3. 资源执行
      4. 过滤器2
      5. 过滤器1
  • 过滤器先后顺序问题

    按照类名的字符串比较规则比较,值小的先执行

    如: AFilter 和 BFilter,AFilter就先执行了。

Listener:监听器

web的三大组件之一。

  • 事件监听机制
    • 事件:一件事情
    • 事件源 :事件发生的地方
    • 监听器 :一个对象
    • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

实现ServletContextListener接口

@WebListener //不需要指定路径

//ServletContextListener:监听ServletContext对象的创建和销毁
//ServletContext对象被销毁之前会调用该方法
void contextDestroyed(ServletContextEvent sce);
//ServletContext对象创建后会调用该方法
void contextInitialized(ServletContextEvent sce);

BeanUtils工具类

简化数据封装

用于封装JavaBean的

JavaBean:标准的Java类

  • 要求

    • 类必须被public修饰
    • 必须提供空参的构造器
    • 成员变量必须使用private修饰
    • 提供公共setter和getter方法
  • 功能

    封装数据

setProperty();
getProperty();
//将map集合的键值对信息,封装到对应的JavaBean对象中
populate(Object obj , Map map);

MVC开发模式

  • M:Model,模型。JavaBean

    完成具体的业务操作,如:查询数据库,封装对象

  • V:View,视图。JSP

    展示数据

  • C:Controller,控制器。Servlet

    • 获取用户的输入
    • 调用模型
    • 将数据交给视图进行展示
  • 优点

    • 耦合性低,方便维护,可以利于分工协作
    • 重用性高​
  • 缺点

    • 使得项目架构变得复杂,对开发人员要求高

三层架构:软件设计架构

  • 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互

  • 业务逻辑层:处理业务逻辑的

  • 数据访问层:操作数据存储文件
    Java类

  • 要求

    • 类必须被public修饰
    • 必须提供空参的构造器
    • 成员变量必须使用private修饰
    • 提供公共setter和getter方法
  • 功能

    封装数据

setProperty();
getProperty();
//将map集合的键值对信息,封装到对应的JavaBean对象中
populate(Object obj , Map map);

MVC开发模式

  • M:Model,模型。JavaBean

    完成具体的业务操作,如:查询数据库,封装对象

  • V:View,视图。JSP

    展示数据

  • C:Controller,控制器。Servlet

    • 获取用户的输入
    • 调用模型
    • 将数据交给视图进行展示
  • 优点

    • 耦合性低,方便维护,可以利于分工协作
    • 重用性高​
  • 缺点

    • 使得项目架构变得复杂,对开发人员要求高

三层架构:软件设计架构

  • 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
  • 业务逻辑层:处理业务逻辑的
  • 数据访问层:操作数据存储文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值