HTTP协议_GET&POST请求&HttpServlet

HTTP协议_GET&POST请求HttpServlet

GET 请求 和 POST 请求:

使用GET方式传递参数:
  1. 在浏览器地址栏中输入某个 URL地址或单击网页上的一个超链接 时,浏览器发出的HTTP请求消息的请求方式为GET方式;
  2. 如果网页中的 <form> 表单元素的 method 属性被设置为“GET”,浏览器提交这个FROM表单时生成的HTTP请求消息的请求方式为GET;
  3. 使用GET请求方式给服务器传递的参数格式: https://so.csdn.net/so/search/s.do?q=AIM_Long&t=blog&u=long_zhiqi
  4. 使用GET方式传输的数据量一般限制在1K以下。

使用POST方式传递参数
  1. POST 请求方式主要用于向WEB 服务器端程序提交 FROM 表单中的数据:FROM 表单的 method 置为POST;
  2. POST 方式将各个表单字段元素及数据作为HTTP消息的实体内容发送给WEB 服务器。传输的数据量要比使用GET方法传送数据的数据量大得多。
 

如何在Servlet中获取请求信息
  1. Servlet 的 service() 方法用于应答请求;因为每次请求都会调用 service() 方法
@Override
             public void service( ServletRequest servletRequest , ServletResponse servletResponse ) throws ServletException , IOException {
                        
             }
ServletRequest:封装了请求信息,可以从中获取到任何的请求信息
ServletResponse: 封装了响应信息,如果想给用户什么响应,具体可以使用该接口方法实现。
这两个接口的实现类都是服务器给予实现的,并在服务器调用 service() 方法时传入。
  1. ServletRequest:获取请求参数
    1. String getParameter(String name):根据参数的名字返回参数值;
    2. String[]  getParameterValues(String name) :根据请求参数的名字,返回请求参数对应的字符串数组;
    3. Enumeration getParameterNames():返回参数名对应的 Enumeration对象 ,类似于ServletConfig 或ServletContext 的 getInitParameterNames() 方法;
    4. Map  getParameterMap():返回请求参数的键值对: key :参数名 ,value :参数值  String[] 类型 
    5. HttpServletRequest: 是ServletRequest的子接口,针对于HTTP请求所定义包含了大量获取HTTP请求相关的方法。
                         String user   = servletRequest . getParameter ( "user" ) ;
                         String password = servletRequest . getParameter ( "password" ) ;
                         System . out . println ( user   + "--->"   + password ) ;
                        
                         String interesting = servletRequest . getParameter ( "interesting" ) ;
                         System . out . println ( interesting ) ;
                        
                         String [] intterestings = servletRequest . getParameterValues ( "interesting" ) ;
                         for ( String interests : intterestings ) {
                                     System . out . println ( "---->" + interests ) ;
                         }
                        
                         Enumeration < String > names = servletRequest . getParameterNames () ;
                         while ( names . hasMoreElements ()) {
                                     String name = names . nextElement () ;
                                     String values = servletRequest . getParameter ( name ) ;
                                     System . out . println ( "^^^" + name + "-->" + values ) ;
                         }
                        
                         Map < String , String [] > map = servletRequest . getParameterMap () ;
                         for ( Map . Entry < String , String [] >   entry : map . entrySet ()) {
                                     System . out . println ( "***" + entry . getKey () + ": " + Arrays . asList ( entry . getValue ())) ;
                         }
                        
                         HttpServletRequest httpServletRequest = ( HttpServletRequest ) servletRequest ;
                        
                         String requestURI = httpServletRequest . getRequestURI () ;
                         System . out . println ( requestURI ) ;
                        
                         String method = httpServletRequest . getMethod () ;
                         System . out . println ( method ) ;

  1. ServletResponse: 封装了响应信息,如果想给用户什么响应,具体可以使用该接口方法实现。
    1. getWriter ():  返回PrintWriter 对象,调用该对象的print() 方法, 将把print() 中的参数直接打印到客户的浏览器上。
    2. 设置响应的内容的类型: setContentType ( String )
                        servletResponse.setContentType("application/x-abiword");
                         PrintWriter out = servletResponse . getWriter () ;
                         out . println ( "LoginServlet!!!" ) ;

HttpServlet:
  1. HttpServlet是一个Servlet ,继承自GenericServlet。针对于HTTP协议;
  2. 在service() 方法中直接把ServletRequest 和 ServletResponse转为 HttpServletRequest 和 HttpServletResponse,并调用了重载的service(HttpServletRequest ,HttpServletResponse)方法;
  3. 在service(HttpServletRequest ,HttpServletResponse)获取了请求方式:request.getMethod() 。根据请求方式有创建了doXXX()方法(XXX为具体请求方式eg:doGet())
@Override
             public void service( ServletRequest arg0 , ServletResponse arg1 ) throws ServletException , IOException {
                        
                                     HttpServletRequest request ;
                                     HttpServletResponse response ;
                                    
                                     try {
                                                 request = ( HttpServletRequest ) arg0 ;
                                                 response = ( HttpServletResponse ) arg1 ;
                                     } catch ( ClassCastException e) {
                                                 throw new ServletException ( "non-HTTP request or response" ) ;
                                     }
                                     service ( request , response ) ;
             }
            
             public void service( HttpServletRequest request , HttpServletRequest response ) throws ServletException , IOException {
                         //获取请求方式
                         String method = request . getMethod () ;
                         if ( "GET" . equalsIgnoreCase ( method )) {
                                     doGet ( request , response ) ;
                         } else if ( "POST" . equalsIgnoreCase ( method )) {
                                     doPost ( request , response ) ;
                         }
                        
             }
             public void doPost( HttpServletRequest request , HttpServletRequest response ) throws ServletException , IOException   {
                        
             }
             public void doGet( HttpServletRequest request , HttpServletRequest response ) throws ServletException , IOException {
                        
             }
}
GenericServlet:
  1. 是一个Servlet. 是Servlet 接口和ServletConfig 接口的实现类 ,但是是一个抽象类。其中的 service 方法为抽象方法;
  2. 如果新建的Servlet 程序直接继承GenericServlet 会使得开发变得更加简洁;
  3. 具体实现:
    1. 在GenericServlet 中声明了一个ServletConfig 类型的成员变量 ,在init(ServletConfig) 方法中对其进行了初始化;
    2. 利用ServletConfig 成员变量的方法实现了ServletConfig 接口方法;
    3. 还定义了一个init() 方法 , 在init(ServletConfig)方法中进行调用,子类可以直接覆盖init() 在其中实现对Servlet 的初始化;
    4. 不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(ServleConfig),而还是用了ServletConfig 接口的方法,否则会出现空指针异常;
    5. 新建的init(){} 方法并非是Servlet 的生命周期方法,而init(ServletConfig) 是生命周期相关的方法。
public   abstract class MyGenericServlet implements Servlet , ServletConfig {
            
            
             @Override
             public void destroy() {
                        
             }
             @Override
             public ServletConfig getServletConfig() {
                         return servletConfig ;
             }
             @Override
             public String getServletInfo() {
                         return null ;
             }
             private ServletConfig servletConfig ;
             @Override
             public void init( ServletConfig myservletConfig ) throws ServletException {
                         this . servletConfig = myservletConfig ;
                         this . init () ;
             }
             public void init() throws ServletException {
                        
             }
            
             @Override
             public   abstract   void service( ServletRequest arg0 , ServletResponse arg1 ) throws ServletException , IOException ;
             @Override
             public String getInitParameter( String arg0 ) {
                         return servletConfig . getInitParameter ( arg0 ) ;
             }
             @Override
             public Enumeration < String > getInitParameterNames() {
                         return servletConfig . getInitParameterNames () ;
             }
             @Override
             public ServletContext getServletContext() {
                         return servletConfig . getServletContext () ;
             }
             @Override
             public String getServletName() {
                         return servletConfig . getServletName () ;
             }
}

















猜你喜欢

转载自blog.csdn.net/long_zhiqi/article/details/80189383