JavaWeb

JavaWeb

1.基本概念

  • web开发 : 开发网页

  • 静态web

    • html、css
    • 数据始终不会发生变化
  • 动态web

    • 数据会发生变化

    • 技术栈:Servlet/JSP,ASP,PHP

1.1 web应用程序

  • web应用由多部分组成
    • html、css、js
    • jsp、servlet
    • Java程序
    • jar包
    • 配置文件(Properties)
  • web应用程序提供给外界访问,需要一个服务器进行统一管理
  • 静态web存在的缺点
    • Web页面无法动态更新
      • 轮播图,点击特效:伪动态
      • JavaScript
      • VBScript
    • 无法和数据库交互(数据无法持久化)
  • 动态web

image-20201115093139403

缺点:

  • 加入服务器的动态web资源出现错误,需要重新编写后台程序发布
    • 停机维护

优点:

  • Web页面可以动态更新
  • 可以与数据库进行交互(数据持久化)

2.Web服务器

2.1技术

ASP

  • 微软 : 国内最早流行
  • 在html中嵌入了VB脚本,ASP+COM;
  • 在ASP开发中,基本页面都有几千行的业务代码
  • 维护成本高!
  • C#
  • IIS

php

  • PHP开发速度快,共鞥强大,跨平台,代码简单(70%)
  • 无法承载大访问量的情况

JSP/Servlet:

B/S : 浏览器和服务器

C/S : 客户端和服务器

  • sun公司主推的B/S架构
  • 基于java语言
  • 可以承载三高(高并发,高可用,高性能)带来的影响
  • 语法像ASP

2.2 web服务器

用于处理用户请求和返回响应信息

  • IIS

  • Tomcat

    • image-20201115101040475

    启动关闭

    image-20201115101152736

配置

image-20201115101320324

  • 可以配置启动的端口号
    • tomcat默认端口号为:8080
    • mysql:3306
    • http:80
    • https:443
  • 可以配置主机的名称
    • 默认主机名为:localhost -> 127.0.0.1
    • 默认网站应用存放的位置为:webapps

高难度面试题

网站如何访问的:

  1. 输入一个域名 : 回车

  2. 检查本机 C:\Windows\System32\drivers\etc\host

    1. 有 : 直接返回对应的ip地址,这个地址中有我们需要访问的web程序,可以直接访问
      1. 没有:去DNS服务器找,找到则返回,找不到就返回找不到

    image-20201115102734324

3. HTTP

3.1 简介

HTTP(超文本传输写一) 简单的请求-响应写一,通常运行在TCP之上。

  • 文本 : html,字符串
  • 超文本 : 图片,音乐,视频 ...
  • 80

HTTPs: 安全的

  • 443

3.2 两个时代

  • HTTP1.0
    • HTTP/1.0 : 客户端可以与web服务器连接后,只能获得一个web资源,断开连接
  • HTTP2.0
    • HTTP/1.1 : 客户端可以与web服务器连接后,可以获得多个web资源。

3.3 Http请求

Request URL:        //地址
Request Method:GET    get/post
Status Code:200 OK    状态码
Remote(远程) Address 

1.请求行

  • 请求方式 : Get,Post,HEAD,DELETE,PUT,TRACT...
    • get : 请求能够携带的参数小,大小有限制,在url会显示数据内容,不安全,高效
    • post : 请求能够携带的参数无限制,不会再url显示数据,安全,不高效

2.消息头

Accept:    支持的数据类型
Accept-Encoding:    支持哪种编码格式    GBK UTF-8 GB2312 I
Accept-Language:    语言环境
Cache-Control:        缓存控制
Connection:            请求断开还是连接
HOST:    主机

3.4 Http响应

Cache-Control:private    缓存控制
Connection:keep-Alive    连接
Content-Encoding:gzip    编码
Content-Type:text/html    类型

1.响应体

Accept:    支持的数据类型
Accept-Encoding:    支持哪种编码格式    GBK UTF-8 GB2312 I
Accept-Language:    语言环境
Cache-Control:        缓存控制
Connection:            请求断开还是连接
HOST:    主机
Refresh:    多久刷新一次
Location:    让王爷重定位

2.响应状态码

200 成功

3** 请求重定向

404 找不到资源

5** 服务器代码错误

502:网关错误

4. Maven

4.1 Maven项目架构管理工具

Maven的核心思想 : 约定大于配置

Maven规定好如何编写java代码

  • 自己写的配置文件,无法被导出或者生效的问题的解决方法:
<!-- 在build中配置resources,来防止我们资源导出失败的问题 -->
<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

        </resources>
</build>

配置环境变量

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME maven目录
  • 系统的path中配置 %MAVEN_HOME%\bin

阿里云镜像

  • 镜像 加速下载
  <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

本地仓库

建立一个本地仓库

5. Servlet

5.1 Servlet建立

Servlet接口有两个默认的实现类

  • HttpServlet

  • GenericServlet

image-20201115153330290

修改最新的web.xml:

<?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"
         metadata-complete="true">


</web-app>
  1. 继承HttpServlet,重写doGet()、doPost()方法
public class HelloServlet extends HttpServlet {

    //get、post只是请求实现的不同方式,可以相互调用

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletOutputStream outputStream = resp.getOutputStream();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  1. 编写Servlet映射
    • 作用:通过浏览器访问Java程序,连接web,需要在web服务器中注册自己的Servlet,并提供浏览器一个能够访问的路径
    <!-- 注册Servlet -->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.Rickduck.servlet.HelloServlet</servlet-class>
    </servlet>
    <!-- Servlet的请求路径 -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
  1. 配置Tomcat
  • 配置项目发布路径!!
  1. 启动测试

5.2 Servlet原理

image-20201115165055796

5.3 Mapping问题

  1. 一个Servlet可以指定一个映射路径

        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    
  2. 一个Servlet可以指定多个映射路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    
  3. 一个Servlet可以指定通用映射路径

    <!-- * : 通配符 -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
  4. 默认请求路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
  5. 指定前缀或后缀

    <!-- 
        * : 通配符
        注意 : *前面不能加项目映射的路径
    -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.hello</url-pattern>
    </servlet-mapping>
    
  6. 优先级问题

    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。!!!

5.4 ServletContext

web容器在启动时,会为每个web程序都创建一个ServletContext对象,它代表了当前的web应用:

  • 共享数据

    在这个Servlet保存的数据,可以在另一个servlet中拿到;

    SeevletContext context = this.getServletContext();
    
    //获取数据
    context.getAttribute();
    //存数据
    context.setAttribute("name",value);
    
    


- 获取初始化参数

  ``` xml
  <!-- 配置初始化参数 -->
      <context-param>
          <param-name>url</param-name>
          <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
      </context-param>
  // 通过ServletContext对象获取初始化参数
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

          ServletContext servletContext = this.getServletContext();
          String url = servletContext.getInitParameter("url");
          resp.getWriter().println(url);

      }
  • 请求转发(url地址不变)

    重定向 : url地址变化

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            ServletContext servletContext = this.getServletContext();
            //转发请求路径
            RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/gp");
            //调用forward实现请求转法
            requestDispatcher.forward(req,resp);
    
        }
    
  • 读取资源文件

    Properties

    • 在java目录下新建properties
    • 在resources目录下新建properties
    • 发现:都被打包到了同一个路径下:WEB-INF/classer 下,俗称类路径
    • 思路:需要一个文件流
    // db.properties
    username = root
    password = 123456
    
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
          Properties prop = new Properties();
          //读取流
          prop.load(resourceAsStream);
          //获取文件内容    
          String username = prop.getProperty("username");
          String password = prop.getProperty("password");
          resp.getWriter().println(username);
          resp.getWriter().println(password);
      }

5.5 HttpServletRequest

HttpServletRequest代表客户端的请求。

用户通过HTTP协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过HttpServletRequest的方法,获取客户端的信息。

1. 获取前端传递的参数
req.getParameter(String s)
req.getParameterValues(String s)
2. 请求转发
req.getRequestDispatcher("/gp");

5.6 HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建:

  • 代表请求的 HttpServletRequest
  • 代表响应的HttpServletResponse
  • 如果需要获取客户端请求过来的参数 : 找HttpServletRequest
  • 如果需要给客户端响应信息 :找HttpServletResponse
1. 分类
  • 向浏览器发送数据

        ServletOutputStream getOutputStream() throws IOException;
    
        PrintWriter getWriter() throws IOException;
    
  • 向浏览器发送响应头

        void setCharacterEncoding(String var1);
    
        void setContentLength(int var1);
    
        void setContentLengthLong(long var1);
    
        void setContentType(String var1);
    
        void setDateHeader(String var1, long var2);
    
        void addDateHeader(String var1, long var2);
    
        void setHeader(String var1, String var2);
    
        void addHeader(String var1, String var2);
    
        void setIntHeader(String var1, int var2);
    
        void addIntHeader(String var1, int var2);
    
  • 响应的状态码

    200    成功
    
    3**    请求重定向
    
    404    找不到资源
    
    5**    服务器代码错误
    
    502:网关错误    
    
2.常见应用
  1. 向浏览器输出消息

  2. 下载文件

    1. 获取下载路径

    2. 下载的文件名

    3. 让浏览器支持文件下载

    4. 获取下载文件的输入流

    5. 创建缓冲区

    6. 获取OutputStream对象

    7. 将FileOutputStream流写入到buffer缓冲区

    8. 使用OutputStream将缓冲区的数据输出到客户端

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //      1. 获取下载路径
            String realPath = this.getServletContext().getRealPath("");
            System.out.println("下载路径"+realPath);
    //      2. 下载的文件名
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
    //      3. 让浏览器支持文件下载(Content-Disposition)
            resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
    //      4. 获取下载文件的输入流
            FileInputStream in = new FileInputStream(realPath);
    //      5. 创建缓冲区
            int len = 0;
            byte[] buffer = new byte[1024];
    //      6. 获取OutputStream对象
            ServletOutputStream out = resp.getOutputStream();
    //      7. 将FileOutputStream流写入到buffer缓冲区
            while ((len=in.read(buffer))>0)
            {
                out.write(buffer,0,len);
            }
            in.close();
            out.close();
    
    //      8. 使用OutputStream将缓冲区的数据输出到客户端
    
    
   }


3. 验证码功能

- 前端实现

- 后端实现,需要用到Java的图片类,生产一个图片 

  ``` java
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

          //让浏览器每三秒刷新一次
          resp.setHeader("refresh","3");

          //在内存中创建一个图片
          BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
          //得到图片
          Graphics2D g = (Graphics2D)image.getGraphics();
          //设置图片北京颜色
          g.setColor(Color.white);
          g.fillRect(0,0,80,20);
          //给图片写数据
          g.setColor(Color.BLUE);
          g.setFont(new Font(null, Font.BOLD,20));
          g.drawString(makeNum(),0,20);

          //告诉浏览器,这个请求用图片的方式打开
          resp.setContentType("image/jpeg");

          //网站存在缓存,不让浏览器缓存
          resp.setDateHeader("expires",-1);
          resp.setHeader("Cache-Control","no-cache");
          resp.setHeader("Pragma","no-cache");

          //把图片写给浏览器
          ImageIO.write(image, "jpg", resp.getOutputStream());

      }
重定向 !!!

​ 一个web资源收到客户端请求后,它会通知客户端去访问另外一个资源!

// 重定向
resp.sendRedirect("url");

重定向、转发的区别:

相同点

  • 页面都会实现跳转

不同点

  • 请求转发时,url不会发生变化
  • 重定向,url会发生变化

6. Cookie、Session

6.1 会话

  • 有状态会话
    • 保存了某正认证内容的会话(Cookie、Session)
  • 无状态会话

6.2 保存会话的两种技术

  • Cookie
    • 客户端技术
  • Session
    • 服务器技术,将信息或数据存在Session中
  1. 从请求中拿到cookie信息

  2. 服务器响应给客户端cookie

    Cookie[] cookies = req.getCookies();
    //遍历获取cookie
    for (Cookie cookie : cookies) {
        cookie.getName();   //获取key
        cookie.getValue();  //获取value
    }
    //创建cookie
    Cookie cookie = new Cookie("Key", "value");
    //设置cookie有效期
    cookie.setMaxAge(24*60*60);
    //响应给客户端一个cookie
    resp.addCookie(cookie);
    

cookie : 一般保存在本地的用户目录下的appdata中

cookie上限问题

  • 一个Cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • Cookie大小有限制
  • 300个cookie浏览器上限

删除Cookie:

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期时间为0

6.4 Session

Session:

  • 服务器会给每个用户创建一个Session对象
  • 一个Session独占一个浏览器(用户)
  • 用户登录后,整个网站都可访问

Session使用场景:

  • 保存用户登录信息
  • 购物车信息
  • 整个网站经常使用的数据可保存在Session中

Session和cookie区别:

  • Cookie是把用户的数据写给用户浏览器,浏览器保存
  • Session把用户的数据写到用户独占Session,服务的保存
  • Session对象由服务器创建;

image-20201117113703952

7. JSP

Java Server Page : java服务端页面,也和Servlet一样,用于动态Web技术

最大特点:

  • 后端返回HTML代码
  • 区别
    • HTML提供静态数据
    • JSP页面可嵌入java代码,提供动态数据

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
jsp最终也会转化为java

一只快乐的猪 文章被收录于专栏

记录生活

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务