zoukankan      html  css  js  c++  java
  • Servlet处理GET和POST请求

     

    doGet() 、 doPost()、service()方法

      doGet()表示,当客户端是使用get方式请求该servlet时,那么就会触发执行doGet()方法中的代码。

      doPost()表示,当客户端是使用post方式请求该servlet时,那么就会触发执行doPost()方法中的代码。

      而service()方法,既可以接收并处理get请求,也可以接收并处理post请求。

      如果这三个方法都被重写时,service()的优先级是高于doGet()和doPost()的,所以,即使客户端使用get或者post方式请求该servlet,但是服务器因为存在service()方法,即使存在doGet()和doPost(),也是会调用service()方法,而不会调用doGet()和doPost()方法的。

      总结来说:如果servlet中有service()方法,那么会优先调用service()方法来处理请求。

    package lixin.gan;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class SecondServlet extends HttpServlet {
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("收到GET请求");
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("收到POST请求");
    	}
    
    	@Override
    	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
    		System.out.println("收到请求(GET或者POST)");
    	}
    }
    

      上面这个代码,无论是get请求,还是post请求,触发的都是service()方法,都会在服务器控制台输出 “收到请求(GET或者POST)”。

    重写service()方法,并调用父类service()方法

    package lixin.gan;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class SecondServlet extends HttpServlet {
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("收到GET请求");
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("收到POST请求");
    	}
    
    	@Override
    	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
    		System.out.println("收到请求(GET或者POST)");
    		super.service(req, resp);   // 当前servlet的service()处理完之后,再调用父类的service()方法
    		
    		// 其实super.service()会根据req中的http头信息,判断请求方式,在调用对应的doGet或者doPost
    	}
    }
    

      运行测试:

    // 收到get请求后,控制台的输出
    收到请求(GET或者POST)
    收到GET请求
    
    // 收到post请求后,控制台的输出
    收到请求(GET或者POST)
    收到POST请求
    

      所以,在当前servlet中定义service()方法,并且调用super.service(),那么父类的service()会根据req中的http头信息,判断请求方式,在调用对应的doGet或者doPost。

      一般,我们都不会在当前service()中调用super.service()方法。如果当前servlet没有重写doGet()方法,当客户端发起get请求时,super.service()中调用doGet方法时,就会出现405错误。

    Servlet中http错误状态码的产生原因

      404(资源未找到)

      1、客户端发起的请求中,输入的url中的servlet拼写错误,在web.xml中的找不到对应的url-pattern(注意区分大小写)。

      2、客户端发起的请求中,输入的url中的项目名称错误(注意区分大小写)。

      405(请求方式不支持)

      1、假设用户发起post请求,但是servlet中既没有重写service(),也没有重写doPost()方法,此时没有就会出现405错误。

      2、假设用户发起post请求,该servlet中没有重写doPost()方法,但是重写了service()方法,但是又在当前service()中调用super.service(),所以导致super.service()中调用doPost()失败,

      500(服务器内部错误)

      1、在web.xml中servlet的全限定路径拼写错误,web.xml写的是aa.bb类,但是实际的java文件名称是a.b类,导致url-pattern符合规则时,去找对应的class文件时,没有找到。

      2、servlet对象的处理逻辑出现错误,比如0作除数。

  • 相关阅读:
    struts总结
    struts的MVC详细实现
    struts的由来
    Hibernate的搭建及使用
    Hibernate简介
    泛型
    eclipse手动添加源码
    beanUtils操作bean的属性
    ref:JAVA之Forward和Redirect的区别
    ref:下一个项目为什么要用 SLF4J
  • 原文地址:https://www.cnblogs.com/-beyond/p/10066115.html
Copyright © 2011-2022 走看看