Servlet——Request和Response
1.Request体系结构
![](https://img2020.cnblogs.com/blog/1668748/202004/1668748-20200426225304886-1264206014.png)
*ServletRequest:是一个接口
*HttpServletRequest:是一个接口
*org.apache.catalina.connector.RequestFacade:是 Tomcat 的一个类
RequestFacade 类实现了 HttpServletRequest 接口,HttpServletRequest 接口继承了 ServletRequest 接口
HttpServletRequest常用方法
*ServletRequest接口: 请求对象, 封装了获取所有请求信息(请求行, 请求头, 请求实体)的方法
*HttpServletRequest接口:是ServletRequest的子接口, 处理HTTP协议请求的方法.
1.常用方法
1.String getMethod(): 返回请求方式(GET/POST)
2.String getRequestURI():返回请求行中资源名字部分: 如/test/index.html(统一资源标识符)
3.StringBuffer getRequestURL():返回浏览器地址栏内容(统一资源定位符)
4.String getContextPath():返回虚拟目录
5:String getRemoteAddr():返回客户端的IP地址
6.String getHeader(String headName):根据指定的请求头获取对应的请求头的值
2.获取请求参数的方法
1.String getParameter(String name):根据参数名称,获取对应参数的值.
2.String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
3.Enumeration <String> getParameterNames():获取所有请求参数的名称
4.Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
key:参数名称
value:参数值,封装在String数组中.
// 注解: 表示Web.xml中给这个Servlet配置的8句
@WebServlet("/req")
public class HttpServletRequestDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//- String getMethod(): 返回请求方式(GET/POST)
System.out.println(req.getMethod());
//- String getRequestURI():返回请求行中资源名字部分: 如/test/index.html
System.out.println(req.getRequestURI());
//- StringBuffer getRequestURL():返回浏览器地址栏的内容
System.out.println(req.getRequestURL());
//- String getContextPath():获取上下文路径,<Context path="上下文" ../>
System.out.println(req.getContextPath());
//- String getRemoteAddr():返回请求服务器的客户端的IP地址
System.out.println(req.getRemoteAddr());
//- String getHeader(String headName):根据指定的请求头获取对应的请求头的值.
String userAgent = req.getHeader("User-Agent");
System.out.println(userAgent.contains("MSIE"));
System.out.println(userAgent);
System.out.println("-----------获取请求参数的方法----------");
// String getParameter(String name):根据参数名称,获取对应参数的值.
System.out.println(req.getParameter("username"));
// String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
// Enumeration
Enumeration
while (parameterNames.hasMoreElements()) {
System.out.println("====>" + parameterNames.nextElement());
}
// Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
Map<String, String[]> parameterMap = req.getParameterMap();
System.out.println(parameterMap);
}
}
请求转发
1.通过request对象获取请求转发器对象:request.getRequestDispachter(url)
2.使用RequestDispatcher对象来进行转发 forward(req,resp)
特点:
1.浏览器地址栏路径不发生变化
2.只能转发到当前服务器内部资源中
3.转发只发送一次请求
共享数据
1.域对象: 一个有作用范围的对象,可以在范围内共享数据
2.request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
3.方法
void setAttribute(String name,Object obj):存储数据
Object getAttitude(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
请求的中文乱码处理
1.在Tomcat中, 对于POST和GET请求,默认是ISO-8859-1的编码格式, 而该编码格式不支持中文, 所以会产生乱码.
解决方案 :
1.第一种方式:
1.对乱码使用ISO-8859-1解码—>byte数组.
2.对byte数组重新使用UTF-8编码
String username1 = req.getParameter("username");
// 按照ISO-8859-1把乱码恢复成二进制形式
byte[] data = username1.getBytes("ISO-8859-1");
// 再把二进制形式的数据使用UTF-8重新编码
String username2 = new String(data, "UTF-8");
System.out.println(username2);
问题: 这种方式当一个参数需要使用这两行代码来转码,如果有N个中文参数,就需要写N次,如此一来, 冗余代码很多.
2.第二种方式:
针对POST请求方式
// 对于POST请求 可以设置请求的编码
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
System.out.println(username);
注意: 这种方式只对POST有效, 必须放在获取任意参数之前
HttpServletResponse常用方法
ServletResponse接口: 响应对象, 封装了获取所有响应信息(状态行, 响应头, 请求实体)的方法
HttpServletResponse接口:是ServletResponse的子接口, 处理HTTP协议响应的方法.
1.常用方法
OutputStream getOutputStream():获取字节输出流对象. :文件下载
Writer getWriter():获取字符输出流对象 :输出内容
*使用字符输出流,中文会出现乱码,需要设置两行代码
1.设置文档的MIME类型
resp.setContentType("text/html");
2.设置输出数据的编码方式
resp.setCharacterEncoding("UTF-8");
3.这两行可以统一设置
resp.setContentType("text/html;character=utf-8");
重定向
1.重定向是一种资源跳转的方式
2.语法:resp.sendRedirect(url)
3.重定向的特点:redirect
1.地址栏发生变化
2. 重定向是两次请求。不能使用request对象来共享数据
3. 重定向可以访问其他站点(服务器)的资源
4.路径写法:
1.相对路径:通过相对路径不可以确定唯一资源
*如:./index.html
*不以/开头,以.开头路径
规则:找到当前资源和目标资源之间的相对位置关系
./:当前目录
../:后退一级目录
2.绝对路径:通过绝对路径可以确定唯一资源
*如:http://localhost/day15/responseDemo2
/day15/responseDemo2
*以/开头的路径
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
*给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
*建议虚拟目录动态获取:request.getContextPath()
<a> , <form> 重定向…
给服务器使用:不需要加虚拟目录
转发路径