指在JSP的<%=%> 和<% %>中可以直接使用的对象:没有特别说明可以开关的默认是开启的
一servlet理论上可以处理多种形式的请求响应形式http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和ServletResponse的之类 二
HttpServletRequest和ServletRequest都是接口
HttpServletRequest继承自ServletRequest
HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。如getHeader (String name),
getMethod ()
,getSession () 等等。
他们对应的实现类:
javax.servlet.ServletRequestWrapper (implements javax.servlet.ServletRequest)
javax.servlet.http.HttpServletRequestWrapper (implements javax.servlet.http.HttpServletRequest)
三
而所谓的request(在JSP中使用的)其实只是规范中的一个名称而已。它当然是一个对象,但并不是SUN提供的,这是由各个不同的Servlet提供商编写的,SUN只是规定这个类要实现HttpServletRequest接口,并且规定了各个方法的用途,但具体是什么类是由各个提供商自己决定的。
Snip20181120_1.png
pageContext(重要)
1、本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
scpoe的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(String name);
自动从page request session application依次查找,找到了就取值,结束查找。
2、它可以创建其它的8个隐式对象
在普通类中可以通过PageContext获取其他JSP隐式对象。自定义标签时就使用。
3、提供了的简易方法
pageContext.forward("2.jsp");
pageContext.include("2.jsp");
四大域对象
PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。
补充:具体实例
HttpServletRequest
对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。getRequestURI方法返回请求行中的资源名部分。getQueryString 方法返回请求行中的参数部分。getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。getRemoteAddr方法返回发出请求的客户机的IP地址。getRemoteHost方法返回发出请求的客户机的完整主机名。getRemotePort方法返回客户机所使用的网络端口号。getLocalAddr方法返回WEB服务器的IP地址。getLocalName方法返回WEB服务器的主机名。
/------------------华丽的分割线---------------------/
package gacl.request.study;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*** @author gacl* 通过request对象获取客户端请求信息*/
public class RequestDemo01 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 1.获得客户机信息*/String requestUrl = request.getRequestURL().toString();//得到请求的URL地址String requestUri = request.getRequestURI();//得到请求的资源String queryString = request.getQueryString();//得到请求的URL地址中附带的参数String remoteAddr = request.getRemoteAddr();//得到来访者的IP地址String remoteHost = request.getRemoteHost();int remotePort = request.getRemotePort();String remoteUser = request.getRemoteUser();String method = request.getMethod();//得到请求URL地址时使用的方法String pathInfo = request.getPathInfo();String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址String localName = request.getLocalName();//获取WEB服务器的主机名response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码response.setHeader("content-type", "text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.write("获取到的客户机信息如下:");out.write("<hr/>");out.write("请求的URL地址:"+requestUrl);out.write("<br/>");out.write("请求的资源:"+requestUri);out.write("<br/>");out.write("请求的URL地址中附带的参数:"+queryString);out.write("<br/>");out.write("来访者的IP地址:"+remoteAddr);out.write("<br/>");out.write("来访者的主机名:"+remoteHost);out.write("<br/>");out.write("使用的端口号:"+remotePort);out.write("<br/>");out.write("remoteUser:"+remoteUser);out.write("<br/>");out.write("请求使用的方法:"+method);out.write("<br/>");out.write("pathInfo:"+pathInfo);out.write("<br/>");out.write("localAddr:"+localAddr);out.write("<br/>");out.write("localName:"+localName);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
获得客户机请求头
getHeader(string name)方法:String
getHeaders(String name)方法:Enumeration
getHeaderNames()方法
获得客户机请求参数(客户端提交的数据)
getParameter(String)方法(常用)
getParameterValues(String name)方法(常用)
getParameterNames()方法(不常用)
getParameterMap()方法(编写框架时常用)
HttpServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了
session
一、在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
二、Session和Cookie的主要区别
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
三、session实现原理
服务器是如何实现一个session为一个用户浏览器服务的?
服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务