2021-11-1(java-web)

目录

一、Tomcat详解

二、http详解

什么是http

两个时代

http请求(request)

http响应

三、Maven详解

四、Servlet

        1.什么是servlet?

        2.配置环境变量?

        3.helloservlet

        4.servlet原理

         5.mapping:

        6.ServletContext

7.HttpServletResponse

8.HttpServletRequest

五、cookie

六、session


一、Tomcat详解

网站是如何进行访问的:

  1. 输入一个域名;
  2. 检查本机的C:\\Windows\System32\drivers\etc\hosts配置下有没有
    1. 有:直接返回相应的ip地址
    2. 没有:去DNS服务器上找   (全世界的域名都在这里)

二、http详解

什么是http

        http(超文本传输协议)是一个简单的请求-响应协议,通常运行在tcp之上。

                文本:html,字符串,......

                超文本:图片,音乐,视频,......

                端口:80

        https:安全的

                端口:443

两个时代

        http/1.0:客户端可以与web服务器链接后,只能获得一个web资源,断开连接

        http/1.1:客户端可以与web服务器链接后,可以获得多个web资源

http请求(request)

        客服端--发送请求--服务器

        请求行中的方式:get、post、head、delete、put

                get:请求能够携带的参数少,大小有限制,能在浏览器显示,不安全但高效

                post:大小没限制,安全但不高效

        消息头

http响应

        服务器--响应请求--客户端

        响应码:

                200:响应成功

                3××:请求重定向

                4××:资源不存在    404   403禁止访问

                5××:粗武器代码错误    500 502网关错误

三、Maven详解

maven项目架构管理工具(方便导入jar包的)

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

四、Servlet

        1.什么是servlet?

                编写一个类,实现servlet接口

                把开发好的部署到web服务器中

        2.配置环境变量?

                H2_HOME:   maven目录下的bin目录

                MAVEN_HOME:maven的目录

                在系统变量的path:%MAVEN_HOME%\bin

        3.helloservlet

                1.构建一个maven项目,删掉src目录。

                2.关于父子工程:

                        父:会有module

                        子:parent

                3.Maven环境优化

                        修改web.xlm为最新的

                        将maven的结构搭建完整

                4.编写一个servlet程序

                        编写一个普通类

                        直接继承servlet接口,继承HttpServlet

                5.编写servlet的映射

                        

<!--    注册servlet-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.kun.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

                6.配置tomcat

                7.启动测试

        4.servlet原理

         5.mapping:

                1.可以请求一个映射

                2.可以请求多个映射

                3.通配符/*

                4.可以自定义后缀

<servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

                5.优先级问题:指定了固有的映射路径最高

        6.ServletContext

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

        共享数据:(先存后取)

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        this.getInitParameter()    初始化参数
//        this.getServletConfig()      servlet配置
//        this.getServletContext()      servlet上下文
        ServletContext servletContext = this.getServletContext();
        String username = "小明";
        servletContext.setAttribute("username",username);    //将一个数据保存在ServletContext中


        System.out.println("hello");
    }

}
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().print("名字:"+username);
    }

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

         配置web.XML

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.kun.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>getc</servlet-name>
        <servlet-class>com.kun.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>

        请求转发

        ServletContext context = this.getServletContext();
        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");
        requestDispatcher.forward(req,resp);   //调用forward实现请求

        读取资源文件(properties)

                在java目录下新建properties和resources目录下新建properties,

                都被打包在同一个目录下,俗称classpath

public class ServletDemo05 extends HttpServlet {
    @Override
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop=new Properties();
        prop.load(is);
        String user=prop.getProperty("username");
        String pwd=prop.getProperty("password");

        resp.getWriter().print(user+":"+pwd);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

7.HttpServletResponse

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

  • 如果要获取请求过来的参数就找:HttpServletRequest
  • 如果要给客户响应一些信息就找:HttpServletResponse

常见应用:

        1.向浏览器输出消息

        2.下载文件

                文件的路径

                文件名

                设置想办法让浏览器能够支持下载

                获取下载文件的输入流

                创建缓冲区

                获取outputstream对象

                将flieOutputStream流写入到buffer缓冲区

                使用outputstream将缓冲区的数据输出到客户端

package com.kun.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

public class FlieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//                文件的路径
//        String realPath = this.getServletContext().getRealPath("/a.jpg");
        String realPath="Z:\\javaweb-maven\\response\\src\\main\\resources\\a.jpg";
        System.out.println("路径:"+realPath);
//        D:\A.javawed\apache-tomcat-9.0.54\webapps\r\a.jpg
//        Z:\javaweb-maven\response\src\main\resources\a.jpg
//                文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//                设置想办法让浏览器能够支持下载       中文用URLEncoder下载
        resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
//                获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
//                创建缓冲区
        int len=0;
        byte[] bytes = new byte[1024];
//                获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
//                将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端
        while ((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
        }
        out.close();
        in.close();

    }

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

验证码功能:

        前端实现js

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

package com.kun.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        如何让浏览器5秒刷新一次
        resp.setHeader("refresh","1");
//       在内容中创建一个图片
        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");
//        把图片写给浏览器
        boolean write = ImageIO.write(image,"jpg",resp.getOutputStream());


    }
//    生成随机数
    private String makeNum(){
        Random random = new Random();
        String num = random.nextInt(99999999) + "";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            sb.append("0");
        }
        num = sb.toString()+num;
        return num;

    }

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

        实现web.xml

  <servlet>
    <servlet-name>image</servlet-name>
    <servlet-class>com.kun.servlet.ImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>image</servlet-name>
    <url-pattern>/img</url-pattern>
  </servlet-mapping>

     重定向: 一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源,这个过程叫做重定向。

重定向编码:302

转发:307

常见场景:

用户登录:

/*
resp.setHeader("Location","/r/img");
resp.setStatus(302);   //状态码
* */
resp.sendRedirect("/r/img");    //<url-pattern>/img</url-pattern>

界面跳转:表单提交

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    
<html>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径 需要找到项目的路径--%>
<%--${pageContext.request.getContextPath()}代表当前项目--%>
<form action="${pageContext.request.getContextPath()}/login" method="get">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit">
</form>
</body>
</html>
  <servlet>
    <servlet-name>request</servlet-name>
    <servlet-class>com.kun.servlet.RequestTest</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>request</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
System.out.println("进入请求");
//        处理请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username);
        System.out.println(password);
//        重定向的时候一定要注意,当前路径问题
        resp.sendRedirect("/r/success.jsp");
    }
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>新界面</h1>
</body>
</html>

8.HttpServletRequest

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

1.获取前端的值

package com.kun.servlet;

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.util.Arrays;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobby");
//        后台接受乱码问题
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbies));
//        通过请求转发
//        req.getContextPath()=/req
        System.out.println(req.getContextPath());
        req.getRequestDispatcher("/success.jsp").forward(req,resp);   //转发不用加项目目录名
        //resp.sendRedirect("/req/success.jsp");      //重定向加路径名
    }

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

五、cookie

1.会话:用户打开一个浏览器,点击了很多链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话

2.一个网站怎么证明你来过?

        1.服务器给客户一个cookie,客户端下次访问服务器带上cookie就可以了

        2.服务器登记你来过,下次你访问的时候来匹配你。

3.保存会话的两种技术

        cookie:客户端技术(响应和请求)

        session:服务器技术(利用整个技术,可以保存用户的会话信息,把信息放在session中)

cookie方法:

package com.kun.servlet;

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

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
     //   resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();
//        服务器从客户端获取
        Cookie[] cookies = req.getCookies();
//        判断是否存在
        if (cookies!=null){
//           如果存在
            out.write("你上次访问的时间是:");
//            for(Cookie cookie:cookies){ }
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("Time")){   // 获取cookie
                  //  cookie.getValue();   //获取cookie的值
                    long l = Long.parseLong(cookie.getValue());
                    Date date=new Date(l);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.write("这是你第一次访问");
        }
//        服务器响应一个cookie
        Cookie cookie = new Cookie("Time",System.currentTimeMillis()+"");
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
Cookie[] cookies = req.getCookies(); //获取所有cookie信息
cookie.getName()   //获取cookie的名称
cookie.getValue(); //获取cookie的值
//创建cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
cookie.setMaxAge(24 * 60 * 60); //设置cookie的有效期

cookie细节问题

  1. 一个cookie只能保存一个信息
  2. 一个web站点可以给浏览器大宋多个cookid,最多存放20个
  3. cookie大小限制4kb
  4. 上限大概为300个(浏览器上限)

删除cookie

  1. 设置有限期,关闭浏览器,自动失效
  2. 设置有限期为0

URLEncoder.encode("小明","utf-8")   // 编码   
URLDecoder.decode(cookie.getValue(),"UTF-8")    //    解码

cookie存放位置:C:\Users\14024\AppData

六、session

1.什么是session?

  • 服务器会给每一个用户创建一个session对象
  • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就不会消失
  • 用户登录,整个网站都可以访问——保存用户信息——保存购物。。。。

2.cookie和session区别

  1. cookie是把用户的数据写给用户的浏览器,浏览器去保存
  2. session是把用户的数据写到独占session中,服务器端保存

3.使用场景(保存用户信息——保存购物)

        存数据

package com.kun.servlet;

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

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到session
        HttpSession session = req.getSession();

        //给session存东西
        session.setAttribute("name","小明");
//        Person person = new Person(18, "小明");
//        session.setAttribute("person",person);

        //获取session的Id
        String id = session.getId();
        //判断session是不是新创建
        if (session.isNew()){
            resp.getWriter().write("session 创建成功,ID"+id);
        }else {
            resp.getWriter().write("session 已经存在了"+id);
        }

        //session创建的时候做了什么事情
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);

    }

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

取数据

package com.kun.servlet;

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

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到session
        HttpSession session = req.getSession();

        //从session中获取数据
        String name = (String)session.getAttribute("name");
        //Person person = (Person)session.getAttribute("person");

        System.out.println(name);
        //System.out.println(person);
    }

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

4.注销session

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //解决乱码问题
    req.setCharacterEncoding("UTF-8");
    resp.setCharacterEncoding("UTF-8");
    resp.setContentType("text/html;charset=utf-8");

    //得到session
    HttpSession session = req.getSession();

    session.removeAttribute("name");

    //注销
    session.invalidate();

}
    <session-config>
<!--        15分钟后session自动失效-->
        <session-timeout>15</session-timeout>
    </session-config>

猜你喜欢

转载自blog.csdn.net/qq_45688193/article/details/121057507