相关笔记:【JavaWeb之Servlet】

在这里插入图片描述

1、Servlet复习

Servlet是JavaWeb的三大组件之一:

  • Servlet
  • Filter 过滤器
  • Listener 监听器

Servlet是运行在服务器上的一个Java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

Servlet接口的实现和继承关系如下,日常开发中直接继承HttpSerlvet类就好:

在这里插入图片描述

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到HttpServletRequest对象中,然后传递到上图中的service方法(doGet、doPost)中,用于给开发者来编写自己需要的逻辑。

2、HttpServletRequest的使用

常用方法:

  • getRequestURI() 获取请求的资源路径
  • getRequestURL() 获取请求的统一资源定位符
  • getRemoteHost() 获取客户端的IP地址
  • getHeader() 获取请求头
  • getParameter() 获取请求的参数
  • getParameterValues() 获取请求的参数(多个值的时候)
  • getMethod() 获取请求的方式GET、POST
  • setAttribute(key,value) 设置域数据
  • getAttribute(key)获取域数据
  • getRequestDispatcher() 获取请求转发对象

其中,Header和请求参数的相关方方法的类型与形参:

// 获取请求头数据,通过请求头名称获取值
String getHeader(String name)
// 获取所有请求头信息
Enumeration getHeaderNames()

请求参数:

// 获取请求参数通用方式(根据参数名称获取参数值) username=zhangsan
String getParameter(String name)
// 获取请求参数名称获取参数值的数组 hobby=xx&hobby=game
String[] getParameters(String name)
// 获取请求参数名称(与获取请求头方法类似)
Enumeration getParameterNames()
// 获取所有参数的Map集合
Map getParameterMap()

//....
Enumeration<String> enumeration = request.getParameterNames();  
Map<String,String> parameterMap = new HashMap<String,String>();
while (enumeration.hasMoreElements()){
    String parameter = enumeration.nextElement();  
    parameterMap.put(parameter,request.getParameter(parameter));  
}
//...

示例代码:

package com.llg.web;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Arrays;

public class HttpServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String[] hobby = request.getParameterValues("hobby");
        System.out.println("username:" + username);
        System.out.println("password:" + password);
        System.out.println("hobby:" + Arrays.asList(hobby));
        System.out.println("URI:" + request.getRequestURI());
        System.out.println("URL:" + request.getRequestURL());
        System.out.println("Client_IP:"+request.getRemoteHost());
        System.out.println("User-Agent:" + request.getHeader("User-Agent"));
        System.out.println("Request-Method:" + request.getMethod());

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * setCharacterEncoding方法设置请求的字符集为UTF-8,解决post请求的中文乱码问题
         * 注意要在获取请求参数之前调用
         */
        request.setCharacterEncoding("UTF-8");
        System.out.println("-----POST-----");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String[] hobby = request.getParameterValues("hobby");
        System.out.println("username:" + username);
        System.out.println("password:" + password);
        System.out.println("hobby:" + Arrays.asList(hobby));
    }
}

3、HttpServletResponse的使用

HttpServletResponse和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传给Servlet程序使用。

HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,如果需要修改或设置返回给客户端的信息,则可通过HttpServletResponse对象来设置。

关于两个输出流:

  • 字节流 getOutputStream()方法,常用于下载(传递二进制数据)
  • 字符流 getWriter()方法,常用于回传字符串(用的多)

两个流不能同时使用。

在这里插入图片描述
运行:

在这里插入图片描述

给客户端回传信息:

在这里插入图片描述

运行:

在这里插入图片描述
注意回传中文信息,发生乱码时,需要设置字符集

//具体看文章开头的笔记【Servlet】
response.setHeader("Content-Type","text/html; charset=UTF-8");

4、获取HttpServletRequest和HttpServletResponse

除了正常的Tomcat打包传过来的HttpServletRequest和HttpServletResponse对象,也可以在其他地方自己获取。

途径一:直接注入

@Resource
private HttpServletRequest request;

//@Autowired
@Resource
private HttpServletResponse response;

途径二:controller层中直接用

@GetMapping(value = "/abc/")
public String doSomething(HttpServletRequest request,HttpServletResponse response) {
    //...
}

途径三:从RequestContextHolder中获取

关于SpringMVC的RequestContextHolder:即持有上下文的Request容器,参考:https://developer.aliyun.com/article/908719

ServletRequestAttributes servletRequestAttributes =  (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
HttpServletResponse response = servletRequestAttributes.getResponse();

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐