request和response
概念
在b/s架构中,请求和响应都是必须的,在我们跟网页进行交互的时候,我们需要使用request发送请求,当服务器接收到请求后,根据设定代码,返回响应包的内容。
当我们需要在页面上显示一些东西的时候,就需要使用response来打印。
request和response
- request和response对象是由服务器创建的。我们来使用它。
- request对象是来获取请求信息,response对象是来设置相应信息。
request
常用方法:
- String getMethod() 获取请求方式
- String getContextPath() 获取虚拟路径
- String getServletPath() 获取Servlet路径
- String getQueryString() 获取get请求方式参数
- String getRequestURL() 获取url
- String getProtocol() 获取协议版本
- String getRemoteAddr() 获取客户端ip
- String getHeader(String name) 通过请求头的名称获取请求头的值
- Enumeration
getHeaderNames() 获取所有的请求头名称
代码:
package Request;
import javax.jws.WebService;
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 = "/demo01")
public class Demo01 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response){
String header = request.getHeader("user-agent");//获取ua
System.out.println(header);
String method = request.getMethod();//获取请求方式
System.out.println(method);
String contextPath = request.getContextPath();//获取虚拟路径
System.out.println(contextPath);
String servletPath = request.getServletPath();//获取servlet路径
System.out.println(servletPath);
String queryString = request.getQueryString();//获取get请求参数
System.out.println(queryString);
String requestURL = request.getRequestURI();//获取url路径
System.out.println(requestURL);
//StringBuffer requestURL = request.getRequestURI();//获取完整url路径
//System.out.println(requestURL);
}
protected void doPost(HttpServletResponse response,HttpServletRequest request){
System.out.println("post请求");
}
}
可以看到,通过这些方法,我们可以提取请求包里面的一些内容。
请求转发
在访问网站的过程中,我们经常会遇到一种情况,最常见的就是百度一下页面,在我们搜索指定的值之后,百度并不会在原本的页面直接给我们展示结果,而是会跳转到另外一个页面然后再将结果打印。
这就是servlet请求转发。
通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
servlet1
package 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("/demo02")
public class Demo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/demo00").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doPost(request, response);
}
}
servlet2:
package Request;
import com.sun.net.httpserver.HttpServer;
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("/demo00")
public class Demo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response){
System.out.println("demo03被访问");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doPost(request,response);
}
}
可以看到,我访问的地址是servlet1的地址,但是sevlet2里面的doGet方法被调用了。
这种方法,一般用于大型网站,因为这样会让功能更多样化,使用起来更方便。
Response
常用方法:
- setStatus(int sc):设置响应状态码
- setHeader(String name,String value):设置相应头
- response.sendReadirect(String Redirect):302跳转
转发和重定向的区别
重定向:
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
转发:
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
重定向代码
response类:
package Response;
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("/response")
public class Demo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response){
response.setStatus(302);
response.setHeader("location","demo01");
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
super.doPost(request,response);
}
}
这个代码在我们访问response的时候,就会自动帮我们跳转到demo01这个页面去。
ServletDemo类
package Response;
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("/demo01")
public class Demo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("已跳转");
response.sendRedirect("https://www.baidu.com");
}
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
super.doPost(request,response);
}
}
write的使用
package Response;
import javax.servlet.ServletException;
import javax.servlet.annotation.HttpConstraint;
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("/response")
public class Demo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setCharacterEncoding("gbk");
PrintWriter writer = response.getWriter();
writer.write("response");
writer.write("12345");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doPost(request,response);
}
}