JavaWeb(一)

1 Javaweb的基础知识

  • Javase是Javaweb、Javaee的基础;
  • Javaweb是开发网站的相关技术,主要包括了Servlet、Tomcat、JDBC、Cookie/Session;
  • JavaEE 的全称是 JAVA Platform Enterprise Eitdit 面向企业开发的框架
    • 2015 SSH(Struts + Hibernate + Spring)
    • 2015-2018 SSM(SpringMVC + Spring + Mybatis SSM)
    • 2018-至今 Spring Boot (SpringBoot + Spring + Myabtis)
    • 其他的一些框架:
      • 微服务框架 SpringCloud/alibaba Cloud
      • 无服务框架 ServerLess
      • 服务网格 ServerMesh
  • 静态网页
    • 由JS+HTML+CSS组成,无论何时请求网页都不会变化
  • 动态网页
    • 前端:HTTP+HTML+CSS+JS;
    • 后端:Servlet+Tomcat+Request+Repone+Session/Coookie;
    • 数据库:Mysql;
    • 浏览器和服务器的交互根据浏览器不同的请求生成不同的的网页;
  • 统一资源定位符
    • 协议://公网ip:端口/路径1/路径2?key=value
      • 不同的协议用不同的解析方式;
      • 网络中由很多的主机,为了访问不同的主机,使用公网IP做区分;
      • 主机中由很多进程,每一个端口都代表一个进程;
      • 路径:进一步区分主机中的资源;

2 Http的基础协议和解析

2.1 CS/BS

  • CS 是客户端-服务器模式(Client-Server)即CS结构;
    • 优点 :用户体验好、界面流畅;
    • 缺点:客户端升级和维护需要重新设计和开发,需要兼容不同的系统;
  • BS 浏览器和服务器架构模式(Brower-Server) 系统的功能实现集中在服务器;
    • 优点:发布快,用户可以很快体验新的功能 ,不用兼容各种系统;
    • 缺点:依赖网络,必须在网络好的情况下才能加载很快;

2.2 超文本传输协议

  • 协议:一种信息交换的格式,请求方以什么样方式加密数据,接收方就会用什么样的方式解密数据;
  • 超文本传输协议:Hyter text transfer protocol 是web的联网基础,也是手机PC联网的基础,http协议是tcp协议的一种应用;
    • http协议的特点:客户端的每一次请求都要求服务器响应,一次请求和响应被成为“一次连接”;
    • HTTP响应码
响应码说明
1xx信息被接收,等待处理
2xx服务器响应成功
3xx重定向
4xx客户端语法错误或者语义不清
5xx服务器处理请求出现了问题
  • HTTP和HTTPS的区别
    • HTTPS(Hytertext Transfer Protocol over SecrueSockt Layer)
    • 组合:HTTP+SSL/TLS
    • 优点:保证了数据在传输的过程不被修改,泄露,保证了数据的完整性。
    • 缺点:在相同的网速情况加载HTTPS比HTTP的网页多耗时50%,耗电多耗10%-20%;但是利大于弊,HTTPS是趋势;

2.3 HTTP请求和响应拆分详解

  • 请求
    • 请求行:请求方法、请求路径、协议的版本;
    • 请求头:“属性:属性值”的格式进行展示,服务器获取客户端信息的数据
    • 请求体:可以是json对象也是可以表单key1=value&key2=value

在这里插入图片描述

  • 响应
    • 响应行:报文协议以及版本号,状态码;
    • 响应头:“属性:属性值”;
    • 响应体:可以是json对象,图像、视频等

在这里插入图片描述

2.4 常用的请求方法

  • HTTP 1.0 协议
    • GET:向服务器获取资源,
    • POST: 向服务器提交资源;
    • HEDA: 和get请求类似,获取的是请求的数据;
  • HTTP 1.1 协议
    • PUT:更新数据请求,例如:更新商品信息,个人信息;
    • PATCH:是put方法的补充,更新指定资源部分数据;
    • DELETE : 删除指定资源;
    • OPTIONS: 获取服务器支持的方法、性能、是否支持跨域;
    • CONNECT :让服务器代替用户访问其他网址,然后把数据返回给用户;
    • TRACE:回显服务器的请求;

2.5 HTTP常用的响应码

  • 1xx :服务器收到了请求,等待下一步操作;
  • 2xx:请求成功;
  • 3xx:请求成功,浏览器拿到了这个状态码会自动跳转到新的地址;
    • 301 永久性跳转;
    • 302 临时跳转;
  • 4xx:客户端出错
    • 400 请求的协议不对;
    • 403 请求被拒绝了;
    • 404 不存在这个地址或者 语义错误;
    • 405 使用的请求方法不正确;
  • 5xx: 服务器出错;
    • 500 服务器内部错误了;
    • 503 服务器宕机了;

2.6 HTTP 常用的请求头和响应头

2.6.1 请求头

  • accept 浏览器支持的mime媒体类型;
  • accept-language 浏览器支持的语言格式;
  • accept-Encoding 浏览器支持的编码格式;
  • connction:keep-alive 持久连接;
  • orgin:告诉服务器是从那里请求的(只有域名和协议);
  • refer:告诉服务器请求的完整的uri,包括域名+协议+请求参数(在一些抢购服务器里面使用,比如抢购一个优惠券,必须从某个网页进入)
  • transfer-Encoding 服务器长度响应不确定,静态网页没有这种情况;
  • content-type:服务请求的提交的内容;
  • cookie:服务端会判断http请求的状态,比如说登录的token;
  • user-agent :服务器可以根据请求头判断软件应用类型,开发商,开发商版本号,浏览器的内核版本;

2.6.2 响应头

  • allow 服务器支持的方法;
  • content-type 响应返回的mime类型;
  • content-Encoding 响应的编码格式;
  • content-length 服务器响应的长度;
  • DATE:服务器请求的时间;
  • expires:响应的有效时间,一个GMT时间;
  • cahe-control:和expires一样的作用,控制浏览器向缓存获取数据还是向服务器获取数据,比expires更加的精细,使用方法:max-age=360;
  • location:用户在那个地址获取的数据 一般和状态码30x配合使用;
  • transform-Encoding:chunked 服务器响应长度不确定,静态网页就不会出现这个页面;
  • acess-control-allow-origin:跨域资源共享的站点;
  • server:服务器名称;
  • content-type的常用类型:
    • text/plain 文本格式;
    • text/html html格式;
    • text/xml xml格式;
    • image/gif gif格式;
    • image/png png格式;
    • image/gpeg gpg格式;
    • application/json json格式;
    • application/pdf pdf 格式;
    • application/octet -stream 二进制数据;
    • application/www-form-urlencoded 表单格式;
    • mulpart/form-data:上传的文件类型;
      提升:https://developer.mozilla.org/zh-CN/docs/Web/HTTP;

3 apache tomcat基本知识

3.1 基础知识

  • 什么是服务器:远程的一台电脑,安装了服务器程序监听对应端口,提供对外服务,可以根据服务器请求(web服务器和应用服务器都是电脑上安装的软件);
  • web服务器和应用服务器有很大的交集,并没有明确的区分;web服务器处理http协议,tomcat处理其他协议;
  • apache tomcat apache 是html的容器,不能处理jsp,java,tomcat是servlet的容器 是apache的一个拓展;

3.2 tomcat下载安装

  • 环境准备:
    • 安装JDK8以上;
  • 下载地址:https://tomcat.apache.org/
  • 启动/关闭:
#启动
linux: bin/startup.sh (需要增加执⾏行行权限:chmod 777 ./*)
windows:bin/startup.bat;
#关闭
linux:bin/shutdown.sh;
windows;shutdown.bat;

*启动乱码报错

原因:控制台展示编码问题
编辑 conf/logging.properties ⽂文件
java.util.logging.ConsoleHandler.encoding = UTF-8
改为
java.util.logging.ConsoleHandler.encoding = GBK

3.3 tomcat目录

  • bin 存放启动脚本的目录;
#启动
startup.sh/startup.bat
关闭
shutdown.sh/shutdown.bat
  • lib 存放着tomcat运行需要的第三方的包,第三方jar包对多有的项目共享;
  • conf 存放配置文件的目录,server.xml可以修改端口,虚拟ip;
  • log tomcat 启动关闭日志,catalina.out 标准错误输出,也会输出tomcat运行和console打印的日志;
  • work 存放编译class文件的目录;
  • wepapps 发布项目的主要目录,每一个目录都是一个项目,如果没有给出项目时候,ROOT就是主项目;
  • temp:存放tomcat运⾏行行时的临时性数据;

4 servlet 4.0

4.1 基础知识

  • Servlet又叫 JAVAServlet 是安装在web服务器和应用服务器上面的程序,独立于平台和协议的特性;
  • 作用:用户通过浏览器向服务器提交表单,用户向数据库获取信息返回给浏览器;
  • 常用的两个子类:HttpServlet GenericServlet;

4.2 第一个Servlet

  • java代码
package net.lizheng.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class FirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter printWriter=resp.getWriter();
        printWriter.write("今天不学习明天变垃圾");
    }

}

xml配置

    <servlet>
        <servlet-name>FirstDEMO</servlet-name>
        <servlet-class>net.lizheng.web.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FirstDEMO</servlet-name>
        <url-pattern>/FirstDEMO</url-pattern>
    </servlet-mapping>

4.3 Servlet的生命周期

  • Servlet共有5个方法,3个生命周期方法,2个普通方法;
    • init() 方法,在servlet声明周期中只会执行一次,用于资源的初始化,在调用servlet第一次执行;
    • service() 是servlet生命周期的核心,会根据不同请求方式调用不同的方法,且httpservlet实现了service方法所有只要重写doget。。。。方法即可;(XXXServlet->HttpServlet->GenericServlet->implements Servlet)
    • destroy()只会执行一次,就是服务关闭时候;
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.servlet;

import java.io.IOException;

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}


4.4 新版Servlet3.0~5.0和旧版配置的区别

  • 新版的servlet的配置不需要配置web.xml,而是通过注解的方式进行配置(注解不了解的同学可以看下另一篇文档注解);
  • 示例
package net.lizheng.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name="FirstDemo",value = "/test")
public class FirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter printWriter=resp.getWriter();
        printWriter.write("今天不学习明天变垃圾");
    }

}

注解示例

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.servlet.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
	//servlet的名称
    String name() default "";
	//servlet的路径
    String[] value() default {};
	//可以这是servlet地址的多个映射类使用方法{”/test“,"test1"}
    String[] urlPatterns() default {};
	//是否在服务器启动时候加载默认-1 不加载 0加载
    int loadOnStartup() default -1;

    WebInitParam[] initParams() default {};
	//是否支持异步通知
    boolean asyncSupported() default false;

    String smallIcon() default "";

    String largeIcon() default "";

    String description() default "";

    String displayName() default "";
}

5 JSP

5.1 基础知识

  • JSP 的全称是JAVA Service pages JAVA页面服务器;
  • JSP的作用是代替servlet回传HTML文件(使用servlet回传文件工作量大,维护成本高);
  • JSP的本质就是一个servlet程序,第一次访问jsp文件,tomcat会把jsp转化为JAVA的源文件,然后编译成.class的字节码文件;
    • jsp转化为java源文件会继承HttpJspBase,而HttpJspBase又继承了Httpservlet;
    • JSP就是再html中写java代码,servlet就是在java写html代码;

5.2 page 指令

  • language jsp转化什么语言,目前支持Java;
  • contentType jsp的响应是什么类型,等同于resp.setContentType();
  • pageEncoding 页面使用的字符集;
  • import 导入包 <%@import=“java.until.*” %>;
  • errorPage jsp页面运行报错,自动跳转的页面 <%@errorPage =“/error.jsp.*” %>;
  • isErrorPage 是否为jsp的错误页面,默认为fasle;
  • session 访问jsp时,是否创建HttpSession对象;
  • extend jsp转化为java源文件,默认继承的类;
  • autoFlush 缓冲区满了是否自动刷新默认为true;
  • bufer 设置缓冲区的大小;

5.3 jsp脚本

  • 声明脚本<%! %>
    • 声明属性、方法…
<%!
public String name="";
public void  test(){
}
%>
  • 表达式脚本<%= %>
    • 数据和运算符组成的表达式;
<%=12+13%>
<%="今天不学习明天变垃圾"%>
  • 代码脚本<% %>
<%
 for (int i = 0; i < 10; i++) {
    	System.out.println(i);
    }
%>

5.4 JSP九大内置对象

方法描述
request请求对象 HttpServletRequest
respone响应对象 HttpServletRespone
pageContentPgae上下文对象 pageContent
sessionHttpsession对象
applicationServletContent上下文对象
configServletConfig配置对象
outJSPwriter对象
page当前对象
expriessionExpriession对象
  • 其中request 、pageContent、session、application是四大域对象,可以像hashmap一样存储值;
    • request 一次请求;
    • pageContent 一个jsp页面;
    • session一次会话(浏览器打开开始,浏览器关闭结束);
    • application web工程关闭结束;
    • 取值从小到大;
      • pageContent-> request -> session-> application

6 HttpServletRequset与 HttpServletRepone的常用方法

6.1 HttpServletRequset

  • HttpServletRequset的代表的是客户端发送的http请求。客户端通过http协议请求到服务器,HttpServletRequset对象封装了所有请求数据,可以通过HttpServletRequset的方法获取数据;
package net.lizheng.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name="name",value = "/RequestServletMethod")
public class RequestServletMethod extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("获取应用上下文路径"+req.getContextPath());
        System.out.println("获取请求地址url"+req.getRequestURL());
        System.out.println("获取请求地址uri"+req.getRequestURI());
        System.out.println("获取客户端的请求ip"+req.getRemoteAddr());
        System.out.println("获取客户端的请求port"+req.getRemotePort());
        System.out.println("获取请求头信息"+req.getHeader("User-Agent"));
        System.out.println("获取客户端的请求参数"+req.getParameter("username"));
        System.out.println("获取客户端的请求参数列表"+req.getParameterValues("lesson").toString());
        System.out.println("获取客户端的请求参数map"+req.getParameterMap().toString());
        System.out.println("获取客户端的查询参数"+req.getQueryString());


    }
}

在这里插入图片描述

6.2 HttpServletRepone

  • HttpServletRepone代表的是服务器向客户端的响应,里面包含了方法设置响应头响应状态的方法;
  • 使用字节流的方式
package net.lizheng.web;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "test2",value = "/RepsoneServletMethod")
public class RepsoneServletMethod extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应数据mime类型
        resp.setContentType("text/html;charset=utf-8");
        //设置响应头第一种方式
        resp.addHeader("Content-Type","text/html;charset=utf-8");
        //设置响应头第二种方式
        resp.setHeader("transform","chunked");
        //设置状态码
        resp.setStatus(1000);
        //设置编码格式
        resp.setCharacterEncoding("utf-8");
        //使用字节输出来流打印一段话
        String data="今天不学习明天变垃圾";
        ServletOutputStream outputStream = resp.getOutputStream();
        byte[] bytes = data.getBytes("UTF-8");
        outputStream.write(bytes);
    }
}

在这里插入图片描述

  • 使用字符流的方式
package net.lizheng.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "test2",value = "/RepsoneServletMethod")
public class RepsoneServletMethod extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置响应头第一种方式
        resp.addHeader("Content-Type","text/html;charset=utf-8");
        //设置状态码
        resp.setStatus(200);
        //设置编码格式
        resp.setCharacterEncoding("utf-8");
        //使用字节输出来流打印一段话
        String data="今天不学习明天变垃圾";
        PrintWriter writer = resp.getWriter();
        writer.write(data);
    }
}

在这里插入图片描述

6.3 编写一个form表单登录

      <form action="/testdemo/login" method="post">
          <div>用户名: <input type="text" name="username" /> </div>
          <div>密码: <input type="password" name="password"/> </div>
          <div> <input type="submit" value="登录"> </div>
      </form>
package net.lizheng.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name="login",value = "/login")
public class login extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if (username.equals("zhangsan")&&password.equals("123456")){
            writer.write("登录成功");
        }else {
            writer.write("登录失败");
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值