请求过程:
每次请求都将会创建新的request&response对象。
-
HttpServletRequest
简介:
Servlet API 中定义的 ServletRequest 接口用于封装请求消息。
HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息。
在 service() 方法内部调用 HttpServletRequest 对象的各种方法来获取请求消息。
功能:
- 接收用户参数;
- 接收用户的所有请求头信息;
- 转发、包含;
- 作为域对象存放数据。
接收用户参数:
- 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
来源:oschina
链接:https://my.oschina.net/u/4415618/blog/4154327