Servlet的Request&Response

2 request请求转发

1.1.1 POST请求方式乱码处理


乱码产生的原因

网络之间传输数据,统一传输编码为UTF-8

我们编写的源码编码为UTF-8,为了保证不乱码,服务器的解析编码必须是UTF-8

也就是我们常说的三码和一,文件编码,传输码,解析码都为UTF-8

但,tomcat的默认解析编码为ISO-8859-1,所以只要写中文一定乱码

 解决方案:

方式1:先解码,后重新编码

//对获取到的内容先解码,然后重新编码

username = new String(username.getBytes("ISO-8859-1"),"UTF-8");

方式2:设置请求的解析编码为UTF-8(一定在数据接收之前)

//在接收数据之前设置解析码为UTF-8

request.setCharacterEncoding("UTF-8");

1.1.2 GET请求方式乱码处理

l GET请求只有一种解决方案,即先解码,后重新编码

l 使用username.getBytes("ISO-8859-1");方式把乱码内容还原成解析前的字节

l 使用new String(value,"UTF-8");对内容重新编码,使得乱码问题得以解决

request请求转发

2.1 request作为 域对象 使用

转发(forward

可以理解为就是内容性跳转,地址栏不会发生改变,不可以跳转到外部资源,只能转到站内资源

获得请求转发器

RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发

forward(ServletRequest request, ServletResponse response)

 

总结:浏览器客户端总向服务器发起了一次请求,但是服务器内部悄悄的做了资源替换,最终呈现的内容其实不是用户直接请求的那个内容

 

优点:1,资源在服务器内部做了替换,效率非常高

2,有效的保护真正资源地址

2.2 request作为 域对象 使用

【用来暂时存放数据,用法相当于一个map

//request对象中加入一个值,两个参数分别表示参数的名称key以及参数的值value

request.setAttribute("url", "www.baidu.cn");

//根据参数的名称获取参数的值value,参数名为对应存储的参数名称key

String url = (String) request.getAttribute("url");

System.out.println("url:"+url);

//移除存储的数据信息,通过key移除value

request.removeAttribute("url");

3 response响应对象

3.1 介绍

response对象是专门用来给客户端响应数据的!

HTTP协议规定,响应的数据由3个部分组成:

1. 响应行 协议和版本     状态码    状态描述

2. 响应头 给浏览器的额外信息

3. 响应体 也就是响应的内容


【浏览器根据不同的状态码,会给出不同的处理方式。】

3.2 请求重定向

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置。

可以理解为就是完全性跳转,地址栏会发生改变,可以跳转到外部资源,其实就是浏览器重新发起了一次请求

设置响应状态码为302,告诉浏览器所请求的资源已转移至新的url

同时设置响应头location,告诉浏览器资源被转移到了哪个位置,浏览器会重新请求新的地址。

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//告诉浏览器,你请求的资源转移了

response.setStatus(302);

//告诉浏览器转移的地址

response.setHeader("location", "http://www.baidu.cn");

}

 

请求重定向的简单写法:

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//请求重定向的另一种写法,更常用

response.sendRedirect("http://www.baidu.cn");

}

注:

2XX:请求OK

3XX:重定向信息

4XX:找不到或者不可用

5XX:请求到了目标资源,但是服务器内部有错,不能正常响应

4  ServletContext

4.1 ServletContext对象介绍

如图ServletContext代表整个web应用,所有的servlet共享同一个ServletContext

我们又把ServletContext称为Servlet的资源管理器。

功能有

1, 获取全局初始化参数

2, 作为域对象使用,ServletContext对象是整个WEB应用的域对象

3, 获取资源在应用中的绝对路径

4.2 ServletContext域对象

由于ServletContext对象是WEB应用的域对象,能够被所有的Servlet所共享,所以能够实现数据的共享。

ServletContextText.java部分代码

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//获取context对象

ServletContext servletContext = request.getServletContext();

//context对象中加入值

servletContext.setAttribute("address", "上海市浦东新区");

//context对象中获取值

String address = (String) servletContext.getAttribute("address");

System.out.println("address:"+address);

}

ServletContextTest01.java部分代码

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取ServletContext对象

ServletContext servletContext = request.getServletContext();

//context对象中获取值

String address = (String) servletContext.getAttribute("address");

System.out.println("address:"+address);

}

ServletContext的生命周期,web项目发布运行后,它就存在了,服务器关闭时销毁

1, 获取全局配置参数

2, 作为域对象使用

3, 由于所有的servlet共享了同一个ServletContext所以只要服务器没有重启,在任何一个ServletContext中存入了值,在其他的servlet中都可以取得到

5  重点总解

5.1 Servlet的执行流程

Servlet的执行流程【重要:要能明白一个请求从发出到,到达servlet并执行其内部方法的全过程】


项目发布后的内容:

1, 项目的根目录

2, 项目根目录中没有,就要去找WEB-INF/web.xml文件


5.2 使用request获取请求的数据

 request获得请求行信息和ip地址

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//获取请求方式

String method = request.getMethod();

//获取URI,请求资源标识符

String uri = request.getRequestURI();

//获取URL,请求资源定位符

String url = request.getRequestURL().toString();

//获取请求协议

String protocol = request.getProtocol();

//获取客户端ip}

 request获取头信息

public class Header extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//获取所有的请求头信息,返回一个枚举集合

Enumeration<String> headerNames = request.getHeaderNames();

while (headerNames.hasMoreElements()) {

String string = (String) headerNames.nextElement();

System.out.println(string);

}

//根据具体的请求头名称获取对应的值

//获取浏览器的版本信息

String agent = request.getHeader("user-agent");

System.out.println("agent:"+agent);

} 

}


5.3 使用response返回响应得数据

响应体:给浏览器发送的网页内容

response对象中,有2个对象可以完成内容的响应:

OutputStream: 字节流

Writer: 字符流

这两种都可以完成网页内容的响应,OutputStream主要用于后期资源的下载,而响应网页内容一般使用Writer来完成

PrintWriter writer = response.getWriter();

writer.write("你好");

writer.println(",李四");

write方法和println方法的区别是,参数的类型不同,print方法可以接收任意类型的参数,然后最终调用write方法响应字符内容,当print方法中给一个对象的时候,会自动调用对象的toString方法

 

字节流和字符流不能同时使用,否则会报异常!


5.4 转发和重定向的区别

转发在服务器端完成的;重定向是在客户端完成的 

转发的速度快;重定向速度慢 
转发的是同一次请求;重定向是两次不同请求 
转发不会执行转发后的代码;重定向会执行重定向之后的代码 
转发地址栏没有变化;重定向地址栏有变化 
转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

5.5 GETPOST中文编码处理(URLEncodeURLDecode

l GET请求只有一种解决方案,即先解码,后重新编码

l 使用username.getBytes("ISO-8859-1");方式把乱码内容还原成解析前的字节

l 使用new String(value,"UTF-8");对内容重新编码,使得乱码问题得以解决


1.6 RequestServletContext作用域区别

  servletContext    它代表了servlet环境的上下文,相当于一个全局变量,即只要某个web应用在启动中,这个对象就一直都有效的存在,所以它的范围是最大的,存储的数据可以被所有用户使用,只要服务器不关闭,数据就会一直都存在

 Request       保存的键值仅在下一个request对象中可以得到。

猜你喜欢

转载自blog.csdn.net/weixin_36547870/article/details/80053584