Eclipse中Tomcat实现表单Get和Post响应

简介: 前言: URL: 统一资源定位符。http://localhost:8080/day09/testImg.html。只能定位互联网资源。是URI的子集。 URI: 统一资源标记符。/day09/hello。

前言:

想了解 HTTP协议内容的可以参考:
https://blog.csdn.net/qq_38409944/article/details/80628723

URL:  统一资源定位符。http://localhost:8080/day09/testImg.html。只能定位互联网资源。是URI的子集。
URI: 统一资源标记符。/day09/hello。用于标记任何资源。可以是本地文件系统,局域网的资源(//192.168.14.10/myweb/index.html),可以是互联网。

首先看一下Get和Post之间的差异:
这里写图片描述
注意:当页面刷新的时候,数据会自动重新提交,但是没有提醒

Get:

GET提交参数数据有限制,不超过1KB。
GET方式不适合提交敏感密码。
浏览器直接访问的请求,默认提交方式是GET方式
地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。

POST:

POST提交的参数数据没有限制。
POST方式提交敏感数据。
参数不会跟着URI后面。参数而是跟在请求的实体内容中。  
没有?开头,多个参数之间以&分割。

表单的话 一般都是POST提交。
GET提交的话 账号密码都会显示在URL中,如:

http://localhost:8080/haha/zz?name=11&password=d

而POST提交的话,账号密码不会显示,而是放在HTTP协议中的实体内容中

看一下前后台交互的原理图:
这里写图片描述

 核心的API:
    请求行: 
        request.getMethod();   请求方式 GET 还是POST
        request.getRequetURI()      请求资源的URI位置
        // request.getRequetURL()   请求资源的URL位置
        request.getProtocol()   请求http协议版本
                    
    请求头:
        request.getHeader("名称")   根据请求头获取请求值
        request.getHeaderNames()    获取所有的请求头名称

    实体内容:
        request.getInputStream()     
        获取实体内容数据   主要是POST获取账号密码。

首先创建表单:

<body>
<form action="/haha/zz" method="get">
<input type="text" name="name"/>
<input type="password" name="password" />
<input type="submit" value="tijiao" />
</form>
<form action="/haha/zz" method="post">
<input type="text" name="name"/>
<input type="password" name="password" />
<input type="submit" value="tijiao" />
</form>
</body>

注意:

action="/haha/zz"中 haha是项目名字 zz是在src中创建的servlet文件

其实action填的是你要传递的URI位置。
如:

http://localhost:8080/haha/zz

/haha/zz取得就是8080后面的URI位置。

Servlet:
HttpServletRequest对象接受前台 Http请求,包括请求行,请求头(多个key-value对象),可选)实体内容。
Http请求数据被包装在 HttpServletRequest对象中。

package a;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/zz")
public class zz extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        t1(request);
        t2(request);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {

        t1(request);
        t2(request);
        t3(request);
    }

    private void t3(HttpServletRequest request) throws IOException {
        InputStream inputStream=request.getInputStream();
        byte[] buffer=new byte[1024];
        int len=0;
        while((len=inputStream.read(buffer))!=-1) {
            String string=new String(buffer, 0, len);
            System.out.println(string);
        }
    }

    private void t2(HttpServletRequest request) {
        Enumeration<String> enumeration=request.getHeaderNames();
        while(enumeration.hasMoreElements()) {
            String name=enumeration.nextElement();
            String content=request.getHeader(name);
            System.out.println(name+" "+content);
        }
    }

    private void t1(HttpServletRequest request) {
        System.out.println(request.getMethod());
        System.out.println(request.getRequestURI());
        System.out.println(request.getRequestURL());
        System.out.println(request.getProtocol());
    }

}

输出请求行函数:

private void t1(HttpServletRequest request) {
        System.out.println(request.getMethod());
        System.out.println(request.getRequestURI());
        System.out.println(request.getRequestURL());
        System.out.println(request.getProtocol());
    }

请求头:

private void t2(HttpServletRequest request) {
Enumeration<String> enumeration=request.getHeaderNames();
        while(enumeration.hasMoreElements()) {
            String name=enumeration.nextElement();
            String content=request.getHeader(name);
            System.out.println(name+" "+content);
        }
    }

实体内容函数:

private void t3(HttpServletRequest request)   
throws IOException {
        InputStream inputStream=request.getInputStream();
        byte[] buffer=new byte[1024];
        int len=0;
        while((len=inputStream.read(buffer))!=-1) {
            String string=new String(buffer, 0, len);
            System.out.println(string);
        }
    }

总结:

1. POST实体内容即t3得到的是输入的账号和密码。
而GET实体内容一般无内容 因为账号和密码会显示在URL框内了
2. 如果修改了表单或者Servlet,只要直接ctrl+S保存就行,  
   然后等待Tomcat自动更新下即可。
3. doGet(HttpServletRequest request,   
HttpServletResponse response)是GET格式,调用服务器的方法。
 doPost(HttpServletRequest request,   
 HttpServletResponse resp)是POST格式,调用服务器的方法
4. 浏览器默认是GET格式,所以当你启动servlet的时候,  
   默认是调用doGet方法
5. 当你点击提交按钮的时候,页面会跳转到servlet页面,  
   然后根据Get还是Post来选择调用doGet还是doPost方法。

servlet中的service()方法重写与不重写:

在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet或是doPost方法

从上面可以看出 这里的service是用来转向的,但是如果你在自己的servlet类中覆盖了service方法,比如说你的service是这样的:

  public void service(ServletRequest req, ServletResponse res)
                   throws ServletException, IOException {
        res.getOutputStream().print(
         "image is <img src='images/downcoin.gif'></img><br>");
    }

那么这时service就不是用来转向的,而是用来处理业务的,现在不论你的客户端是用pos还是get来请求此servlet

都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。

要是你以后写servlet,最好不要重写service方法啊

为什么不应该重写service方法,似乎是为了保留HttpServlet默认实现的缓存协商的机制;其实还有另外一个原因:就是禁用你没有在servlet中重写的方法,例如post、head等,这样就从一定程度上提高了安全性。
参考:
https://my.oschina.net/dtkking/blog/89443

目录
相关文章
|
7月前
|
负载均衡 Java 应用服务中间件
Tomcat Web环境搭建(eclipse)1
Tomcat Web环境搭建(eclipse)1
44 0
|
5月前
|
应用服务中间件 Android开发
Eclipse启动tomcat项目乱码而终端启动tomcat正常的解决办法
Eclipse启动tomcat项目乱码而终端启动tomcat正常的解决办法
|
4月前
|
应用服务中间件 Android开发
Eclipse中启动tomcat后,无法访问localhost:8080(HTTP Status 404)
Eclipse中启动tomcat后,无法访问localhost:8080(HTTP Status 404)
59 0
|
4月前
|
Oracle Java 关系型数据库
JAVAweb 的Eclipse配置及需要安装的jdk及tomcat 完整详细 搭配图片,详细易懂
JAVAweb 的Eclipse配置及需要安装的jdk及tomcat 完整详细 搭配图片,详细易懂
|
4月前
|
Java 应用服务中间件 Android开发
在 Eclipse 中安装配置 Tomcat
在 Eclipse 中安装配置 Tomcat
52 0
|
5月前
|
Java 应用服务中间件 Android开发
IDEA Eclipse项目如何导入tomcat里面的jar包
IDEA Eclipse项目如何导入tomcat里面的jar包
65 0
|
6月前
|
应用服务中间件 Android开发
03JavaWeb基础 - 使用Eclipse绑定Tomcat
03JavaWeb基础 - 使用Eclipse绑定Tomcat
29 0
03JavaWeb基础 - 使用Eclipse绑定Tomcat
|
7月前
|
IDE Java 应用服务中间件
eclipse配置tomcat
Eclipse是一款非常流行的Java开发集成环境(IDE),它主要用于开发Java语言相关的应用程序。而则是一个流行的,也是一个。在Java Web应用程序的开发过程中,使用Eclipse配置Tomcat可以使开发者更方便地进行Web应用程序的总之,通过在Eclipse中配置Tomcat服务器,可以大大方便Java开发者进行Web应用程序的开发和管理。接下来我们就开始配置吧!
|
7月前
|
Java 应用服务中间件 Apache
Tomcat Web环境搭建(eclipse)2
Tomcat Web环境搭建(eclipse)2
53 0
|
9月前
|
缓存 IDE 安全
Tomcat与IDE的整合 - Eclipse(结尾附视频)
Tomcat与IDE的整合 - Eclipse(结尾附视频)
73 0

推荐镜像

更多