Servlet是运行在服务器上的java小程序,也是服务器上的资源,浏览器可以通过http协议进行请求,服务器处理后响应给浏览器。在这个过程中涉及到了请求和响应两个过程,浏览器和服务器是如何进行传输数据的,request接受请求参数,response响应给浏览器。下面我们来具体看看request和response吧。
在servlet中生命周期service方法:将request用来封装http的请求信息,response封装响应信息。
protected void service(HttpServletRequest req, HttpServletResponse resp)
通过抓包工具fiddler4可以将请求和响应的信息进行拦截,这是请求和响应的相关信息。
【Request】
包括请求行、请求头、请求体
请求行:请求方式 请求路径 协议版本
//1.1 获得请求方式 *************
String method = request.getMethod();
//1.2 可以获得项目名
String contextPath = request.getContextPath();
//1.3 可以获得远程主机的ip (地址)
String ip = request.getRemoteAddr();
//2.1获得协议
String scheme = request.getScheme();
//2.2获得域名
String servetName = request.getServerName();
//2.3 获得访问资源的名称
String servletPath= request.getServletPath();
//2.4 获得参数 键值对
String queryStr= request.getQueryString();
//2.5 url 统一资源定位符
//uri 描述符 相对路径
System.out.println("url:" + request.getRequestURL());
System.out.println("uri:" + request.getRequestURI());
//2.6 端口号
int serverPort = request.getServerPort();
//3.1 获得协议版本
String protocol = request.getProtocol();
请求头:向服务器传递附加消息
Enumeration<String> e = request.getHeaderNames();//迭代器的前身
while (e.hasMoreElements()) {
String string = e.nextElement();
System.out.println(string + " @@ " +request.getHeader(string) );
请求体:get请求没有请求体,post请求有,可以获得用户请求的参数。
//获得一个参数
String username = request.getParameter("username");
//获得一组参数
String [] hobby = request.getParameterValues("hobby");
//获得所有参数
Map<String, String[]> parameterMap = request.getParameterMap();
for(String key : parameterMap.keySet()){
System.out.println("key:" + key +" @@ "+ "value : " + Arrays.toString(parameterMap.get(key)));
}
解决请求参数中文乱码问题
在浏览器发出请求提交html页面时,难免会输入中文,这样就会造成乱码,因为html我们设置的是utf-8格式,通过http协议传输是iso-8859-1的编码,就会造成乱码。
post提交:
request.setCharacterEncoding("utf-8");
get提交:
name=new String(name.getBytes("iso8856-1"),"utf-8");
请求转发
在servlet中,如果当前web资源不想处理请求时,可以通过forward()将当前请求传递给其他的web资源进行处理,这种方式叫做请求转发。
request.getRequestDispatcher("/Error.jsp").forward(request, response);
【response】
包含响应行、响应头、响应体
响应行:向浏览器响应消息时,发送状态码。
response.setStatus(302);
response.sendError(404,"this is good error");
响应头:
//响应给浏览器的格式
response.setHeader("content-type", "text/html;charset=utf-8");
response.setContentType( "text/html;charset=utf-8");
//设置下载格式
response.setHeader("content-disposition", "attachment;filename=" + filename);
//刷新
response.setHeader("refresh", "5;url=https://www.baidu.com/");
response.getWriter().print(new Date().toLocaleString());
//location 重定向 (重新改变方向)response.setStatus(302);response.setHeader("location", "/ee49_day14/TwoServlet");
//等效赋值 状态码 location
response.sendRedirect("/ee49_day14/TwoServlet?a=123&b=456");
响应体:一般都是java编写的源码,传递大量的数据,通过IO流进行传递。字符流和字节流不能同时使用。
response.getWriter().print("b");
response.getOutputStream().print(1);
中文乱码
response.setHeader("content-type", "text/html;charset=utf-8");
response.setContentType( "text/html;charset=utf-8");
请求转发VS重定向
请求转发VS重定向
1、重定向的地址栏会发生改变,而请求转发不会变化;
2、重定向两次请求两次响应,转发一次请求一次响应;
3、重定向路径需要加项目名,转发不需要;
4、重定向可以调整到任意网站,不能传输数据。而转发只能在服务器内部进行;
小结:这就是request和response的相关知识,目前为止,http协议,request,response,servlet,tomcat的理论知识都学习了,那么对web开发也就有了一定的了解,在以后开发也就容易了,我们在项目开发的路上越走越近啊