JavaWeb基础学习(三)--Request & Response

丶灬走出姿态 提交于 2020-05-02 04:02:56

请求过程:

       每次请求都将会创建新的request&response对象。

  • HttpServletRequest

简介:

Servlet API 中定义的 ServletRequest 接口用于封装请求消息

HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息。

在 service() 方法内部调用 HttpServletRequest 对象的各种方法来获取请求消息。

 

功能:

  1. 接收用户参数;
  2. 接收用户的所有请求头信息;
  3. 转发、包含;
  4. 作为域对象存放数据。

              

接收用户参数:

  • getParameter(String)              :根据名字获取参数,返回String类型

//获取<input type=”text” name=”username”>的值

String username = request.getParameter(“username”);  

  • getParameterValues(String)    :根据名字获取一组参数,返回String[ ]

//获取多个<input type=”checkbox” name=”hobby” value=”…” >的值

String [] hobbys = request.getParameterValues(“hobby”);

注意:如果指定的参数未传递,请求时会报空指针异常,此时用前先判断。

  • getParameterNames()             :获取所有参数名,返回Enumeration

//获取所有参数名字

Enumeration<String> names = request.getParameterNames();

  • getParameterMap()                :获取所有数据,返回Map类型

//获取所有数据

Map<String,String[]> map = request.getParameterMap();

 

乱码出现的原因:

提交数据之前,页面根据设置的格式进行编码之后发送给tomcat,

tomcat默认编码格式为iso-8859-1,

因此request得到的内容都是iso-8859-1的编码格式,

从而造成乱码问题。

注:tomcat8之前URIEncoding默认使用iso-8859-1编码,tomcat8中默认使用UTF-8编码,因此8中get请求不会出现中文乱码。

 

两种解决方式:

  •  (不常用)

String name = requst.getParameter("name");//目前得到的是iso-8859-1的编码

byte[] bys = name.getBytes("iso-8859-1");//根据iso-8859-1获取字节码

String name1 = new String(bys,"utf-8");//根据utf-8重新编码,组成新字符串

response.setContentType("text/html;charset=utf-8");

 

  • (常用)

// 获取数据之前调用,只能在post类型有效,

request.setCharacterEncoding("utf-8");

String name = request.getParameter("name");

response.setContentType("text/html;charset=utf-8");

 

获取请求行中相关信息:

构建项目地址:

//假设当前项目地址为--http://localhost:8080/javaweb_program/

String http = request.getScheme();       // http

     

String serverName = request.getServerName();// localhost

     

int serverPort = request.getServerPort(); // 8080

     

String contextPath

=request.getContextPath();      // /javaweb_program

 

String basePath

= http+"://"+serverName+":"+serverPort+contextPath+"/";

 

  • 请求转发

转发:是将请求在服务器内部交给另一个组件再去执行,同时共享request中的数据。

1.地址栏不变

2./代表:当前web应用的跟路径(建议以/开始),不带斜线就是相对路径

3.浏览器只发出一次请求

4.可以共享数据

5.只能转发到本web应用中的位置

  • HttpServletResponse

简介:

Servlet API中定义的ServletResponse接口类用于创建响应消息。

HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。

 

       功能:

1. 设置响应内容

       给用户输出html数据

2. 设置响应头

       请求时的请求头由tomcat服务器来读取,但响应时的响应头由浏览器来读取,用于影响浏览器的行为。如是否要缓存这次响应的数据、状态码

3. 重定向

       将请求发送回浏览器。然后由浏览器再重新向服务器自动的发送一个请求。

 

       设置响应内容:

  • 字符流输出

方法:PrintWriter out = response.getWiter();

                out.write(“”);

如果仅是输出 html信息,文本信息,则就可以使用字符。

  • 字节码输出

方法:ServetOutputStream outStream = response.getOutputStream()

如果是下载文件,如 *.avi,则可以使用字节码

*这两个是互斥的,即如果已经使用了一个,则另一个就不能再被调用

 

      设置响应头:

HTTP1.1中启用Cache-Control 来控制页面的缓存与否

  • no-cache,浏览器和缓存服务器都不缓存页面信息;
  • public,浏览器和缓存服务器都可以缓存页面信息;
  • no-store,请求和响应的信息都不被存储在对方的磁盘系统中;

//不允许浏览器端或缓存服务器缓存当前页面信息。

resp.setDateHeader(“Expires”, 0);  //过期时间

resp.setHeader( "Cache-Control", "no-chache" );

 

      请求重定向

请求重定向:指的是一个web资源受到客户端请求后,通知客户端去访问另外一个web资源。

使用方法:response.sendRedirect(路径)

特点

  • 浏览器会向服务器发送两次请求,意味着会有两个request/respose
  • 浏览器地址栏会发生变化。
  • 不会共享request中的数据,但可以在重定向的路径中使用?name=value的方式传送简单数据。
  • 执行重定向状态码为302(请求重定向).
  • /代表的是当前web站点(服务器)路径,而不是web应用的路径,例如,http://localhost:8080/,转发的路径则是http://localhost:8080/webapp1

因此使用重定向建议写绝对地址(request.getContextPath+”/servlet”)。

  • 重定向的URL可以是其他应用,不局限于当前应用,例如重定向到百度

 

转发与重定向的区别

转发只能将请求转发给同一个WEB应用中的组件;

重定向可以到同一个站点上的其他应用程序中的资源,也可使用绝对URL重定向到其他站点的资源。

 

转发时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录;

重定向相对URL以“/”开头,它是相对于整个WEB站点的根目录。

 

转发是由服务器内部实现的。

重定向由浏览器再次发出一个请求。

 

转发方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程,共享数据;

重定向方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程,所以数据不共享。

 

转发后浏览器地址栏保持初始的URL地址不变。

重定向后浏览器地址栏保持初始的URL地址改变。

 

转发时请求的类型(GET/POST)不变

重定向时的被调用者的请求类型只能是get

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!