HttpServletRequest和ServletRequest都是接口,HttpServletRequest继承自ServletRequest ;
1、获取项目路径
请求地址: http://localhost:8090/JSPStudy/09/index.jsp
- req.getServletPath(): 获取请求地址 ,得到相对项目的url,不带项目名称
System.out.println( servletPath);
打印结果:/09/index.jsp
- req.getContextPath():获取网站跟路径,得到部署的项目名(Context-root),不是URL,仅仅项目名字
System.out.println(path);
打印结果:/JSPStudy
- req.getRequestURI():得到相对服务器的url,getRequestURI带有项目root,以项目名称为开头
System.out.println(urlString);
打印结果:/JSPStudy/09/index.jsp
- request.getRealPath("/"):得到应用程序部署在服务器上的绝对路径
System.out.println(realpath);
打印结果:\JAVA\.metadata\.me_tcat85\webapps\JSPStudy\
- ((HttpServletRequest) req).getRequestURL():得到绝对地址url
System.out.println("绝对路径" + requestUrl);
打印结果:http://localhost:8090/JSPStudy/09/index.jsp
运行结果:
2 、获取HttpSession对象
HttpSession session = req.getSession();
String flag = (String) session.getAttribute("flag");
设置Session:
session.setAttribute("flag", "login_success")
清空session:
3、获取RequestDispatcher对象
RequestDispatcher对象由Servlet容器来创建,封装一个由路径所标识的服务器资源;
RequestDispatcher dispatcher=req.getRequestDispatcher("/09/login.jsp");
RequestDispatcher接口的两种请求转发:
dispatcher.forward(request, response):这个方法将请求从一个 Servlet or JSP目标资源 上 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件,这些资源必须是当前Web上下文中的),让其它的资源去生成响应数据。
例如用户请求的是目标资源A,A接受到请求后,转发到B,真正产生响应数据是被转发的资源B,而A只是起个引导转发作用。浏览器的地址栏不会变,依然是A的URL
dispatcher.include(request, response):此方法用于包含响应中某个资源(servlet、JSP 页面和 HTML 文件)的内容。
调用者指定一个被包含的资源,将这个包含的资源(JSP,Servlet,HTML)的响应数据包含到自己的响应体中。被包含的数据是在服务器上经过运行产生的,因此是动态包含,而不同于JSP中的include指令,它是JSP转译期的静态包含,类似于C语言中的宏一样。
4、HttpServletResponse接口中的sendReadirect()方法和RequestDispatcher接口中forward()方法的区别
区别:
- 定位与转发 :sendReadirect()方法是重新定位到另外一个资源来处理请求,URL会重新定位,让客户端重新访问另外一个资源。 forward()方法是转发到另外一个资源来处理请求。URL不会变化。隐藏了处理对象的变化。
- 处理请求的资源的范围 :sendReadirect()方法可以跨WEB应用程序和服务器重新定位资源来处理请求。 forward()方法只能在应用程序内部转发。
sendReadirect()方法原理:
- 客户端发送请求,servletA作出处理;
- servletA调用sendReadirect()方法,将客户端的请求重新定位到ServletB;
- 客户端浏览器访问ServletB;
- ServletB客户端对浏览器作出响应;
forward()方法原理:
- 客户端发送请求,servletA作出处理;
- ServletA调用forward()方法,将请求转发给ServletB来处理请求,为客户端服务;
- ServletB对客户端浏览器作出响应;