HttpServletRequest(request的一些API)

一、request的运行流程

首先,自己写一个web工程,也就是建一个工程;当把该web工程发布到Tomcat服务器当中,可以让外界访问,这就成了一个web应用。
在客户端输入一个网站,是web应用资源的地址URL,该请求会在浏览器客户端自动生成一个http请求,然后客户端会将相应的请求发送到相应的服务器内部,服务器首先由Tomcat引擎接收该请求,然后Tomcat引擎会分析http协议上的请求行,该请求行上面有请求方式,根据请求方式是get还是post从而确定调用是doGet方法还是doPost方法,请求行上面有地址,Tomcat会帮你找该地址在的Tomcat服务器内部的某一个web应用(Tomcat容器中web-app下可以存放多个web应用),找到对应的web应用之后,开始创建对象,默认第一次访问创建对象,默认调用servlet方法,重写servlet方法之后会调用doGet方法或者doPost方法,当调用doGet方法的时候,需要两个参数。一个是request,一个是response,这两个参数,谁去调用改doGet方法管提供这个俩个参数,doGet方法由Tomcat引擎负责调用,它在调用的时候,帮你创建两个对象,一个是request代表请求,一个是response代表响应。其中request内部封装http请求的所有内容;response是空的,因为它代表响应,response有自己的缓冲区,可以向缓冲区里面添加内容,可以添加响应行、响应头、响应体(分别有对应的方法),添加完成之后,Tomcat引擎会获取缓冲区内容,会组装成http响应的东西,然后发送到客户端,通过装包也可看到,客户端获得这些内容会自动根据响应进行解析,最终在页面上显示响应体的内容。

二、ServletContext域和Request域的生命周期

ServletContext
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用

Request
创建: 访问时创建request对象
销毁:响应结束request销毁
(生命周期为一瞬间)
域的作用范围:一次请求中

三、转发和重定向的区别

1).重定向两次请求 转发一次请求
2).重定向的地址栏的地址变化 转发的地址不变
3).重定向可以访问外部网站 转发不能访问外部网站,只能访问内部资源
4).转发的性能要优于重定向

四、客户端地址与服务器端地址的区别

客户端地址:是客户端去访问服务器的地址,服务器外部的地址
客户端地址必须写上web应用的名称,代表要去Tomcat容器中去找哪个web应用
例如:
直接输入地址
重定向
也就是,只要是服务器外部跳出服务器,然后再去访问服务器内部的资源,豆角客户端地址

服务器端地址:是服务器内部资源跳转访问的地址
不需要写web应用的名称
例如:
转发

总结:

request获得请求行的内容

获得请求方式:request.getMethod();
获得请求资源:request.getRequestURI();
request.getRequestURL();这个长,协议、主机名、端口都有
动态获得web应用的名称:request.getContextPath();
获得客户机的一些信息:request.getRemoteAddr();

request获得请求头的内容

request.getHeader(name);

request获得请求体(请求参数)

request.getParameter(name);//返回值为String
request.getParameterMap();//将所有的数据以Map形式封装,返回值为Map
request.getParameterValues(name);//返回值为String[]字符串数组

注意: 客户端发送的参数,到服务器端获得后都是字符串
获得中文乱码 的解决:

post提交: request.setCharacterEncoding("UTF-8");
get提交: parameter = new String(parameter.getBytes("iso8859-1"),"UTF-8");//先用iso8859-1默认编码再用UTF-8解码

request转发和域

转发:request.getRequestDispather(转发的地址,服务器内部的地址,不需要web应用名称).forward(request, response);
例如:request.getRequestDispatcher("/login.jsp").forward(request, response);
存:request.setAttribute(name,value);
取:request.getAttribute(name,value);//取的时候需要强转一下

你可能感兴趣的:(Javaweb小笔记)