JavaWeb学习 笔记为观看B站狂神视频记录

Posted 轻舟一曲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb学习 笔记为观看B站狂神视频记录相关的知识,希望对你有一定的参考价值。

JavaWeb


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">
</web-app>

JSP头部编码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

概念

概述

Web开发:

  • web,网页
  • 静态web
    • html,css
    • 提供的数据始终不会发生变化
  • 动态web
    • 淘宝,不一样的人不一样的时间不一样的数据
    • 技术栈:Servlet/JSP,ASP.php

在Java中,动态web资源开发技术统称JavaWeb

web应用程序

可以提供浏览器访问的程序;

统一的web资放在同一个文件夹下,web应用程序->Tomcat:服务器;

一个web应用多多部分组成(静态web,动态web),html,css,js,jsp,servlet,java程序,jar包,配置文件properties;

web应用程序编写完毕,若想提供给外界访问:需要一个服务器来统一管理。

静态web

image-20210518175547642 image-20210518175735365

动态web

image-20210518180101537

缺点:

  • 假如服务器动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;

优点:

  • 动态更新,用户交互(数据持久化:注册,商品信息,用户信息…)

Web服务器

3个技术

image-20210518180628653 image-20210518180832445

服务器

服务器是一种被动操作,用来处理用户的请求和返回响应信息。

Tomcat,IIS…

image-20210518181258425

Tomcat

image-20210518182418762

image-20210518182554864)

image-20210518182816715

可以配置启动的端口号;

可以配置主机域名;

修改主机域名

image-20210518183429364

面试题:

image-20210518184103713

web网站

  • 将写的网站放到服务器的指定文件夹webapps中
-- webapps: Tomcat服务器的web目录
    --ROOT
    --mafu:网站的目录名
      --WEB-INF
         --classes:java程序
         --lib:web应用程序所依赖的jar包
         --web.xml:网站的配置文件
      --index.html默认的首页
      --static 资源文件
            --css
            --js
            --img
        

HTTP

简述

超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

  • http1.0:HTTP/1.0 一个连接只能获得一个web资源,断开连接
  • http2.0:HTTP/1.1 一个连接只能获得多个web资源

HTTP请求

HTTP响应

image-20210518200514117

Maven

image-20210518200740007

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

  1. 下载
image-20210518201404094
  1. 环境变量
image-20210518201956263
  1. 修改镜像
  2. 本地仓库,远程仓库

在IDEA中使用Maven

image-20210518203225295 image-20210518203404461

IDEA中设置Maven

image-20210518203702073 image-20210518205316323

Maven创建成功后注意看下IDEA默认设置。

image-20210518210442733

上面是用Maven模板的项目。

现在创建普通Maven项目-----一个干净的Maven项目。

image-20210518204916915

注意Maven项目的资源过滤问题:

image-20210518211403458

设置默认:

image-20210518212420868

Maven默认web项目中的web.xml版本问题:

采用Tomcat默认4.0版本。

Servlet

测试

学习路线:

image-20210518215601024

概述:

image-20210518215738587

源码分析

image-20210518230345787

测试:

public class Test01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final PrintWriter writer = resp.getWriter();
        writer.println("servletTest01");
    }

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

编写映射:

java程序通过浏览器访问,需要给浏览器提供访问的路径,而浏览器需要连接web服务器拿到资源,所以需要在web服务器中注册servlet。

         <servlet>
             <servlet-name>Test01</servlet-name>
             <servlet-class>com.mf.study01.Test01</servlet-class>
         </servlet>
         <servlet-mapping>
             <servlet-name>Test01</servlet-name>
             <url-pattern>/Test01</url-pattern>
         </servlet-mapping>

原理

image-20210519081548463

Mapping

测试

  1. 一个servlet指定一个路径
         <servlet>
             <servlet-name>Test01</servlet-name>
             <servlet-class>com.mf.study01.Test01</servlet-class>
         </servlet>
         <servlet-mapping>
             <servlet-name>Test01</servlet-name>
             <url-pattern>/Test01</url-pattern>
         </servlet-mapping>
  1. 一个servlet指定多个路径
         <servlet>
             <servlet-name>Test01</servlet-name>
             <servlet-class>com.mf.study01.Test01</servlet-class>
         </servlet>
         <servlet-mapping>
             <servlet-name>Test01</servlet-name>
             <url-pattern>/Test01</url-pattern>
         </servlet-mapping>
         <servlet-mapping>
                <servlet-name>Test01</servlet-name>
                <url-pattern>/Test02</url-pattern>
         </servlet-mapping>
         <servlet-mapping>
                <servlet-name>Test01</servlet-name>
                <url-pattern>/Test03</url-pattern>
         </servlet-mapping>
  1. 一个servlet可以指定通用映射路径
         <servlet-mapping>
            <servlet-name>Test01</servlet-name>
            <url-pattern>/Test03/*</url-pattern>
         </servlet-mapping>

/*直接跳转到首页。

  1. 前缀
image-20210519093433991

404处理

public class error extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf8");
        final PrintWriter writer = resp.getWriter();
        writer.println("<h2>页面走丢了!</h2>");


    }

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

        <servlet>
            <servlet-name>error</servlet-name>
            <servlet-class>com.mf.study01.error</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>error</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>

遇到问题

部署war包成功,war exploded失败的问题

image-20210519091108792

重建webapp模块发现结构差异:

image-20210519091031621

问题:

image-20210519092558628

综上问题:后缀路写错了

image-20210519093456190

ServletContext

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

共享数据

之后会用session和request替换ServletContext。

image-20210519102604480

Test01

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context= this.getServletContext();
        String username = "上官婉儿";
        context.setAttribute("username",username);
    }

Test02

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       ServletContext context = this.getServletContext();
        String username =(String) context.getAttribute("username");

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().println("<h2>"+username+"</h2>");
    }
image-20210519104735369

获得初始化参数

几乎不用。

web.xml

image-20210519105734183[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKEXyWyL-1622023696504)(https://image.cha138.com/20210604/ca9f2a280ce64a1d9b539b9268417e65.jpg)]

image-20210519105859655

转发

用request替换。

转发的时候url路径不会改变:

        context.getRequestDispatcher("/test03").forward(req,resp);//调用forward进行转发
image-20210519111146671

获取资源文件

也可以用类加载反射获取。

Properties

image-20210519112009732 image-20210519112343095

相对web应用拿到资源。

image-20210519112920853
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties properties = new Properties();
        properties.load(is);
        resp.getWriter().println("username:"+properties.getProperty("username"));
        resp.getWriter().println("password:"+properties.getProperty("password"));

    }

Response

HttpServletResponse


web服务器收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest的对象和一个代表响应的HttpServletResponse的对象。

image-20210519113724044
  • 输出消息
  • 下载文件

下载文件

image-20210519123947663

测试:

image-20210519161610423
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取文件下载的路径
        String realPath = "D:\\\\IDEA\\\\MyProject\\\\KuangStudy\\\\JavaWeb\\\\Servlet03\\\\target\\\\classes\\\\成徐.jpeg";
        System.out.println("下载文件的路径" + realPath);
        //2.下载的文件名是什么?
        String fileName = realPath.substring(realPath.lastIndexOf("\\\\") + 1);
        //3.设置办法让浏览器能够支持(Content-Disposition)我们需要的东西
        //下载文件名处理乱码问题:URLEncoder.encode
        resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
        //4.获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        //5.创建缓冲区
        byte[] buffer = new byte[1024];
        int len=0;
        //6.获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
        //7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
        while ((len=in.read(buffer))!=-1){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();

    }

各种静态资源导出问题

    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
          <include>**/*.jpeg</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

image-20210519160603116

验证码

  • 前端实现
  • 后端实现:需要用到Java的图片类,生成图片。
image-20210519165601483
    //生成随机数
    private String makeRandom(){
        Random random = new Random();
        String num= random.nextInt(99999999)+"";
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i <8- num.length(); i++) {
            buffer.append("0");
        }
        num=num+buffer.toString();
        return num;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //如何让浏览器1s刷新一次
        resp.setHeader("refresh","1");
       //在内存中创建图片
        BufferedImage image = new BufferedImage(300, 80, BufferedImage.TYPE_INT_RGB);
       //得到图片
        Graphics2D graphics =(Graphics2D) image.getGraphics();//一只2D的笔
        graphics.setBackground(Color.white);
        graphics.fillRect(0,0,300,80);
        //给图片写数据
        graphics.setColor(Color.yellow);
        graphics.setFont(new Font(null,Font.BOLD,60));
        graphics.drawString(makeRandom(),10,60);
        //告诉浏览器这个请求用图片方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        //把图片写给图片
        ImageIO.write(image,"jpeg",resp.getOutputStream());
    }

重定向

(重点) 地址会发生该改变,一个web资源B受到客户端A请求后通知客户端A去访问另外一个web资源C,这个过程叫重定向。

常见场景:登录页面…

    void sendRedirect(String var1) throws IOException;

重定向问题:添加项目名

resp.sendRedirect(req.getContextPath()+"/Image");

/*          resp.setHeader("Location","/Servlet03_war/Image");
          resp.setStatus(HttpServletResponse.SC_FOUND);//302*/
           //需要添加项目名字
          resp.sendRedirect("/Servlet03_war/Image");
image-20210519171214705

面试题:转发和重定向区别

相同:页面都会实现跳转

不同:转发时url不改变 307,重定向url改变 302。

提交表单跳转路径问题:

-- 代表当前项目
${pageContext.request.contextPath}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
     <form action="${pageContext.request.contextPath}/Request" method="get">
         <label>用户名:</label>
         <input type="text" name="username">
         <br>
         <label>密码:</label>
         <input type="password" name="password">
         <br>
         <input type="submit" value="提交">
     </form>
</body>
</html>

Request

HttpServletRequest


image-20210519174101336

获取参数

image-20210519174440326

转发

public class Login extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password")以上是关于JavaWeb学习  笔记为观看B站狂神视频记录的主要内容,如果未能解决你的问题,请参考以下文章

B站狂神说Java---记录SpringMVC学习笔记

B站狂神说Java笔记-Java入门学习

狂神说Java个人笔记-JavaWeb

B站狂神说Java笔记-数组

B站狂神说Java笔记-面向对象编程

B站狂神说Java笔记-java流程控制