Javaweb8==通过tomcat访问到一段代码并执行,同时读取前端数据和从后端给前端返回数据。通过继承javaEE的HttpServlet类

要想实现题目叙述的功能,也能自己重写service方法,只需要在里面获取请求行的请求方式,是get还是post等共7种,根据不同的请求方式编写不同的处理代码。

@Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("重写这里面的代码,仿照HttpServlet");
        //如何调用?
        //获取请求方式,根据不同的请求方式进行不同的业务处理
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //1. 获取请求方式
        String method = request.getMethod();
        //2. 判断
        if ("GET".equals(method)) {
        // get方式的处理逻辑
        } else if ("POST".equals(method)) {
        // post方式的处理逻辑
        }
    }

javaee给我们提供好了做了上述事情的类,HttpServlet,从源码中可以看到他做的判断

 使用HttpServlet,项目结构和代码如下==========================================

TestHttpServlet.java
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;

/**
 * urlPattern: 一个Servlet可以配置多个访问路径
 */
@WebServlet(urlPatterns = {"/demo1", "/demo2"})
public class TestHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get....");
        //写收到get请求要执行的代码
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post....");
        //写收到post请求要执行的代码
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demoweb</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>demoweb</name>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <junit.version>5.7.1</junit.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.trytotry</groupId>
            <artifactId>mybaits-generator-xplugin</artifactId>
            <version>0.0.1</version>
        </dependency>
<!--        //引入servlet使得通过tomcat可以访问到一段代码-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!--
            此处为什么需要添加该标签?
            provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
            因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
            -->
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>80</port><!--访问端口号 -->
                    <!--项目访问路径
                     未配置访问路径: http://localhost:8080/demoweb/a.html
                     配置/后访问路径: http://localhost:80/a.html
                            如果配置成 /hello,访问路径会变成什么?
                            答案: http://localhost:80/hello/a.html
                            -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

打开浏览器访问路径http://localhost:80/demo1就会执行对应方法中的代码了,直接输这个路径默认是用get方法请求。

访问路径:协议+IP+端口号+配置的项目名称+HttpServlet子类中的路径

用postman发起get和post测试下:

        也可以写个b.html页面来发起请求,启动tomcat后先访问到这个静态页面,再点击提交发起请求,值测了POST。这个页面能够发起请求的原理应该是浏览器能够解析html为DOM树,点击submit后浏览器会访问到form 便签中的action属性,浏览器会根据DOM树的内容,将BOM对象的location设置成想要去的URL。回顾下JavaScript的构成,三部分:ECMAscript,BOM , DOM,三者都有同一个根对象window,又各自有子对象。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/demo1" method="post">
    <input name="username"> <br>
    <button type="submit">提交</button>
</form>
</body>
</html>

=========================================================================

路径配置我们使用的是@WebServlet标签中的urlPatterns参数数组的方式,使用urlPatterns共有5种配置方式,其他四种如下:

 第四种最好不要使用,会覆盖掉tomcat默认的访问静态资源的初始路径。

 

 另外servlet3.0之前不能使用注解配置,路径必须在web.xml中配置,

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--
Servlet 全类名
-->
<servlet>
<!-- servlet的名称,名字任意-->
<servlet-name>demo1</servlet-name>
<!--servlet的全类名-->
<servlet-class>TestHttpServlet.java</servlet-class>
</servlet>
<!--
Servlet 访问路径
-->
<servlet-mapping>
<!-- servlet的名称,要和上面的名称一致-->
<servlet-name>demo1</servlet-name>
<!-- servlet的访问路径-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>

===两种配置方式都是tomcat利用反射来获取class对象,new对象,再invoke调用方法。用注解那种方法判断下isAnnotation("WebServlet")。

=========================================================================

========================================================================        

上面我们已经在HttpServlet中收到了浏览器发过来的请求了,但并不完整,下面是详细叙述请求和响应的方法。

        tomcat这个web服务器收到HTTP请求后,会识别请求行、请求头、请求体。javaee servlet提供了一个类HttpServletRequest让我们获取识别出的数据,并提供了一个类HttpServletResponse让我们将想返回的数据封装进去然后tomcat会自动转发给浏览器。可以看到这两个类的源码中提供了多种方法实现上述操作(注意他父类中的方法)。这两个类是作为被调用方法的参数,那应该是被tomcat new出来的?后期参照源码确定。

        使用HttpServletRequest的方法取出请求数据:

 

         使用HttpServletResponse的方法封装想返回的数据:

        使用HttpServletResponse除了封装想返回的数据,还可以重定向,跳转到新的URL地址,即web服务器响应给浏览器一个新地址和状态码302,浏览器收到后看到302就会设置BOM中的location去那个新地址。HttpServlet用的方法是HttpServletResponse.sendRedirect("新地址")。如HttpServletResponse.sendRedirect("http://www.baidu.com")。

        还可以使用RequestDispatcher.forward ()实现转发,转发就是在同一个站点内跳转,可以通过设置域对象进行数据共享,是web服务器自己内部的行为,不能从新浪跳到百度,浏览器中的地址栏不会发生变化。。。

HttpServletResponse的转发和重定向_慕容囧囧-CSDN博客下面是HttpServletResponse.sendRedirect 方法实现的请求重定向与RequestDispatcher.forward 方法实现的请求转发的总结比较:(1)RequestDispatcher.forward 方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还https://blog.csdn.net/czh500/article/details/79201425

重定向和转发,一定要注意路径!如果是服务器内部使用这个路径,就不用加tomcat里设置那个初始地址。如果是返回给浏览器使用,就要加上tomcat里设置那个初始地址。

html中form标签里的action就要加上,因为我们这是在同一个tomcat项目内,所以不用加协议IP和端口,如果是其他网站的就需要加上。

==========================================================

小功能:IDEA快速创建SERVLET配置

=========================================================================

======================================================================

以下为httpservlet使用示例===================================================

 先设计一个HTTP 请求的接口为​​​​​​如下

http://localhost:8080/demoHttpServlet/login?username=root&psw=123&hobby=2

 项目结构

 新建maven web项目,建立前端页面a.html用于发起请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/demoHttpServlet/login" method="get">
    用户名:<input type="text" name="username"> <br>
    密码:<input type="text" name="psw"><br>
    爱好:<input type="checkbox" name="hobby" value="1">游泳
    <input type="checkbox" name="hobby" value="2">跑步
    <input type="submit">GET方式
</form>

<form action="/demoHttpServlet/login" method="post">
    用户名:<input type="text" name="username"> <br>
    密码:<input type="password" name="psw"><br>
    爱好:<input type="checkbox" name="hobby" value="1">游泳
    <input type="checkbox" name="hobby" value="2">跑步
    <input type="submit">POST方式
</form>
</body>
</html>

然后修改pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>httpServletDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>httpServletDemo</name>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <junit.version>5.7.1</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!--Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port><!--访问端口号 -->
                   
                    <path>/demoHttpServlet</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

然后编写后端处理代码DemoHttpServlet

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet("/login")
public class DemoHttpServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("收到了GET请求");
        //===================================================
        //从请求中获取参数的特有方法。===============================
        //获取请求方式GET/POST
        String method = request.getMethod();
        System.out.println(method);
        //获取虚拟目录项目访问路径!!!
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        //获取URL
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        //获取URI
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        //获取请求参数
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //==================================================
        //获取请求头参数======================================
        String header = request.getHeader("user-agent");
        System.out.println(header);

        //从请求中获取参数的通用方法
        System.out.println("从请求中获取参数的通用方法一====");
        Map<String, String[]> map = request.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key + ":");
            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
        System.out.println("从请求中获取参数的通用方法二====");
        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        System.out.println("从请求中获取参数的通用方法三====");
        String username = request.getParameter("username");
        String password = request.getParameter("psw");
        System.out.println(username);
        System.out.println(password);

        //GET请求解决乱码:先转回字节,再将字节转UTF-8
        //原因:浏览器进行URL编码用的UTF-8,tomcat8之前进行URL解码底层用的是ISO_8859_1
        //而我这用的是TOMCAT7插件启动
        byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
        String s = new String(bytes, StandardCharsets.UTF_8);
        System.out.println("解决中文乱码后" + s);

        //往前端响应数据


        //请求转发到另一个servlet
        request.setAttribute("test", "这是一条转发的信息");
        try {
            request.getRequestDispatcher("/testDispatcher").forward(request, response);
        } catch (ServletException e) {
            e.printStackTrace();
        }
        System.out.println("请求转发结束");

//        //请求转发到一个页面
//        try {
//            request.getRequestDispatcher("/b.html").forward(request, response);
//        } catch (ServletException e) {
//            e.printStackTrace();
//        }

//        //重定向
//        response.sendRedirect("https://www.baidu.com");
//        //response.sendRedirect("/demoHttpServlet/testDispatcher");
//        System.out.println("重定向结束");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("收到了POST请求");
        //===================================================
        //从请求中获取参数的特有方法。获取请求体参数
//        BufferedReader br = req.getReader();
//        String line = br.readLine();
//        System.out.println(line);
        //POST中使用通用方法之前要把特有方法getReader注释掉,因为他会自动把流关掉。反之通用方法在POST也会自动关流。

        //POST请求解决乱码:浏览器将请求体用输出流的方式传到web服务器tomcat,编码是按照html页面指定的UTF-8,而tomcat8之前默认的解码方式是ISO_8859_1
        //所以我们需要更改请求体的读取流的解码方式为UTF-8
        req.setCharacterEncoding("UTF-8");
        //从请求中获取参数的通用方法
        System.out.println("从请求中获取参数的通用方法一====");
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key + ":");
            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
        System.out.println("从请求中获取参数的通用方法二====");
        String[] hobbies = req.getParameterValues("hobby");
        if (hobbies != null) {
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }
        }

        System.out.println("从请求中获取参数的通用方法三====");
        String username = req.getParameter("username");
        String password = req.getParameter("psw");
        System.out.println(username);
        System.out.println(password);

        //请求转发
        req.setAttribute("test", "这是一条转发的信息");
        try {
            req.getRequestDispatcher("/testDispatcher").forward(req, resp);
        } catch (ServletException e) {
            e.printStackTrace();
        }
        System.out.println("请求转发结束");
//        //重定向
//        resp.sendRedirect("https://www.baidu.com");
//        //response.sendRedirect("/demoHttpServlet/testDispatcher");
//        System.out.println("重定向结束");
    }
}

接收转发请求的TestDispatcher.java

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Map;

@WebServlet("/testDispatcher")
public class TestDispatcher extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我从其他地方收到了一个转发");
        Object test = request.getAttribute("test");
        System.out.println(test);
        //从请求中获取参数的通用方法
        System.out.println("从请求中获取参数的通用方法一====");
        Map<String, String[]> map = request.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key + ":");
            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
        System.out.println("从请求中获取参数的通用方法二====");
        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        System.out.println("从请求中获取参数的通用方法三====");
        String username = request.getParameter("username");
        String password = request.getParameter("psw");
        System.out.println(username);
        System.out.println(password);
    }

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

接收转发请求的b.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>我是转发到的页面b.html</p>
</body>
</html>

通过源码可以看出,三个通用方法就是去判断了一下请求method是啥,在分别去请求行或者请求 体中取数据。

启动服务访问http://localhost:8080/demoHttpServlet/a.html

然后填写表单提交后在后台可以看到读取出来的请求行、头、体。

 HttpServlet中文乱码的问题也有响应的解决方法,get和post因为中文内容所在的位置不一样,有不一样的解决方法。

get将参数放在请求行中,浏览器往服务器传会按照HTML指定的UTF-8进行URL编码,服务器tomcat接收到后会进行URL解码,我们用的是TOMCAT7插件,TOMCAT8之前都是默认使用IOS8859解码,而且这个解码方式我们是不能更改的,那就只能将收到的转成二进制,再转成UTF-8,GET请求乱码的这个问题tomcat8已经解决了。

POST将参数放在请求体中,然后以流的方式传输到服务器,默认流的编码解码是IOS8859,所以我们直接指定流的编解码方式为UTF-8就行了,这个问题TOMCAT并没有解决。所以最好的方法就是换高级的tomcat,再写一句

req.setCharacterEncoding("UTF-8");

读取前端数据完成,下一步完善DemoHttpServlet.java给前端返回数据

=========================================================================

用来装返回数据的HttpServletResponse对象,tomcat之前已经根据HTTP协议给我们创建了,我们只需要往里面填行头体的值就是了。

那我们想给浏览器返回什么数据呢?在tomcat的web.xml中规定了能返回的数据类型,我们填写行头体的时候也需要在content-type中写明。叫做MIME类型。MIME类型_小影-CSDN博客_mime类型

 比如我们想返回一句话:那就需要更改DemoHttpServlet.java为

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet("/login")
public class DemoHttpServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("收到了GET请求");
        //===================================================
        //从请求中获取参数的特有方法。===============================
        //获取请求方式GET/POST
        String method = request.getMethod();
        System.out.println(method);
        //获取虚拟目录项目访问路径!!!
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        //获取URL
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        //获取URI
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        //获取请求参数
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //==================================================
        //获取请求头参数======================================
        String header = request.getHeader("user-agent");
        System.out.println(header);

        //从请求中获取参数的通用方法
        System.out.println("从请求中获取参数的通用方法一====");
        Map<String, String[]> map = request.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key + ":");
            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
        System.out.println("从请求中获取参数的通用方法二====");
        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        System.out.println("从请求中获取参数的通用方法三====");
        String username = request.getParameter("username");
        String password = request.getParameter("psw");
        System.out.println(username);
        System.out.println(password);

        //GET请求解决乱码:先转回字节,再将字节转UTF-8
        //原因:浏览器进行URL编码用的UTF-8,tomcat8之前进行URL解码底层用的是ISO_8859_1
        //而我这用的是TOMCAT7插件启动
        byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
        String s = new String(bytes, StandardCharsets.UTF_8);
        System.out.println("解决中文乱码后" + s);

        //往前端响应数据(使用字符流)
        response.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
        PrintWriter writer = response.getWriter();
        writer.write("处理GET请求,这是从web服务器返回的一条消息");
        System.out.println("往前端写数据结束");


        //请求转发到另一个servlet
//        request.setAttribute("test", "这是一条转发的信息");
//        try {
//            request.getRequestDispatcher("/testDispatcher").forward(request, response);
//        } catch (ServletException e) {
//            e.printStackTrace();
//        }
//        System.out.println("请求转发结束");

//        //请求转发到一个页面
//        try {
//            request.getRequestDispatcher("/b.html").forward(request, response);
//        } catch (ServletException e) {
//            e.printStackTrace();
//        }

//        //重定向
//        response.sendRedirect("https://www.baidu.com");
//        //response.sendRedirect("/demoHttpServlet/testDispatcher");
//        System.out.println("重定向结束");


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("收到了POST请求");
        //===================================================
        //从请求中获取参数的特有方法。获取请求体参数
//        BufferedReader br = req.getReader();
//        String line = br.readLine();
//        System.out.println(line);
        //POST中使用通用方法之前要把特有方法getReader注释掉,因为他会自动把流关掉。反之通用方法在POST也会自动关流。

        //POST请求解决乱码:浏览器将请求体用输出流的方式传到web服务器tomcat,编码是按照html页面指定的UTF-8,而tomcat8之前默认的解码方式是ISO_8859_1
        //所以我们需要更改请求体的读取流的解码方式为UTF-8
        req.setCharacterEncoding("UTF-8");
        //从请求中获取参数的通用方法
        System.out.println("从请求中获取参数的通用方法一====");
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key + ":");
            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
        System.out.println("从请求中获取参数的通用方法二====");
        String[] hobbies = req.getParameterValues("hobby");
        if (hobbies != null) {
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }
        }

        System.out.println("从请求中获取参数的通用方法三====");
        String username = req.getParameter("username");
        String password = req.getParameter("psw");
        System.out.println(username);
        System.out.println(password);

        //往前端响应数据(使用字符流)
        resp.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
        PrintWriter writer = resp.getWriter();
        writer.write("处理POST请求,这是从web服务器返回的一条消息");
        System.out.println("往前端写完数据了");


//        //请求转发
//        req.setAttribute("test", "这是一条转发的信息");
//        try {
//            req.getRequestDispatcher("/testDispatcher").forward(req, resp);
//        } catch (ServletException e) {
//            e.printStackTrace();
//        }
//        System.out.println("请求转发结束");
//        //重定向
//        resp.sendRedirect("https://www.baidu.com");
//        String contextPath = req.getContextPath();
//        //response.sendRedirect("/demoHttpServlet/testDispatcher");
//        System.out.println("重定向结束");
    }
}

 

比如我们想返回一张图片:那就需要更改DemoHttpServlet.java为

//        //往前端响应数据(使用字符流)
//        response.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
//        PrintWriter writer = response.getWriter();
//        writer.write("处理GET请求,这是从web服务器返回的一条消息");
//        System.out.println("往前端写数据结束,response响应结束后会自动关流");

        //往前端响应数据(使用字节流)
        //1. 读取文件
        FileInputStream fis = new FileInputStream("E:\\ideaProject\\javaweb\\8httpservlettomcat\\请求响应图示.png");
        //2. 获取response字节输出流
        ServletOutputStream os = response.getOutputStream();
        //3. 完成流的copy
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = fis.read(buff)) != -1) {
            os.write(buff, 0, len);
        }
        fis.close();
        System.out.println("往前端写数据结束,response响应结束后会自动关流");

或者使用Apache提供的io流工具包,commons-io

首先引入依赖

 <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

然后更改DemoHttpServlet.java为

//        //往前端响应数据(使用字符流)
//        response.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
//        PrintWriter writer = response.getWriter();
//        writer.write("处理GET请求,这是从web服务器返回的一条消息");
//        System.out.println("往前端写数据结束,response响应结束后会自动关流");

        //往前端响应数据(使用字节流)
        //1. 读取文件
        FileInputStream fis = new FileInputStream("E:\\ideaProject\\javaweb\\8httpservlettomcat\\请求响应图示.png");
        //2. 获取response字节输出流
        ServletOutputStream os = response.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);//调用commons io包提供的方法
        fis.close();
        System.out.println("往前端写数据结束,response响应结束后会自动关流");

发起GET请求看到图片加载到浏览器了

 如上,我们已经实现了给浏览器响应(返回)一个页面、一句话、一张图片、一个新的地址,基本覆盖了所有能响应的东西了。

====================================================================

下一篇来做一个登录注册的demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值