1. 请求行
GET /login.html HTTP/1.1 或 POSt /login.html HTTP/1.1 请求方法 请求页面 协议版本
2. 请求头:客户端浏览器告诉服务器一些信息
Host: localhost User-Agent: ... Referer: .. .........
3.请求体 封装POST请求消息的请求参数的
1. request对象
0.tomcat服务器 根据请求url 资源路径 创建对应的 Servlet 对象 ,并且封装request 和resposne对象传递给service方法
1. request和response对象是由服务器创建的 ,用来获取请求消息, 2.response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest -- 接口 封装在 Servlet 接口中 service方法的参数
| 继承
HttpServletRequest -- 接口 封装在 HttpServlet 接口中 doget dopost方法的参数 HttpServletRequest
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
3.new servlet 直接创建 实现HttpServlet接口的类
4. request功能
1. String getMethod() 获取请求方式 : GET
2. String getContextPath() 获取虚拟目录: /day14
3. String getServletPath() 获取Servlet路径: /demo1 注解路径
4. String getQueryString() 获取get方式请求参数:name=zhangsan
5. String getRequestURI() 获取请求URI:/day14/demo1
6. StringBuffer getRequestURL() : http://localhost/day14/demo1
URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国 范围更小
URI:统一资源标识符 : /day14/demo1 共和国
7. String getProtocol() 获取协议及版本:HTTP/1.1 8.获取客户机的IP地址: String getRemoteAddr()
8.request.getHeader("x-forwarded-for") 获得通过 nginx转发的真实ip
2.获取请求头数据
方法: 1. String getHeader(String name): 通过请求头的名称获取请求头的值
2. Enumeration<String> getHeaderNames(): 获取所有的请求头名称 Enumeration相当于迭代器
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){ 与迭代器类似
String name = headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name+"---"+value);
}}
3.获取post请求体数据
获取流对象 1. BufferedReader getReader(): request.getReader() 获取字符输入流,只能操作字符数据
2. ServletInputStream getInputStream(): 获取字节输入流,可以操作所有类型数据
4. 其他常用功能:
this.doPost(request,response); 放入doget 方法 就可以在dopost写了 get或post都可访问了
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name): 根据参数名称获取参数值 username=zs&password=123
String username = request.getParameter("username");
System.out.println(username);
2. String[ ] getParameterValues(String name): 参数复选框多个值时 hobby=xx&hobby=game
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
3. Enumeration<String> getParameterNames(): 获取所有请求的参数名称 与迭代器类似
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
System.out.println(name);
String value = request.getParameter(name);
System.out.println(value);
System.out.println("----------------");
}
4. Map<String,String[]> getParameterMap(): 获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap(); 获取所有参数键值对
Set<String> keyset = parameterMap.keySet(); 把键放入set
for (String name : keyset) {
String[] values = parameterMap.get(name); 通过键获取值
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
System.out.println("-----------------");}
中文乱码问题:
1.get方式:tomcat 8 已经将get方式乱码问题解决了
2. post方式:会乱码 解决:在获取参数前,设置 request的编码 request.setCharacterEncoding("utf-8");
请求转发:
1. 特点: 1. 浏览器地址栏路径不发生变化 2. 只能转发到当前服务器内部资源中。 3. 转发是一次请求
1. 通过request对象获取请求转发器对象: RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发: forward(ServletRequest request, ServletResponse response)
request.getRequestDispatcher("跳转地址").forward(request,response);
共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据, 通过设置request一些参数,传到跳转地址
1. void setAttribute(String name,Object obj): 存储数据
2. Object getAttitude(String name): 通过键获取值
3. void removeAttribute(String name): 通过键移除键值对
protected void doPost(HttpServletRequest request, HttpServletResponse response){
request.setAttribute("msg","hello"); 设置共享数据
request.getRequestDispatcher("/requestDemo9").forward(request,response);}
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
Object msg = request.getAttribute("msg"); 获取转换过来的数据
System.out.println(msg);} hello
4. 获取ServletContext: servletContext getServletContext()
ServletContext servletContext = request.getServletContext(); hashcode值
BeanUtils工具类
1.用于封装JavaBean的
1. JavaBean:标准的Java类 1. 要求 : 类必须被public修饰 2. 必须提供空参的构造器
3. 成员变量必须使用private修饰 4. 提供公共setter和getter方法
2. 概念: 实际调用的是方法修改成员变量
3. 方法:
1. setProperty()
2. getProperty() 设置属性 ,根据方法名来设置
3. populate(Object obj , Map map): 将map集合的键值对信息,封装到对应的JavaBean对象中
Map<String, String[]> map = req.getParameterMap(); 从request获取所有 参数并封装成键值对 存在map集合中
User loginUser = new User(); 创建 标准的 JavaBean对象
BeanUtils.populate(loginUser,map); 使用方法会自动用map中的键值对给 User 对象设置属性(成员变量)