1.获取谞求行数据
Get /web01/demo1?name=zhangsan Http/1.1
方法: 1.获取谓求方式:GET String getMethod()
2.获取虚拟目录: String getContextPath();
3.获取 Servlet路径:/demo1 string getServletPath();
4.获取get方式参数:name= zhangsan String getQueryString()
5.获取请求URI: string getRequestURI(): /web01/demo1 Stringbuffer getRequestUrl(): http://localhost/web01/demo1
6.获取协议及版本:HTTP/1.1 String getProtocolo()
7.获取客户机的IP地址 String getRemoteAddr()
例子:
package com.zhujiantao;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.jws.WebService;
import java.io.IOException;
//*为任意符
@WebServlet("*.do")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getMethod());
System.out.println(req.getContextPath());
System.out.println(req.getServletPath());
System.out.println(req.getQueryString());
}
}
//输入123.do?name=hello
结果:
请求头数据
-
String getHeader(String name);通过请求头的名称 获取请求头的值
-
Enumeration
getHeaderNames(); 获取所有请求头数据 Enumeration
headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()){ String name = headerNames.nextElement(); String value = request.getHeader(name); System.out.println(name+" "+value); }
获取传递过来的参数
请求体: 只有post请求方式,才有请求体,在请求体中分装了post请求的请求参数
获取流对象
BufferedReader getReader();获取字符输入流,只能操作字符数据
ServletInputStream getInputStream();获取字节输入流,可以操作所有类型的数据(使用在文件上传中)
例子:
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.jws.WebService;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("*.do")
public class UserServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(name);
System.out.println(age);
}
}
//传入name=hello参数
传参
结果:
注意:传数据要用Post,比较安全,Get会直接暴露数据在地址栏
其他(get和post都可以使用)1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123 2. String[] getParameterValues( String name):根据参数名称获取参数值数组 username=zs&username=ls 3. Map乱码问题getParameterMap():获取所有参数的map集合
get方式: tomcat 已经处理了get的中文乱码问题
post方式: doPost中设置 request.setCharacterEncoding("utf-8");
二、请求转发一种服务器内部资源跳转的方式,servlet之间的跳转
步骤:
1.通过request对象获取请求转发器对象
RequestDispatcher
request.getRequestDispatcher(String path)
-
通过RequestDispatcher对象来进行转发:
RequestDispatcher.forward(ServletRequest request,ServletResponse response);
特点:
// 使用示例:
req.getRequestDispatcher("/SchoolServlet").forward(req,resp);
1. 地址上显示的是请求servlet的地址,返回200ok。
2. 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作。
3. 只能跳转自己项目的资源路径。
4. 效率上稍微高一点,因为只执行一次请求。
5. 可以使用上一次的request对象。
共享数据
1. 域对象: 一个有作用范围的对象,可以在范围内共享数据
2. request域: 代表一次请求的范围,一般用于请求转发的多个资源数据
方法
1. req.setAttribute(String name,Object object);存储数据 2. Object getAttribute(String name);通过键获取数据 3. Void removeAttribute(String name); 通过键移除键值对三、response 响应行
-
组成: 协议/版本 响应状态码 状态码描述
-
响应状态码: 服务器告诉客户端浏览器本次请求和响应的一个状态。
状态码都是3位数字
分类: 1XX:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1XX状态码
2XX:成功。代表:200
3XX:重定向。代表:302(重定向),304(访问缓存)
4XX:客户端错误。(404找不到后台的地址)
5Xx:服务器端错误。代表:500(服务器内部出现异常)
响应头常见的响应头
1.Content-type: 服务器告诉客户端本次响应体数据格式以及编码格式
2.Content-disposition: 服务器告诉客户端以什么格式打开响应体数据
In-line: 默认值,在当前页面打开
attachment;filename=xxx: 以附件的形式打开响应体,文件下载
响应行
设置status、version
响应体传输的数据
HttpServletResponse功能: 设置响应消息
设置响应行
1.格式:HTTP/1.1 200 ok
2.设置状态码: setStatus(int sc)
设置响应头: setHeader( string name, string value)
设置响应体:
使用步骤:
1.获取输出流 字符输出流: Printwriter getwriter() 字节输出流: ServletOutputStream getOutputStream()
2.使用输出流,将数据输出到客户端浏览器
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("执行成功");
//因为中文是乱码,需要加入setContentType
注意:图片需要用file去获取输出流,末尾还要关闭流
四、重定向重定向特点:
1.地址栏发生变化
-
重定向可以访问其他站点(服务器)的资源
-
重定向是两次请求,不能使用request对象来共享数据
转发特点:
1.转发地址栏路径不变
2.转发只能访问当前服务器下的资源
-
转发是一次请求,可以使用request对象来共享数据
相对路径: 通过相对路径不能确定唯一资源,如: ./myservlet3,不以/开头,以.开头
规则: 找到当前资源和目标资源之间的相对位置 http://localhost:8081/javaweb01/userServlet, http://localhost:8081/javaweb01/shopServlet
绝对路径: 通过绝对路径可以确定唯一资源,如http://localhost:1888/web01/index.html /web01/index.html,以/开头
规则:
如果给客户端浏览器使用,需要添加项目的虚拟目录(比如表单的提交)
如果给服务器使用: 不需要加项目的虚拟目录(比如:重定向)
六、动态获取虚拟目录String contextPath = request.getContextPath();



