总所周知, HttpServletRequest和HttpServletResponse是doGet/doPost的参数
1.HttpServletRequest类
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到 Request对象 中,然后传递到service方法(doGet/doPost)
我们可以通过HttpServlet对象 , 来获取所有请求的信息
-
getRequestURI() 获取请求的URI地址(资源路径
-
getRequestURL() 获取请求的统一资源定位符(绝对路径
-
getRemoteHost() 获取客户端的ip地址
-
getHeader() 获取请求头
-
getParameter() 获取请求的参数
-
getParameterValues()获取请求的参数(多个值的时候使用
-
getMethod() 获取请求方式
-
serAttribute(key,value)
-
getAttribute(key)
-
getRequestDispatcher() 获取请求转发对象
public class RequestAPIservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getRequestURI() 获取请求的URI地址(资源路径
System.out.println("URI:"+req.getRequestURI());
// getRequestURL() 获取请求的统一资源定位符(绝对路径
System.out.println("URL:"+req.getRequestURL());
// getRemoteHost() 获取客户端的ip地址
// 在idea中,使用localhost访问时,得到的客户端ip地址是 0:0:0:0:0:0:0:1
// 使用 0:0:0:0:0:0:0:1 访问时,得到的客户端ip地址是 0:0:0:0:0:0:0:1
// 使用 真实ip 访问时,得到的客户端ip是 真实ip
System.out.println("ip:"+req.getRemoteHost());
// getHeader() 获取请求头
System.out.println("请求头User-Agent"+req.getHeader("User-Agent"));
// getMethod() 获取请求方式*/
System.out.println("请求方式:"+req.getMethod());
}
}
2.HttpServletReponse类
每次请求进来,tomcat都会创建一个Response对象来传递给Servelet程序使用
- HttpServletReponse表示所有响应的信息
- 我们如果需要设置返回给客户端的信息,都可以通过 response 来进行设置
- 两个输出流的说明
- 字节流 getOutputStream(); 常用于下载
- 字符流 getWriter(); 常用于回传字符串(常用
- 两个流同时只能使用一个
public class Responseservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
要求:往客户端回传数据
// PrintWriter writer = response.getWriter();
// writer.write("response's contend::");
// //设置服务器字符集为utf-8
// response.setCharacterEncoding("UTF-8");
// //通过响应头,设置浏览器也会用utf-8编码
// response.setHeader("Content-Type","text/html; charset=UTF-8");
//它会同时设置服务器和客户端都使用utf-8,还设置了响应头,
// 、、注意:此方法一定要在获取流对象之前 调用才有效
response.setContentType("text/html; charset=UTF-8");
System.out.println(response.getCharacterEncoding());
PrintWriter writer = response.getWriter();
writer.write("aaaaaa");
writer.write("我爱你");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
3.请求的转发
- 请求的转发是指:服务器收到请求后,从一个资源跳转到另外一个资源的操作就叫请求转发
- 请求转发的特点:1.浏览器地址栏的地址没有变化
-
2.是一次请求(虽然访问两个资源
-
3.两个程序共用request域中的数据
-
4.可以转发到WEB-INF目录下
-
5.请求转发可以访问工程以外的资源
注: base标签可以设置当前页面中所有相对路径工作时, 参照哪个路径来进行跳传
public class servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求参数
String username = request.getParameter("username");
System.out.println("在servlet1中查看参数"+username);
//2.给材料盖一个章并传递到servlet2查看
request.setAttribute("key","柜台1的章");
//3. servlet2怎么走
/*
请求转发并需要以斜杠打头 / 表示:http://ip:port/工程名/,映射到idea的webapp目录
* */
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
// 4.跳转到servlet2
requestDispatcher.forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
public class servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1。获取请求参数
String username = request.getParameter("username");
System.out.println("servlet2中的参数:" + username);
//2.查看servlet1的章
Object key = request.getAttribute("key");
System.out.println("servlet2是否有章:" + key);
//3.servlet2处理自己的业务
}
}
4.请求重定向
- 是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一个新地址,你去新地址访问,叫做请求重定向
- (因为之前的地址可以已经废弃)
- 响应状态码:302
- 告知新的地址: 响应头Location:新地址
- 特点:1.浏览器地址栏有变化
-
2.是两次请求
-
3.不共享request域中数据(因为request中的数据在一次请求内是可以共享的
-
4.不能访问WEB-INF资源
-
5.可以访问工程外的资源 如www.baidu.com
```java
public class chongdixiang1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("重定向一 曾到此一游");
request.setAttribute("key", "value");
// 方法1:
// //设置响应状态码302,表示重定向
// response.setStatus(302);
//
// //设置响应头,说明 新的网址在哪里
response.setHeader("Location","http://localhost:8080/servlet2/cdx2");
// response.setHeader("Location","http://www.baidu.com");
// 方法2:
response.sendRedirect("http://localhost:8080/servlet2/a/b/c.html");
}
}
public class chongdingxiang2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("重定向2的结果");
System.out.println(request.getAttribute("key"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
注:如果有post请求参数乱码问题
```java
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求的字符集为UTF-8,解决post请求的乱码问题
//在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
//获取请求的参数 getParameter(中间放name属性的值)
System.out.println("------doPost-----");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.asList(hobby));
}