Request:
request对象和response对象的原理
- request和response对象是由服务器创建的。我们来使用它们
- request对象是来获取请求消息,response对象是来设置响应消息
request对象继承体系结构
ServletRequest – 接口
| 继承
HttpServletRequest – 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
request功能
获取请求行数据方法:
-
获取请求方式 :GET
- String getMethod()
-
获取虚拟目录:/day14
- String getContextPath()
-
获取Servlet路径: /demo1
- String getServletPath()
-
获取get方式请求参数:name=zhangsan
- String getQueryString()
-
获取请求URI:/day14/demo1
- String getRequestURI(): /day14/demo1
- StringBuffer getRequestURL() :http://localhost/day14/demo1
-
URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
- URI:统一资源标识符 : /day14/demo1 共和国
-
获取协议及版本:HTTP/1.1
- String getProtocol()
-
获取客户机的IP地址:
- String getRemoteAddr()
代码示例
package servlet.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet(urlPatterns = "/demo1")
public class RequestTest extends HttpServlet {
public void getRequestMessLine(HttpServletRequest req){
//1. 获取请求方式 :GET
String method=req.getMethod();
System.out.println(method);
//2. (*)获取虚拟目录:/RequestTest_war_exploded
String contextPath=req.getContextPath();
System.out.println(contextPath);
//3. 获取Servlet路径: /demo1
String path=req.getServletPath();
System.out.println(path);
//4. 获取get方式请求参数:name=123
String queryString=req.getQueryString();
System.out.println(queryString);
//5. (*)获取请求URI:/RequestTest_war_exploded/demo1
//* URL:统一资源定位符
//* URI:统一资源标识符
String requestURI=req.getRequestURI(); // /RequestTest_war_exploded/demo1
StringBuffer requestURL=req.getRequestURL(); //:http://localhost/day14/demo1
System.out.println(requestURI);
System.out.println(requestURL);
//6. 获取协议及版本:HTTP/1.1
String protocol=req.getProtocol();
System.out.println(protocol);
//7. 获取客户机的IP地址:
String remoteAddr=req.getRemoteAddr();
System.out.println(remoteAddr);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
getRequestMessLine(req);
}
}
获取请求头数据方法:
- String getHeader(String name):通过请求头的名称获取请求头的值
- Enumeration getHeaderNames():获取所有的请求头名称
代码示例
package servlet.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet(urlPatterns = "/demo1")
public class RequestTest extends HttpServlet {
public void getRequestHeader(HttpServletRequest req){
//获取所有的请求头名称
Enumeration<String> headerNames=req.getHeaderNames();
//2.遍历
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//根据名称获取请求头的值
String value = req.getHeader(name);
System.out.println(name+"---"+value);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
getRequestHeader(req);
}
}
获取请求体数据方法:
- 请求体:只有POST请求方式,才有请求体
- 获取流对象
- BufferedReader getReader():获取字符输入流,只能操作字符数据
代码示例
package servlet.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet(urlPatterns = "/demo1")
public class RequestTest extends HttpServlet {
public void getRequestBody(HttpServletRequest req) throws IOException {
//获取请求体数据:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
BufferedReader bufferedReader=req.getReader();
String line=null;
while ((line=bufferedReader.readLine())!=null){
System.out.println(line);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
getRequestBody(req);
}
}
获取请求参数通用方式
- 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
- String getParameter(String name):根据参数名称获取参数值 username=1122
- String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
- Enumeration getParameterNames():获取所有请求的参数名称
- Map<String,String[]> getParameterMap():获取所有参数的map集合
代码示例
package servlet.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet(urlPatterns = "/demo1")
public class RequestTest extends HttpServlet {
public void interchangeableFun(HttpServletRequest req) throws UnsupportedEncodingException {
//post请求会乱码在获取参数前,设置req的编码
req.setCharacterEncoding("utf-8");
//根据参数名称获取参数值的数组
String[] values1=req.getParameterValues("hobby");
for (String value:values1){
System.out.println(value);
}
System.out.println("----------------");
//获取所有请求的参数名称
Enumeration<String> enumeration=req.getParameterNames();
while (enumeration.hasMoreElements()){
String name=enumeration.nextElement();
System.out.println(name);
//根据参数名称获取参数值,只能获取一个值
String value = req.getParameter(name);
System.out.println(value);
}
System.out.println("----------------");
//获取所有参数的map集合
Map<String, String[]> map=req.getParameterMap();
//遍历
Set<String> set=map.keySet();
for (String name:set){
//根据键值获取value
String[] values=map.get(name);
System.out.println(name);
for (String vaule:values){
System.out.println(vaule);
}
}
System.out.println("-----------------");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-------Get请求----------");
interchangeableFun(req);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-------Post请求----------");
interchangeableFun(req);
}
}
get
post
请求转发
- 请求转发:一种在服务器内部的资源跳转方式
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
转发特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
代码示例
demo1转发到demo2
package servlet.request;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet(urlPatterns = "/demo1")
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo1被访问了");
//获取请求转发器对象,参数为转发路径
RequestDispatcher requestDispatcher=req.getRequestDispatcher("demo2");
//使用RequestDispatcher对象来进行转发
requestDispatcher.forward(req,resp);
}
}
package servlet.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/demo2")
public class ForwardTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo2被访问了");
}
}
共享数据
- 共享数据:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
代码示例
package servlet.request;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet(urlPatterns = "/demo1")
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo1被访问了");
//存储数据到request域中
req.setAttribute("msg", "test");
//获取请求转发器对象,参数为转发路径
req.getRequestDispatcher("demo2").forward(req,resp);
}
}
package servlet.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/demo2")
public class ForwardTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo2被访问了");
//通过键获取共享数据值
Object obj=req.getAttribute("msg");
System.out.println(obj);
}
}
JavaBean使用
JavaBean是一种遵循开发规范的一种类。在JavaWeb开发中,经常用来存储实体信息
JavaBean功能:封装数据
JavaBean的规则
要求:
- 类必须被public修饰
- 必须提供空参的构造器
- 成员变量必须使用private修饰
- 提供公共setter和getter方法
方法:
- setProperty(Object bean, String name, Object value) ,设置属性值,其实就是调用对象的set方法
- getProperty(Object bean, String name)获取属性值,其实就是调用对象的get方法
- populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中
注意:使用JavaBean必须导入commons-beanutils-1.8.0.jar和commons-logging-1.2.jar包,否则会报错
代码示例
User.class
package servlet.request;
//1. 类必须被public修饰
public class User {
//2. 必须提供空参的构造器,默认生成,可以不写
//3. 成员变量必须使用private修饰
private String name;
private String pass;
//4. 提供公共setter和getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", pass='" + pass + '\'' +
'}';
}
}
RequestTest.class
package servlet.request;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet(urlPatterns = "/demo1")
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-----doGet-------");
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("utf-8");
//获取所有参数
Map<String, String[]> map=req.getParameterMap();
User user = new User();
//使用BeanUtils封装数据,将map集合的键值对信息,封装到对应的JavaBean对象中
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
}
}