web前端快速入门(三)(HTTP、Tomcat、Servlet)

456 阅读4分钟

本人已参与[新人创作礼]活动,一起开启掘金创作之路。




一、JavaWeb技术栈

在这里插入图片描述

二、HTTP

在这里插入图片描述

三、HTTP-请求数据格式

在这里插入图片描述

四、HTTP-响应数据格式

在这里插入图片描述 在这里插入图片描述

五、Web服务器

web服务器作用:
		*封装HTTP协议操作,简化开发
		*可以将web项目部署到服务器中,对外提供网上浏览服务
		*Tomcat是一个轻量级的Web服务器,支持Servlet/JSP少量JavaEE规范,也称Web容器,Servlet容器。

在这里插入图片描述

六、Servlet技术

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述  在这里插入图片描述

package cn.hncj;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created on 2022/3/24.
 *
 * @author Hou chaof
 */
public class MyHttpServlet implements Servlet {

    @Override
    public void init(ServletConfig config) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //根据请求方式不同,进行分别的处理
        HttpServletRequest request= (HttpServletRequest)req;
        //1.获取请求方式
        String method = request.getMethod();
        //2.判断
        if ("GET".equals(method)){
            //get方式的处理逻辑
            doGet(req,res);
        }else if ("POST".equals(method)){
            //post方式的处理逻辑
            doPost(req,res);
        }

    }

    protected void doPost(ServletRequest req, ServletResponse res) {
    }

    protected void doGet(ServletRequest req, ServletResponse res) {
    }


    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

package cn.hncj;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created on 2022/3/24.
 *
 * @author Hou chaof
 */
@WebServlet("/demo2")
public class ServletDemo2 extends MyHttpServlet {
    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {
        System.out.println("get!!!!!");
    }

    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
        System.out.println("post!!!!!!");
    }
}

七、urlPattern配置

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

八、request、response

在这里插入图片描述

package cn.hncj;

/**
 * Created on 2022/3/24.
 *
 * @author Hou chaof
 */

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;

/**
* Description: urlPattern: 一个Servlet可以配置多个访问路径
* @date:2022/3/24 20:52
* @params: 
* @return:  
*/
@WebServlet(urlPatterns = {"/demo3"})
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用req对象,获取请求参数
        String name = req.getParameter("name"); //url?name=zhangsan
        //使用resp对象,设置响应数据
        resp.setHeader("context-type","text/html;charset=utf-8");
        resp.getWriter().write("<h1>"+name+",hello!!+</h1>");
    }

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

    }
}

页面显示如下:

在这里插入图片描述

8.1学习Request

Request 继承体系: 在这里插入图片描述

Request 获取请求数据: 在这里插入图片描述

Request通用方式获取请求参数:

在这里插入图片描述

package cn.hncj;

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

/**
 * Created on 2022/3/25.
 *
 * @author Hou chaof
 */
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1 获取所有参数的map集合
        Map<String, String[]> map = req.getParameterMap();
        //for循环遍历: 集合内存储类型为字符串  变量名s: 集合变量名.获取Map集合的所有键名
        for (String key : map.keySet()) {
            //username:zhangsan 的格式,下输出不换行
            System.out.print(key + ":");
            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + "");
            }
            System.out.println();
        }
        System.out.println("----------------");
        //2.根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        //3.根据key 获取单个参数值
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username);
        System.out.println(password);
    }

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


	
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<body>
<form action="/req1" method="post">
    <input type="text" name="username"><br>
    <input type="password" name="password"><br>
    <input type="checkbox" name="hobby" value="1"> 游泳
    <input type="checkbox" name="hobby" value="2"> 爬山<br>
    <input type="submit">
</form>

</body>
</html>
Request请求参数中文乱码处理
package cn.hncj;

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.nio.charset.StandardCharsets;

/**
 * Created on 2022/3/25.
 *
 * @author Hou chaof
 */
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决post乱码 POST.getReader()
        req.setCharacterEncoding("utf-8");//设置字符输入流的编码
        //获取username
        String username = req.getParameter("username");
        System.out.println(username);
        //GET获取参数的方式:getQueryString
        //对乱码数据进行解码,转为字节数组
        //byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
        //字节数组解码
        //username = new String(bytes, StandardCharsets.UTF_8);
        username=new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
        System.out.println("解决乱码后"+ username);
    }

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

Request 请求转发:

在这里插入图片描述

package cn.hncj;

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.nio.charset.StandardCharsets;

/**
 * Created on 2022/3/25.
 * 请求转发
 * @author Hou chaof
 */
@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo3...");
        //存储数据
        req.setAttribute("msg","hello");
        //请求转发
        req.getRequestDispatcher("/req4").forward(req,resp);
    }

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






package cn.hncj;

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.nio.charset.StandardCharsets;

/**
 * Created on 2022/3/25.
 *
 * @author Hou chaof
 */
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dmeo4....");
        //获取数据
        Object msg = req.getAttribute("msg");
        System.out.println(msg);
    }

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

访问http://localhost:8080/req3,控制台会输出hello,证明数据共享完成。

8.2 学习Response

在这里插入图片描述

	Response 设置响应数据功能介绍

在这里插入图片描述

Response 完成重定向

在这里插入图片描述 在这里插入图片描述

package cn.hncj.response;

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;

/**
 * Created on 2022/3/25.
 *
 * @author Hou chaof
 */
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
     @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         System.out.println("resp1...");
         //重定向
         //1.设置响应状态码 302
         //resp.setStatus(302);
         //2.设置响应头 location
         //resp.setHeader("Location","/resp2");
         //动态获取虚拟目录
         String contextPath = req.getContextPath();
         //简化方式完成重定向
         resp.sendRedirect(contextPath+"/resp2");

         }

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

Response响应字符数据

w在这里插入图片描述

package cn.hncj.response;

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;

/**
 * Created on 2022/3/25.
 *  相应字符数据: 设置字符数据的响应体
 * @author Hou chaof
 */
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8"); //解决中文乱码
        //1.获取字符输出流
        PrintWriter writer = resp.getWriter();
        //resp.setHeader("content-type","text/html");
        writer.write("你好");
        writer.write("<h1>bbbb</h1>");
    }

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

Response响应字节数据:

在这里插入图片描述

package cn.hncj.response;

import org.apache.commons.io.IOUtils;

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.FileInputStream;
import java.io.IOException;

/**
 * Created on 2022/3/25.
 * 响应字节数据:设置字节数据的响应体
 *
 * @author Hou chaof
 */
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.读取文件
        FileInputStream fis = new FileInputStream("D://a.jpg");
        //2.获取response字节输出流
        ServletOutputStream os = resp.getOutputStream();
        //3.完成流的copy
        // byte[] buff=new byte[1024];
        //int len=0;
        // while ((len=fis.read(buff))!= -1){
        //      os.write(buff,0,len);
        //  }
        IOUtils.copy(fis, os);
        fis.close();

    }

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