在昨天呢,我已经把Javase的全部内容更新完了。

今天来点猛的。javaweb一天更完。

javaWeb

1 基本概念

1.1 web的分类

静态web网站:

数据不会发生改变,对任何用户都一样,无法使用户数据持久化

使用的技术:html, css,javaScript

动态web网站:

数据会根据用户的不同而不同,可持久化数据

使用技术:Jsp/Servelt html ,css,javaScript

1.2、 web应用流程图

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包

1.3、了解软件的步骤

  1. 解压安装
  2. 了解软件的目录结构和配置文件
  3. 了解基础使用步骤

2、Tomcat

2.1 下载安装

下载网址:https://tomcat.apache.org/download-10.cgi

java 直接浏览器缓存流 java 直接浏览器缓存流程图_java 直接浏览器缓存流_02

2.2 配置Tomcat和了解目录结构

目录结构的情况

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_03

服务器配置文件

java 直接浏览器缓存流 java 直接浏览器缓存流程图_java 直接浏览器缓存流_04

server.xml详解

端口配置:

默认端口是 8080

connectionTimeout="20000"               redirectPort="8443" URIEncoding="UTF-8"/>123

域名配置和请求资源路径

默认域名是 locahost === 127.0.0.1

默认资源文件是 webapps

可以通过C:\Windows\System32\drivers\etc的hots文件重新配置本地的域名 可将127.0.0.1 的对应得域名改成任意域名

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_05

        unpackWARs="true" autoDeploy="true">12

2.3 启动关闭服务器

java 直接浏览器缓存流 java 直接浏览器缓存流程图_java 直接浏览器缓存流_06

2.4 如何网站的IP地址如何获取

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_07

2.5发布web网站的流程

1.在Tomcat的webapps文件中新建一个文件夹作为文件目录

文件java的目录详情

webapps :

---- 项目名(文件夹名):

---- WEI-INF

----web.xml web应用程序的配置文件

-----classes servlet

----- lib 链接的jar包

---- pages 请求的页面 jsp,htm

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mfkXrcT-1595228459618)(javaWeb(1)].assets/1594300116028.png)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CGYowNYh-1595228459619)(javaWeb(1)].assets/1594300134321.png)

2.编写配置文件web.xml

characterEncodingFilter    org.springframework.web.filter.CharacterEncodingFilter          encoding      UTF-8            characterEncodingFilter    /*  1234567891011121314

3.编写页面(默认请求页面时index页面)

4.启动服务器,访问 locahost:8080/项目名

3.HTTP 协议

基础概念

超文本传输协议,建立在TCP/ip协议之上

特点:一次请求,一次响应,无状态

Http协议有两个版本:

http1.0

http1.1 === https 更加安全

深入分析

请求行:

Request URL: https://www.baidu.com/Request 请求的域名

Request Method: GET

Status Code: 200 OK

Remote Address: 14.215.177.39:443 请求域名对应的ip地址

Referrer Policy: no-referrer-when-downgrade 当https协议降级为http协议时,不发送referrer信息

Request Method 是请求方法 常用请求方法有POST,DELETE,PUT,GET(对应数据库的增删改查)

Status Code: 请求的结果大致分类

  • 2XX 请求成功
  • 3XX 重定向(跳转到另一个页面)
  • 4XX 找不到资源
  • 5XX 服务器出错

请求头:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 接受的文件类型

Accept-Encoding: gzip, deflate, br 接受的文件编码格式

Accept-Language: zh-CN,zh;q=0.9 接收的语言类型

Cookie: 存放服务器辨识用户身份证明的空间

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 浏览器的标识

响应头:

Cache-Control: private 缓存控制

Content-Type: text/html;charset=utf-8 响应体的文件格式和编码

Expires: Sun, 12 Jul 2020 07:08:50 GMT 响应资源时间

4.Maven

基础知识

下载管理jar包的工具

1.maven下载jar包的流程图

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_08

Maven的安装

1.从官网下载安装maven,在本地解压

2.了解目录结构

java 直接浏览器缓存流 java 直接浏览器缓存流程图_java 直接浏览器缓存流_09

3.win10配置系统环境变量

M2_HOME 路径:maven的安装目录下的bin目录

MAVEN_HOME maven的安装目录

在系统的path中配置%MAVEN_HOME%\bin

4.测试在cmd中输入mvn -version,出现下图成功

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_10

5.配置阿里云镜像

打开maven目录下的conf目录编辑settings.xml文件

在(注意是有加s的标签)中添加

nexus-aliyun      *,!jeecg,!jeecg-snapshots      Nexus aliyun      http://maven.aliyun.com/nexus/content/groups/public1234567
  1. 设置本地仓库

找到settings.xml中的 localRepository 标签改为你想存放jar的目录,具体格式如下

D:\Environment\apache-maven-3.6.2\maven-repo12

IDEA 与Maven

两篇博文搞定

idea的配置

idea配置启动maven项目

5. Servlet

基础知识

Servlet是一个接口,用于java的web 开发,供服务器调用的应用服务

Servlet的继承结构:

java 直接浏览器缓存流 java 直接浏览器缓存流程图_java 直接浏览器缓存流_11

GeenericServlet只实现部分接口

HtppServlet 实现完整的接口。其核心的方法是service(HttpServletRequest req, HttpServletResponse resp)负责将不同请求方法发放到不同的方法中

一般情况下我们做的基础的业务就是继承HttpServelt 然后重写它请求方法(通常是get和post方法)

下图是我思考的关于处理请求的流程,未必准确

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_12

servlet生命周期:

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

实践入门 helloServlet

基本所有web项目的编写都遵循此流程

1.新建maven项目,配置pom.xml,导入项目需要的jar包

javax.servlet            javax.servlet-api            4.0.1              123456789101112
  1. 编写业务代码
public class HelloServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {            resp.getWriter().print("

Hello Servlet

");

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

3.配置weapp下的WEB-INF目录下的web.xml文件

/span> "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >  Archetype Created Web Application       demo-01    cn.codeancat.servlet.HelloServlet          demo-01    /hello  12345678910111213141516171819
  1. 配置Tomcat打包,运行结果

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_13

web.xml中Mapping配置问题

demo-01       /*       demo-01       /hello/*    error    /hello/error           hello      *.qinjiang  123456789101112131415161718192021222324252627282930

servletContext

servlet的上下文,用于使两个servelt可以进行数据交互

ServletContext在整个会话就是用户打开浏览器到关闭浏览器的过程只有一个。属于单例对象

下列是交互流程示意图

java 直接浏览器缓存流 java 直接浏览器缓存流程图_java 直接浏览器缓存流_14

.png)

案例演示:
1,数据共享

SetServletContext类存放数据

ServletContext servletContext =this.getServletContext(); String name="赵泽桦"; servletContext.setAttribute("name",name);1234

GetServletContext 类获取数据

ServletContext servletContext =this.getServletContext(); String name =(String)servletContext.getAttribute("name"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf8"); resp.getWriter().print("name:"+name);123456
2.同web.xml读取初始化参数
ServletContext servletContext =this.getServletContext();String name=servletContext.getInitParameter("username");resp.getWriter().print(name);1234

web.xml的配置

username    root  123456
3.通过properties文件读取配置
ServletContext servletContext =this.getServletContext();        //路径为打包后的文件的路径        InputStream inputStream =servletContext.getResourceAsStream("WEB-INF/classes/db.properties");        Properties properties=new Properties();        properties.load(inputStream);        String name=properties.getProperty("username");        String psw =properties.getProperty("password");        resp.getWriter().print(name+":"+psw);123456789

db.properties的位置

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_15

db.properties的文件内容

username=rootpassword=123456123
4.实现转发请求
ServletContext servletContext =this.getServletContext(); System.out.println("进入servletCoentext"); servletContext.getRequestDispatcher("/read").forward(req,resp);1234

HttpServeltResponse

基础概念

向前端返回数据的两种方式

PrintWriter getWriter() throws IOException;ServletOutputStream() getOutputStream;123

设置响应头的参数

void sendRedirect(String var1) throws IOException   // 重定向,跳转连接void setContentType(String var1); //设置响应文件的格式void setCharacterEncoding(String var1); //设置响应文件的编码void setStatus(int var1); //设置响应的状态码void setHeader(String var1, String var2);  //设置响应头void setDateHeader(String var1, long var2); //数据响应设置,多用于处理缓存1234567

响应的状态码

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_16

案例演示:

1.下载

@Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {          //1.文件位置         String path="C:\\Users\\zzh\\Desktop\\现在\\vue.js.xmind";          //2.设置文件名,注意编码格式 ****          String fileName = path.substring(path.lastIndexOf("\\")+1);         //3.获取文件的输入流         FileInputStream fileInputStream = new FileInputStream(path);         //4.获取Response的输出流         OutputStream outputStream =resp.getOutputStream();        //5设置输出的文件格式和编码格式 ****         resp.setHeader("Content-Disposition","atachment;filename="+ URLEncoder.encode(fileName,"utf-8"));         //6.将输入流读入并输出到输出流        byte[] bytes = new byte[1024];        int len=0;        while ((len=fileInputStream.read(bytes))>0){            outputStream.write(bytes,0,len);        }        //7.关闭输入输出流        outputStream.close();        fileInputStream.close();    }1234567891011121314151617181920212223

2.验证码

@Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         //1.创建画布,设置画布的宽和高        BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_3BYTE_BGR);        //2.获取画笔         Graphics2D graphics =(Graphics2D) bufferedImage.getGraphics();        //3.设置画笔颜色,填充画布颜色        graphics.setColor(Color.white);        graphics.fillRect(0,0,80,20);        //4.设置画笔颜色,字体        graphics.setColor(Color.blue);        graphics.setFont(new Font(null,Font.BOLD,20));        //5.随机生成数字  *****        String randomNum =getRandomInt();        System.out.println(randomNum);        //6.将生成的数字写入画布        graphics.drawString(randomNum,0,20);        //7.设置响应头        //设置刷新时间        resp.setHeader("refresh","3");        //设置文件格式        resp.setContentType("image/jpeg");        //设置无缓存        resp.setDateHeader("expires",-1);        resp.setHeader("Cache-Control","no-cache");        resp.setHeader("Pragma","no-cache");        //8.输出 ****        ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());    }    private String getRandomInt(){        Random random = new Random();        String num = random.nextInt(9999999)+"";        StringBuffer stringBuffer =new StringBuffer();        for(int start = 0;  start < 7 -num.length(); start++){            stringBuffer.append(0);        }        return num+stringBuffer.toString();    }12345678910111213141516171819202122232425262728293031323334353637383940414243

3.重定向(常用于登录界面)

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {               System.out.println("进入SendRedirectServlet");        resp.sendRedirect("/s3/captcha");    }1234567

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_17

HttpServletRequest

基础概念

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

从获取数据的方式

Collection getParts() throws IOException, ServletException; // 将前端的表格拆分多个部分获取 String getParameter(String var1); //获取前端的传参,var的取值为前端的name属性 Object getAttribute(String var1); //从ServletContext中获取数据12345
案例演示

目录结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FogLs1gc-1595228459639)(javaWeb(1)].assets/1594612791730.png)

前端代码:

用户名:    密码:      1234567891011121314

后端代码:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        String name =req.getParameter("username");        String password =req.getParameter("password");        System.out.println(name+" :" +password);        resp.sendRedirect("/s4/success.jsp"); }12345678

6. 会话技术

基础概念

会话:从用户打开浏览器到关闭浏览器的过程

会话技术:用于确认用户的登录的状态

cookie

基础概念

cookie :

  1. 存放于浏览器的存储空间(会生成相关的文件)
2. 大小不超过4kb   3.  每个站点(域名)最多20个12

以键值对的方式存放数据

常用方法:

//maxAge生存时间 ,若为负数则一直存在,默认为-1

public void setMaxAge(int expiry) { this.maxAge = expiry;}public int getMaxAge() { return this.maxAge;}

// 获取键名

public String getName() { return this.name;}

//获取值

public void setValue(String newValue) { this.value = newValue;}public String getValue() { return this.value;}

演示案例

放置cookie

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        req.setCharacterEncoding("utf-8");        resp.setCharacterEncoding("utf-8");        Cookie cookie = new Cookie("name", URLEncoder.encode("赵泽桦","utf8"));        resp.addCookie(cookie);        resp.sendRedirect("/getCookie");      //  req.getRequestDispatcher("/getCookie").forward(req,resp);转发无法获取,因为转发是服务器的之间的servlet的交互    }123456789

获取cookie

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.setContentType("text/html");        resp.setCharacterEncoding("utf-8");        req.setCharacterEncoding("utf-8");        PrintWriter writer = resp.getWriter();        Cookie[] cookies=req.getCookies();        for(int i = 0; i < cookies.length; i++){               if(cookies[i].getName().equals("name"))               writer.write("

name:"+ URLDecoder.decode(cookies[i].getValue(),"utf8")+"

");       }   }1234567891011121314

在浏览器查看cookie

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_18

杀死cookie

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.setContentType("text/html");        resp.setCharacterEncoding("utf-8");        req.setCharacterEncoding("utf-8");        PrintWriter writer = resp.getWriter();        Cookie[] cookies=req.getCookies();        Cookie cookie =null;        for(int i = 0; i < cookies.length; i++){            cookie =cookies[i];            if(cookie.getName().equals("name")){                cookie.setMaxAge(0);                break;            }        }        resp.addCookie(cookie);        writer.write("

cookie被杀死

");   }12345678910111213141516171819

session(重点)

基础概念
  1. 存放于服务端,可用于登录,购物车,秒杀
  2. 以键值对方式存放
  3. 大小不做限制

cookie 与 session 的搭配使用 用户登录示意图

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_19

Session和cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务创建;

常用方法:

long getCreationTime();    //创建时间    String getId();            //服务器识别不同浏览器的标识    long getLastAccessedTime();  //上次访问时间    ServletContext getServletContext();  //获取全局上下文    void setMaxInactiveInterval(int var1); //设置最大生存时间    int getMaxInactiveInterval();    void invalidate() //注销Session 12345678
演示案例

存放一个Session

@Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       req.setCharacterEncoding("utf8");       resp.setContentType("utf8");       HttpSession session =req.getSession();       Pepole pepole =new Pepole("赵泽桦","157zeye",15);       session.setAttribute("pepole",pepole);       resp.sendRedirect("/getSession");    }123456789101112

获取一个Session

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf8");
        HttpSession session=req.getSession();
        Pepole pepole=(Pepole) session.getAttribute("pepole");
        PrintWriter writer = resp.getWriter();
        writer.write("

"+pepole.toString()+"

");
}
1234567891011121314

注销Session

通过代码:

resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        HttpSession session = req.getSession();
        //移除某个键值对
        session.removeAttribute("pepole");
        //彻底杀死session
        session.invalidate();
        if(session.getId().length()<=0){
            resp.getWriter().write("

Session被杀死

");
}
12345678910111213

通过web.xml配置

15
12345

7. JSP

本质上:就是一个Servelt,向tomcat 请求jsp时会将它自动编译

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_20

最重要的方法:

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException 
123

jspService中内置对象

final javax.servlet.jsp.PageContext pageContext;   //存储数据,只在本页面有效
    javax.servlet.http.HttpSession session = null;      
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
123456

通过JspWriter 方法将一个标签或者变量,表达式输出成html页面

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_21

基础语法

<="输出文件或者html代码" >
12345
jsp指令
1234567
jsp常用内置对象
pageContext.setAttribute("name1","秦疆1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","秦疆2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","秦疆3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","秦疆4号");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
123456

jstl

将jsp中脚本片段标签化,便于与html代码配合使用

EL表达式:${ }

获取数据执行运算获取web开发的常用对象JSP标签

http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>
123456789101112

JSTL表达式

JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!

格式化标签

SQL标签

XML 标签

核心标签 (掌握部分)

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_22

JSTL标签库使用步骤

引入对应的 taglib使用其中的方法在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误

8. javaBeen

1.所有成员变量私有化

2.所有成员变量都对应的get,set方法

3.public的构造函数

用于与数据库的字段做一一映射关系,保存从数据库取出的数据

9.MVC架构示意图

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb 常用jar包_23

10.Filter(过滤器 重点)

作用:屏蔽一些非法请求

实现的流程:

  • 实现Filter接口,重写init() ,doFilter(),destroy(),一般只重写doFilter()就可以
  • init() 是服务器启动时执行的方法,destroy()服务器关闭时执行,doFilter是有请求时执行
doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
  /*servletReques 可以强转成HttpServletReques ,servletResponse也一样
  *filterChain中的dofilter(HttpServletReques req,HttpServletResponse resp)
  *是放行请求,如果不执行该方法就请求就无法到达对应的servlet
  */
123456
  • 配置web.xml 具体配置基本与servlet相同

案例演示

判断用户是否登录案例流程图:

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_24

文件结构目录:

java 直接浏览器缓存流 java 直接浏览器缓存流程图_javaweb上传文件_25

过滤器PrivienterFilter代码:

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        HttpServletResponse response=(HttpServletResponse) servletResponse;
        HttpSession session=request.getSession();
        User user=(User) session.getAttribute("user");
        if(user==null){
             response.sendRedirect("/login.jsp");
        }else {
            filterChain.doFilter(request,response);
        }
    }
1234567891011121314

SetDefaultNameServlet登录

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user =new User(1,"赵泽桦","zzh");
        HttpSession session=req.getSession();
        session.setAttribute("user",user);
        req.getRequestDispatcher("/sys/user.jsp").forward(req,resp);
    }
123456789

login.jsp

Title登录