web服务器收到一个Http请求后,会针对每个请求创建一个HttpServletRequest对象和HttpServletResponse对象,如果需要获取客户端提交请求的相关信息,需要从HTTPServletRequest对象中获取,如果需要向客户端发送数据,则需要通过HttpServletResponse对象来文成。
1.向客户端发送数据
ServletResponse有一个方法getWriter(),用于获取到一个输出流对象PrintWriter,专门用于向客户端输出数据的,称为标准输出流。
package HttpServletResponse;
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.io.PrintWriter;
@WebServlet("/ServletResponseDemo1")
public class ServletResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取标准输出流
PrintWriter out = response.getWriter();
//向输出流中写入数据,客户端浏览器就会看到这些数据
out.println("<h1>abc</h1>");
out.print("我爱中国");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
可以通过设置响应的编码类型:
response.setContentType("text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取标准输出流
PrintWriter out = response.getWriter();
//向输出流中写入数据,客户端浏览器就会看到这些数据
out.println("<h1>abc</h1>");
out.print("我爱中国");
2.请求转发与重定向
通过HTTPServletRequest获取到的RequestDispatcher对象的forward()方法,可以完成请求转发功能。而通过HttpServletResponse的sendRedirect()方法,可以完成重定向功能。
请求转发与重定向均是指请求的跳转方式:
请求转发也称为服务器内部跳转
重定向也称为服务器外部跳转
Forward文件:请求转发到OtherServlet文件
在里面设置域属性,在OtherServlet文件中可以取到域属性的值
package 请求转发;
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("/Forward")
public class Forward extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String age = request.getParameter("age");
//设置域属性
request.setAttribute("name",name);
request.setAttribute("age",age);
request.getRequestDispatcher("/OtherServlet").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
OtherServlet文件:在转发的文件中取到域属性的值
package 请求转发;
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.io.PrintWriter;
@WebServlet("/OtherServlet")
public class OtherServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.print("otherServlet......");
Object name = request.getAttribute("name");
Object age = request.getAttribute("age");
out.println("name="+name);
out.println("age="+age);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
重定向:
package 响应重定向;
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("/Redirect")
public class Redirect extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行Redirect。。。。");
//重定向
response.sendRedirect("/34/RedirectServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package 响应重定向;
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.io.PrintWriter;
@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("执行RedirectServlet.....");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
通过上面的视频可看出,重定向地址栏地址改变了。
请求转发:
浏览器只发出一次请求,收到一次响应
请求转发到的资源中可以直接获取请求中所携带的数据
浏览器地址栏显示的用户所提交的请求路径
只能跳转到当前应用的资源中
重定向:
浏览器发出两次请求,接收到两次响应
重定向到的资源不能直接获取到用户提交请求中所携带的数据
浏览器地址栏显示的为重定向的请求路径,而非用户提交请求的路径
重定向不仅可以跳转到当前应用的其他资源,也可以跳转到其他应用中资源