JavaWeb:Servlet之二
HTTP协议
- 什么是协议
- 协议是指双方或多方,相互约定好的,都需要遵守的规则,叫协议
- 所谓HTTP协议,就是指,客户端和服务器发送的数据需要遵守的协议
- HTTP协议中的数据又称报文
- 客户端给服务器发送数据叫请求
- 服务器给客户端回传数据叫响应
请求行
- 请求方式(GET/POST)
- 请求的资源路径
- 请求的协议(HTTP/1.1)
请求头(GET)
- Accept:告诉服务器,客户端可以接受什么类型的数据
- Accept-Language:告诉服务器,客户端可以接受的语言类型(zh_CN/en_US)
- User-Agent:用户的代理(浏览器的信息)
- Accept-Encording:告诉服务器,客户端可以接受的数据编码
- Host:表示请求的服务器的ip和端口号
- Connection:告诉服务器链接如何处理
- Keep-Alive:告诉服务器回传完数据不要立即断开连接保存一小段时间
- Closed:告诉服务器回传完数据马上关闭
请求头(POST)
大部分的请求头是一样的
- Referer:表示请求发起时,浏览器中的地址
- Content-Type:表示发送的数据的类型
- application/x-www.form-urlencoded:表示通过键值对的方式进行提交,然后对其进行url编码
- url编码是将非英文的内容转换为
%xx%xx的形式
- url编码是将非英文的内容转换为
- multipart./form-data:表示以多段的形式提交给服务器(通过流的方式)
- application/x-www.form-urlencoded:表示通过键值对的方式进行提交,然后对其进行url编码
- Content-Length:表示发送数据的长度
- Cashe-Control:表示如何控制缓存
- no-cashe不缓存
HTTPServletRequest
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法( doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
常用方法
-
getRequestURI:获取资源路径
request.getRequestURI(); //返回值为/W1_3/servletapi -
getRequestURL:获取资源的统一资源定位符(绝对路径)
request.getRequestURL(); //返回值为http://localhost:8080/W1_3/servletapi -
getRemoteHost:获取客户端的ip
System.out.println(request.getRemoteHost()); //返回值为127.0.0.1 -
getHeader:获取请求头
System.out.println(request.getHeader("Accept")); -
getParameter:获取请求的参数
-
getParameterValues:获取请求的参数(多个)
-
getMethod:获取请求的方式(GET或POST)
System.out.println(request.getMethod()); -
setAttribute(key,value):设置域数据
request.setAttribute("key1","value1"); -
getAttribute(key):获取域数据
request.getAttribute("key1"); -
getRequestDispatcher:获取请求转发对象
-
setCharacterEncoding("UTF-8"):设置字符集,必须放在最前面
request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String pwd = request.getParameter("pwd"); System.out.println("用户名:"+username); System.out.println("密码:"+pwd);
请求的转发
request.getRequestDispatcher(url).forward(request,response)
请求转发的特点
- 浏览器的地址栏没有变
- 他们是一次请求
- 他们共享Request域中的数据
- 可以转发到WEB-INFO目录下
- 无法访问工程以外的资源
在跳转时,浏览器的地址栏不变,在a标签使用../../..的形式时,可能会出错
使用base标签可以设置当前页面中所有相对路径工作时,参照哪个路径进行跳转。
<base href="xxxx">
相对路径和绝对路径
相对路径
- . 表示当前木库
- .. 表示上一级目录
- 资源名:表示当前目录/资源名
绝对路径
http://ip:port/工程名路径/资源路径
斜杠
"/"被浏览器解析为http://ip/port
"/"被服务器解析为http://ip/port/工程路径
特殊的情况:response.sendRediect("/")指将斜杠发送给浏览器解析
HttpServletResponse
与HttpServletResquest类似,每次请求进来,Tomcat都会创建一个Response对象。
使用两个流,一个字符流、一个字节流。两个流只能同时使用一个,不能一起使用。
getOutPutStream() 字节流 常用于下载(传递二进制文件)
getWrite() 字符流 常用于回传字符串(常用)
//谷歌使用GBK字符集,因此想要在谷歌浏览器中输出内容,需将服务器的字符集改为GBK
response.setCharacterEncoding("GBK");
PrintWriter writer = response.getWriter();
writer.println("喵喵喵");
或者
response.setCharacterEncoding("UTF-8");
//或者通过响应流修改浏览器的字符集
response.setHeader("Content-Type","text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.println("喵喵喵");
response.setContentType("text/html; charset=UTF-8");
//如上方法可以修改服务器和客户端的编码表
//此方法必须在获取流对象之前才有效。
请求重定向
随着时间的推移和项目的不断更新、升级,Response1这个接口慢慢被废弃,由新的接口Response所取代。客户端请求时需进行响应,响应代码为302(我已搬迁)然后在location响应头上给出新的地址,客户端解析地址后重新进行请求。
//---------Response1-----------
System.out.println("快被淘汰了!");
response.setStatus(302);
response.setHeader("Location","http://localhost:8080/W1_3/response2");
//---------Response2-----------
System.out.println("已经代替它了!");
请求重定向的特点
- 浏览器地址栏会产生变化
- 发送了两次请求
- 不共享Request里的数据
- 不能访问WEB-INF下的资源
- 可以访问工程外的资源
请求重定向的第二种方法
response.sendRedirect("http://localhost:8080/W1_3/Response2");
JAVAEE的三层模式


浙公网安备 33010602011771号