相关笔记:【JavaWeb之Servlet】
文章目录
- 1、Servlet复习
- 2、HttpServletRequest的使用
- 3、HttpServletResponse的使用
- 4、获取HttpServletRequest和HttpServletResponse
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();