20220715_补档_Servlet类的参数对象Request和Response

本例结构图
请添加图片描述

文章目录


maven项目的pom.xml
本例中我忘了修改标签内容,所以访问路径就变成之前项目的路径Tomcat_App了

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Tomcat_App</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>

    <!--tomcat plugin-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <!--<configuration>
                    <path>/Tomcat_App</path>
                </configuration>-->
            </plugin>
        </plugins>
    </build>
</project>

本例用到的html修改action属性,分别提交给各个servlet
修改method,分别测试GET,和POST提交方式,查看servlet中的doGet和doPost正常对应

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test for request</title>
</head>
<body>
    <form action="/Tomcat_App/req3" method="get">
        <input type="text" name="username"><br>
        <input type="password" name="password"><br>
        <input type="checkbox" name="Hobby" value="1">Movie
        <input type="checkbox" name="Hobby" value="2">Music <br>
        <input type="submit">
    </form>

</body>
</html>

文章目录


request对象的servlet类
第一个

package com.diy.web.request;

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

/**
 * request object methods
 */
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // String getMethod(); get the request ways : GET
        String method = req.getMethod();
        System.out.println(method);
        //String getContextPath(); get virtual directory : /Tomcat_App
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
        //StringBuffer getRequestURL(); get URL : http://localhost:8080/Tomcat_App/req1
        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL);
        //String getRequestURI(); get URI : /Tomcat_App/req1
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);
        /**
         * String getQueryString(); get request parameters : username=zhang&password=1234
         * the doGet method don't need to get request body, the GET way don't have request body
         * just the QueryString is enough
         */
        String queryString = req.getQueryString();
        System.out.println(queryString);

        System.out.println("========Divide line=======");
        //get request header, like user-agent , info about the browser
        String header = req.getHeader("user-agent");
        System.out.println(header);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * get request body, the body only post ways has,
         * and there two methods for get them, one for the char contents, one for the byte contents
         * here we demonstrate only use a char contents included html
         */
        //1.create a char input stream
        BufferedReader br = req.getReader();
        //2.read data
        String line = br.readLine();
        System.out.println(line);
    }
}

第二个

package com.diy.web.request;

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.BufferedReader;
import java.io.IOException;
import java.util.Map;

/**
 * Use generic method to get the request parameters
 * the method of doGet is req.getQueryString()
 * the method of doPost is getReader() for char contents
 *                          getInputStream() for byte contents
 * here we like to use one way solve both of doGet and doPost
 */
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //here we start from GET way
//        System.out.println("GET way ~~~");

        //1.First step of generic method is get Map of all parameters
        Map<String, String[]> parameterMap = req.getParameterMap();
        for (String key : parameterMap.keySet()) {
            //for one key one value, like username=zhang
            System.out.print(key + ":");

            //get values, all the values is a String[], regardless it's only one value or more
            String[] strings = parameterMap.get(key);
            for (String string : strings) {
                System.out.print(string + " ");
            }
            System.out.println();// enter to next line
        }

        //2.get values by key
        System.out.println("======divide line=======");
        String[] hobbies = req.getParameterValues("Hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        //3.get value by 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);
    }
}

乱码解决思路

package com.diy.web.request;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class URL_EncodingDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String name = "美咲";
        //encoding
        String enc = URLEncoder.encode(name, "utf-8");
        System.out.println(enc);
        //decoding
//        String dec = URLDecoder.decode(enc, "utf-8");
        String dec = URLDecoder.decode(enc, "iso-8859-1");
        System.out.println(dec);
        //convert dec to byte data
        byte[] bytes = dec.getBytes(StandardCharsets.ISO_8859_1);
        for (byte aByte : bytes) {
            System.out.print(aByte +" ");
        }
        System.out.println();

        //convert to String
        String rs = new String(bytes, "utf-8");
        System.out.println(rs);

    }
}

第三个,解决乱码

package com.diy.web.request;

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;


/**
 * before Tomcat 8, request data include 中文 submitting will occur garbled char
 */
@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();

        if ("POST".equals(method)) {
            //when request way is post, put this before req.getParameter() can solve the char garble
            req.setCharacterEncoding("utf-8");

            //through 中文 username demonstrate the char garble, attention it is a generic method, can be used by doPost
            String username = req.getParameter("username");
            System.out.println(username);

        }else if ("GET".equals(method)) {
            /**
             * Solve the problem in GET
             * char garble cause: the GET way request put parameter in URL, encoding by utf-8, by browser
             * but when tomcat receive this URL, it decodes URL by iso-8859-1
             * you can also write them as one line
             * String rs = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
             */
            //1.convert garbled char to bytes
            String username = req.getParameter("username");
            byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
            //2.create String by bytes, by utf-8
            String rs = new String(bytes,StandardCharsets.UTF_8);
            System.out.println(rs);
        }
    }

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

第四个

package com.diy.web.request;

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;

/**
 * Request forwarding
 */
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("here is demo4 ~~~~");
        //storage data in request object
        req.setAttribute("msg","hello~~~");

        //forwarding, just one line code
        req.getRequestDispatcher("/req5").forward(req, resp);
    }

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

第五个

package com.diy.web.request;

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;

/**
 * Use generic method to get the request parameters
 * the method of doGet is req.getQueryString()
 * the method of doPost is getReader() for char contents
 *                          getInputStream() for byte contents
 * here we like to use one way solve both of doGet and doPost
 */
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("here is demo5 ~~~~");

        Object msg = req.getAttribute("msg");
        System.out.println(msg);

    }

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

第六个,用idea模板生成的servlet

package com.diy.web.request;

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

/**
 * this servlet is created by diy servlet template
 */
@WebServlet("/ServByTemplate1")
public class ServletByTemplate1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

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

文章目录


response部分
第一个

package com.diy.web.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;

/**
 * Redirect by response object
 */
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response demo 1 ~~~");

//        //1.redirect first step, response status number 302
//        resp.setStatus(302);
        /**
         * 2.response one of headers, location, when the address offer to browser,
         * you need this /Tomcat_App,  it called virtual directory
         */
//        resp.setHeader("location","/Tomcat_App/resp2");

        //3.We can also use a simpler way
//        resp.sendRedirect("/Tomcat_App/resp2");
//        resp.sendRedirect("https://www.google.com/");

        //4.get virtual directory by dynamic, after you set the virtual directory in pom.xml
        String contextPath = req.getContextPath();
        resp.sendRedirect(contextPath+"/resp2");

    }

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

第二个

package com.diy.web.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;
/**
 * Redirect from demo1
 */
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response demo 2 ~~~");
    }

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

第三个

package com.diy.web.response;

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

/**
 * create char output stream by response object
 */
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //when you like to resp at line 34, do this at first, and comment out line 25
        resp.setContentType("text/html;charset=utf-8");

        //1.get a char output stream , through response object
        PrintWriter wr = resp.getWriter();

        //if you like to response a html, set header previously
//        resp.setHeader("content-type","text/html");
        wr.write("abcd");
        wr.write("<h1>ABCD<h1>");

        /**
         * when you like to response 中文, you should care about the char garbling
         *
         * the output stream create by resp no need to close, when tomcat destroy the whole servlet , it will close it
         */
        wr.write("美咲");
        wr.write("<h2>こんちは<h2>");
        }
    }

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

第四个,此处用到的图片,自行准备

package com.diy.web.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;

/**
 * create byte output stream by response object
 */
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /**
         * there's two ways, by while method, or by IOUtils.copy
         * and you don't need to close resp output stream, the tomcat do that when necessary
         */
        //1.first read the byte file
        FileInputStream fileIn = new FileInputStream("src\\Files\\Misaki.jpg");
        //2.create resp output stream
        ServletOutputStream ops = resp.getOutputStream();
        //3.copy from file read stream, and output by resp
//        byte[] buff = new byte[1024 * 10];//10kb per time
//        int vol = 0;// when all bytes be read, and there is no byte last ,will return -1, don't forget
//        while ((vol = fileIn.read(buff)) != -1) {
//            ops.write(buff,0,vol);
//        }

        /**
         * the way we copy file read stream to resp output stream is so many work
         * we can make it simpler, you should import a dependency tag in pom.xml, named commons-io
         * then you can do the same work, by just this
         */
        IOUtils.copy(fileIn,ops);

        fileIn.close();//only close this stream

    }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值