Servlet学习之HTTP协议

GET,POST请求

  • get请求的最大特点:把请求参数赋在URL后面,用问号连接
  • post请求则是把请求参数放在form data(表单里)

GET

在浏览器地址栏中输入某个URL地址或单机网页上的一个超链接,浏览器发出HTTP请求消息的请求方式为GET.

POST

POST请求方式主要用于向WEB服务器端程序提交form表单中的数据(form表单中的method置为POST)

如何在servlet中获取请求信息

1)、Servlet的service()方法用于应答请求。因为每次请求都会调用service()方法

  • ServletRequest:封装了请求信息
  • ServletResponse:封装了响应信息

这两个接口的实现类都是服务器给予实现的,并在调用service方法时传入。

2)、ServletRequest:

获取请求参数:

  • String getParameter(String name):根据请求参数的名字,返回参数值。
    若请求参数有多个值(如:checkbox),该方法只能获取到一个值
  • String [] getParameterValues(String name):根据请求参数的名字,返回请求参数对应的字符串数组
  • Enumeration getParameterNames():返回参数名对应的Enumeration对象。类似于ServletConfig(或ServletContext)的getInitParamterNames()方法。
  • Map getParameterMap(): 返回请求参数的键值对

代码演示:

 @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        System.out.println("请求来了...");
        String user = request.getParameter("user");
        String password = request.getParameter("password");
        System.out.println(user + ":" + password);

        String[] interestings = request.getParameterValues("interesting");
        for (String interest : interestings) {
            System.out.println(interest);
        }

        Enumeration<String> names = request.getParameterNames();
        while (names.hasMoreElements()){
            String name = names.nextElement();
            String val = request.getParameter(name);

            System.out.println("^^"+name+":"+val);
        }
        
        Map<String,String[]> map = request.getParameterMap();
        for (Map.Entry<String,String[]> entry:map.entrySet()){
            System.out.println("**"+entry.getKey()+":"+ Arrays.asList(entry.getValue()));

        }
    }

3) ServletResponse

封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。

  • getWriter():返回PrinterWriter对象。调用该对象的print()方法,将把print()中的参数直接打印到客户端浏览器上。

  • 设置响应的内容类型 :response.setContentType(“application/msword”);

  • void sendRedirect(String location):请求的重定向(此方法为HttpServletResponse 中定义)

4)GenericServlet

  • 1、是一个Servlet,是Servlet和ServletConfig接口的实现类。但是一个抽象类。其中的service方法为抽象方法

  • 2、如果新建的Servlet程序直接继承GenericServlet会使开发更加简便

  • 3、具体实现:

    • 1、在 GenericServlet 中声明一个ServletConfig 类型的成员变量,在init(ServletConfig) 方法中对其进行初始化
    • 2、利用servletConfig成员变量的方法实现了 ServletConfig接口的方法
    • 3、定义了一个init()方法,在init(ServeltConfig)方法对其进行调用,子类可直接覆盖init()在其中实现对Servlet的初始化。
    • 4、不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),而还是用ServletConfig接口的方法,会出现空指针异常。
    • 5、新建的init(){}并非Servlet的生命周期方法,而是init(ServletConfig)是生命周期相关的方法。
  • 4、示例代码如下:

public abstract class MyGenericServlet implements Servlet, ServletConfig {

    /**
     * 一下方法为Servlet接口的方法
     **/
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.servletConfig = servletConfig;
    }

    @Override
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    @Override
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

    /**
     * 一下方法为ServletConfig接口的方法
     **/

    @Override
    public String getServletName() {
        return servletConfig.getServletName();
    }

    @Override
    public ServletContext getServletContext() {
        return servletConfig.getServletContext();
    }

    @Override
    public String getInitParameter(String s) {
        return servletConfig.getInitParameter(s);
    }

    @Override
    public Enumeration<String> getInitParameterNames() {
        return servletConfig.getInitParameterNames();
    }
}

5)HttpServlet

  • 1、是一个Servlet,继承于GenericServlet,针对HTTP协议所制定
  • 2、在 service()方法中直接把ServletRequestServletResponse强转为HttpServletRequestHttpServletResponse。并调用了重载的service(HttpServletRequest,HttpServletResponse)
  • 3、在service(HttpServletRequest,HttpServletResponse)中获取请求方式:request.getMethod()。根据请求方式创建了doxxx()方法(xxx为具体请求方式)

*代码示例:

	@Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;

        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
        } catch (ClassCastException e) {
            throw new ServletException("non-HTTP request or response");
        }
        service(request,response); 

    }

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1、获取请求方式
        String method = request.getMethod();
        //2、根据请求方式调用处理方法
        if ("GET".equalsIgnoreCase(method)) {
            doGet(request, response);
        } else if ("POST".equalsIgnoreCase(method)) {
            doPost(request, response);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }
  • 4、实际开发中,直接继承HttpServlet,并根据请求方式复写doxxx()方法接口。
  • 5、好处:直接有针对性的覆盖doxxx()方法,直接使用HttpServletRequest和HttpServletResponse,不需要进行强转。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值