Java Web总结

1、基本概念

1.1、web开发:

  • web、网页的意思,如:www.baidu.com
  • 静态web:HTML、css(提供给所有人看的不会发生变化!)
  • 动态web:
    1、淘宝、几乎所有的网站
    2、提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!
    3、技术栈: Servlet/JSP、ASP、PHP
    在Java中,动态的web资源开发技术统称为javaweb;

1.2、web应用程序

web应用程序是可以提供浏览器访问的程序

  • test.html、test2.html…多个web资源,这些web资源可以被外界访问
  • 平时能访问到的任何资源,都是存在于这个世界和上的计算机上
  • 统一的web资源会被放在同一个文件夹下—>Tomcat

2.0、web服务器

2.1、ASP:

  • 微软:国内最早期的就是ASP
  • 在HTML中嵌入VB的脚本文件,ASP+COM
  • 在ASP开发中,基本的一个页面都有几千行业务代码,页面极其混乱
  • 维护成本高
  • 主要采用C#开发

2.2、php

  • PHP开发速度快,功能强大,跨平台。代码简单
  • 无法承载的访问量的情况

2.3、JSP/Servlet

  • B/S:浏览器/服务器
  • C/S:客户端/服务器
  • sun公司主推的B/S架构
  • 基于Java与原开发
  • 可以承载三高问题
  • 语法像ASP、加强市场的包容性

2.4、web服务器

服务器是一种被动的操作,用来处理用户放入一些请求和给用户一些响应信息;

  • IIS:微软的:ASP…windows自带的;
  • Tomcat:Apache开源的项目,实际上运行的是JSP/Servlet。最新版本是9.0

3、Tomcat:

3.1、server.xml:

  • 配置启动的端口号:默认8080
    mysql默认:3306
    http默认: 80
    https默认: 443

  • 配置主机名称:loaclhost–>127.0.0.1

  • 默认网站应用存放位置为:webapps

3.2、发布一个网站

  • 将自己写的网站 放到服务器中指定的web应用文件夹下,就可以访问了
  • 网站应该有的结构:
 --Root
 	--THHH:网站的目录名
 			--WEB-INF	
 				-classes:java程序员
 				-lib:web应用所依赖的包
 				-web.xml
 			--indes.html  默认首页
 			-static
 				-css
 				-js
 				-img
 		--.......

4、Http:

4.1、概念

HTTP(超文本传输协议)是一个简单的请求-相应协议,它通常运行在TCP之上

  • 文本:html,字符串
  • 超文本:图片、文字、音乐、视频…
  • htps:安全的

4.2、两个时代

  • http1.0:客户端可以和web服务器连接后,只能获得一个webv资源,断开连接
  • http2.0:客户端可以与web服务器连接后,可以获得多个web资源

4.3、HTTP请求

  • 客户端–发请求(Request)–服务器
    百度:
 `Request URL:https://www.baidu.com/       请求地址
  Request Method :GET                       get和post`方法
  status Code :200 ok						状态码:200
4.3.1、请求行
  • 请求行中的请求方式:get
  • 请求方式:Get、Post、 HEAD、DELETE…
    get:能够携带的参数比较少,大小有限制,会在浏览器URL地址栏显示数据内容,不安全,但是高效
    post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏中显示数据内容,安全,但不高效
4.3.2 消息头
Accept:	告诉浏览器,支持的数据格式
Accept-Encoding:  支持的编码格式:CBK    UTF-8 吗  CB2312
Accept-Language : 告诉浏览器它的语言环境
cache_COntrol:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持
HOST:主机........../

4.4、HTTP响应

  • 客户端–发请求(Request)–服务器
    百度:
Cache-Control:private                 缓存控制
Connection:Keep-Alive                 保持连接
Content-Encoding:gzip
Content-Type:text/html				  编码类型
4.4.1、响应体
Accept:	告诉浏览器,支持的数据格式
Accept-Encoding:  支持的编码格式:CBK    UTF-8 吗  CB2312
Accept-Language : 告诉浏览器它的语言环境
cache_COntrol:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持
HOST:主机........../
Refresh:告诉浏览器刷新频率
Location:让网页重新的定位:
4.4.2、响应状态码

2xx:如202,响应成功
3xx:请求重定向

  • 重定向:重新找到位置

4xx:如404、找不到制定资源
5xx:服务器代码错误,如502,网关错误

5、Maven

  • 在JavaWeb开发过程中,需要大量的jar包,手动导入,效率低下
  • 由此引入了Maven自动帮助开发者导入和配置,即Maven
5.1、Maven项目架构管理工具
  • Maven的核心思想:约定大于配置
  • Maven会规定你如何去开发Java项目
5.2、阿里云镜像

  alimaven
  central
  aliyun maven
  http://maven.aliyun.com/nexus/content/groups/public/

5.3、本地仓库

配置一个本地仓库:

<localRepository>D:\develop\apache-maven-3.6.1\repository</localRepository>
5.4、pom.xml文件
  • 配置文件
5.5、问题

资源导出问题:由于约定大于配置 ,我们之后可能遇到我们写的配置文件,无法被导出或者生效的问题

5.6、idea生成结构目录树

6、Servlet

6.1、Servlet简介:

Java Web总结_第1张图片
注释:为什么需要映射:java程序通过浏览器访问,二浏览器需要连接web服务器,所以我们需要在web服务器中注册java写的Servlet,相当于给浏览器一个能访问的逻辑


 <!--注册Servlet-->
  <servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.thhh.servelt.HelloServlet</servlet-class>
  </servlet>
  <!--Servlet请求路径-->
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
    <!--前端输入的请求-->
  </servlet-mapping>
  • Servlet是sun公司开发的一门动态web技术
  • Sun公司在这些API中提供一个接口:Servlet、HttpServlet
    1、编写一个类,实现Servlet接口
    2、将开发好的java类部署到web服务器中。
  • 把实现了Servlet程序的java程序,叫做Servlet。
public class HelloServlet extends HttpServlet {
    //由于get和post都是实现请求的不同方式,可以互相调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //ServletOutputStream outputStream=resp.getOutputStream();   输出流
        PrintWriter writer=resp.getWriter();//响应流:输出数据到页面
        writer.println("Hello,Servlet" );
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
6.2maven环境优化
  1. 修改web.xml为最新的
  2. 将maven的目录结构搭建完整
6.3、servlet原理

Java Web总结_第2张图片

6.4、servlet-mapping

Url模式有三种:

  • /xxx 匹配/xxx …完全匹配
  • /xxx/* 匹配以/xxx开头, …地址匹配
  • *.xx 链接已.xx结束
  • /* 会映射所有的servlet
  • / 默认的servlet,表示没有被匹配的地址将映射到此默认的servlet

规则:
1.容器会对路径进行完全匹配,找到成功匹配为止
2.容器会递归地尝试匹配最长的路径前缀。这是一次向下路径树的目录,使用“/”字符作为路径分隔符。最长的匹配决定选定的servlet
3.假于路径有后缀,容器会匹配指定后缀的servlet去处理
4.以上三点都没符合的,当有默认的servlet,会被调用

注意:
1、拦截*.do,例如:/user/add.do,弊端:所有的url都要以.do结尾。不会影响访问静态文件。

2、拦截/app/*,例如:/app/user/add,弊端:请求的url都要包含/app。

3、拦截/,例如:/user/add,弊端:对jpg,js,css静态文件的访问也被拦截不能正常显示。

4、拦截/*,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。

6.5、ServletContext

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

  • 共享数据:servlet之间共享数据
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext contxext = this.getServletContext();

        String username  =  "thhhh";
        contxext.setAttribute ("username",username);//讲一个数据保存在了ServletContext中,名字为:username,值:username
    }
}

public class GetServlet extends HttpServlet {
    @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("田晗:"+username);
        //响应流
    }
}
6.6、请求转发
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        System.out.println("进入了Dispatcher");
        
        context.getRequestDispatcher("//gp").forward(req,resp);
    }//在浏览器上请求Dispetchar,转发到路径/gp上的资源
6.7、HttpServletResponse
  • web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,和一个代表响应的HttpServletResponse;
  • 获取客户请求的一些参数:HttpServletRequest
  • 获取给客户端响应的参数:HttpServletResponse
6.7.1、简单分类:

负责向浏览器发送数据的方法

	ServletOutputStream getOutputStream() throws IOException;

    PrintWriter getWriter() throws IOException;
    //可能导致字符串丢失

负责向浏览器发送响应头的方法


    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);

响应的状态码

int SC_CONTINUE = 100;
    int SC_SWITCHING_PROTOCOLS = 101;
    int SC_OK = 200;
    int SC_CREATED = 201;
    int SC_ACCEPTED = 202;
    int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    int SC_NO_CONTENT = 204;
    int SC_RESET_CONTENT = 205;
    int SC_PARTIAL_CONTENT = 206;
    int SC_MULTIPLE_CHOICES = 300;
    int SC_MOVED_PERMANENTLY = 301;
    int SC_MOVED_TEMPORARILY = 302;
    int SC_FOUND = 302;
    int SC_SEE_OTHER = 303;
    int SC_NOT_MODIFIED = 304;
    int SC_USE_PROXY = 305;
    int SC_TEMPORARY_REDIRECT = 307;
    int SC_BAD_REQUEST = 400;
    int SC_UNAUTHORIZED = 401;
    int SC_PAYMENT_REQUIRED = 402;
    int SC_FORBIDDEN = 403;
    int SC_NOT_FOUND = 404;
    int SC_METHOD_NOT_ALLOWED = 405;
    int SC_NOT_ACCEPTABLE = 406;
    int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    int SC_REQUEST_TIMEOUT = 408;
    int SC_CONFLICT = 409;
    int SC_GONE = 410;
    int SC_LENGTH_REQUIRED = 411;
    int SC_PRECONDITION_FAILED = 412;
    int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    int SC_REQUEST_URI_TOO_LONG = 414;
    int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    int SC_EXPECTATION_FAILED = 417;
    int SC_INTERNAL_SERVER_ERROR = 500;
    int SC_NOT_IMPLEMENTED = 501;
    int SC_BAD_GATEWAY = 502;
    int SC_SERVICE_UNAVAILABLE = 503;
    int SC_GATEWAY_TIMEOUT = 504;
    int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
6.7.2、常见应用
  1. 向浏览器输出消息
  2. 下载文件
    获取下载的文件路径
    下载的文件名
    设置浏览器能够支持下载
    获取下载文件的输入流
    创建缓冲区
    获取OutputStream对象
    将FileOutputStream流写入到Buffer缓冲区
    使用OutputStream将缓冲区中的数据输出到客户端
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //    1、获取下载的文件路径
        String realPath = "F:\\IdeaProject\\practive_mvn01\\response\\target\\classes\\2.png";
        System.out.println("下载文件的路径:"+ realPath);
		//2、下载的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
		//3、设置浏览器能够支持下载
        resp.setHeader("Content-Disposition","attachment;fileName = "+fileName);
		//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将缓冲区中的数据输出到客户端

    }
6.7.3验证码功能

验证码怎么来

  • 前端实现
  • 后端实现,需要用到java图片类,来生成一个图片
public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器3秒自动刷新一次
        resp.setHeader("refresh", "3");

        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);

        //得到图片
        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/jpg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("exprise", -1);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setHeader("Prarga", "no-cache");

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


    }

    //生成随机数
    private String makeNum() {
        Random random = new Random();
        String num = random.nextInt(999999) + " ";
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < 6 - num.length(); i++) {
            sb.append("0");
            //随机生成的数不够6位,就用0填充
        }
        return  sb.toString() + num;
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
6.7.5、实现重定向

一个web的资源收到客户端请求后,它会通知客户端去访问另外一个web资源
Java Web总结_第3张图片

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/file/image");
    }

重定向和转发的区别:
相同点:

  • 页面都会实现跳转

不同点:

  • 请求转发时,URL不会产生变换
  • 重定向时,URL地址栏会发生变化
6.8、HttpRequestRequest
6.8.1、概述

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest.,通过这个对象的方法,可以获得客户端的所有信息

6.8.2、获取前端传的参数

Java Web总结_第4张图片

6.8.
6.8.
6.8.

你可能感兴趣的:(Java基础)