Servlet13—— ServletRequest

问题引入

1、前端的页面发送的请求方式应当和服务器端需要的请求方式一致

  • 服务器需要前端发送POST请求,那前端就应该发送POST请求,若发送GET请求,服务器应当提示错误信息。
  • 服务器需要前端发送GET请求,那前端就应该发送GET请求,若发送POST请求,服务器应当提示错误信息。

2、怎么完成以上的需求?

在javaweb程序中想办法获取该请求是什么类型的请求,POST?还是GET?

当我们获取到请求方式之后,在javaweb程序中可以使用java语言中if语句进行判断

if( "POST".equals(method)){

}else if("GET".equals(method)){

}

3、怎么在jaxaweb程序中获取请求方式?

重点:HTTP的请求协议全部信息被自动封装到javax.servlet.http.HttpServletRequest对象中

在HttpServletRequest接口类型中有一个方法叫做: String getMethod(); 可以获取请求方式。

public interface javax.servlet.http.HttpServletRequest extends ServletRequest{

}

HttpServletRequest对象详解

javax.servlet.http.HttpServletRequestSUN制定的Servlet规范,是一个接口。表示请求HTTP请求协议”的完整内容都被封装到request对象中,HttpServletRequest接口的父接口是javax.servlet.ServletRequest

Apache软件基金会开发的“Tomcat容器”对javax.servlet.http.HttpServletRequest接口的实现类完整类名是org.apache.catalina.connector.RequestFacade,但是我们javaweb程序员不需要关心具体的请求对象类型,不需要关心是哪个容器,我们只需要面向HttpServletRequest接口调用方法即可。

一次请求对应一个请求对象,请求开始,请求对象被创建,请求结束,请求对象被回收,下一次请求的时候是一个新的请求对象。如何理解一次请求:从用户发送请求开始,到网页最终停下来,这是一次完整的请求(除重定向之外

ServletContext是Servlet上下文对象,该接口中也有这样几个方法:

void setAttribute(String name, Object o) //向ServletContext范围中添加数据

void getAttribute(String name) //向ServletContext范围中读取数据

void removeAttribute(String name) //移除ServletContext范围中数据

SerletContext范围是所有用户共享的一个范围对象,我们一般吧ServletContext命名为application,可见这个对象代表一个应用。一个webapp只有一个这样的对象,范围极大。

而HttpServletRequest类型的变量通常命名为request,代表当前的本次请求。一次请求对应一个request对象,100个请求对应100个请求对象。请求范围是极小的,request只能完成在同一次请求中传递数据。 例如,如果在服务器上有AServlet和BServlet两个对象,在AServlet中用setAttribute添加一个数据,在BServlet中并不能将其取出。如想能实现取出,需要实现“跳转”,执行AServlet之后,跳转到BServlet执行,将ASerlet执行和BServlet执行放到同一个请求当中,必须使用转发技术。

forword【转发】

1、获取请求转发器对象

RequestDispatcher dispatcher = request.getRequestDispatcher("/b");

2、调用转发器对象的forword方法即可实现转发

dispatcher.forward(request, response);

HttpServletRequest接口中常用的方法

1、获取参数Map

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

2、获取参数Map的所有key,获取所有参数的name

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

3、通过参数Map集合的key获取参数Map集合的valuevalue是一个字符串类型的一维数组)用于获取复选框提交的数据

String[] parameterValues = request.getParameterValues(String name);

4、通过用户提交的参数name获取参数value最常用的方法)

String value = request.getParameter(String name);

5、向HttpServletRequest对象中存储数据(绑定)

request.setAttribute(String name,Object obj);

6、从HttpServletRequest对象中获取数据(读取数据)

Object obj = request.getAttribute(String name);

7、移除HttpServletRequest对象中的数据

request.removeAttribute(String name);

8、使用request对象完成转发(转发是一次请求,一次请求跨越多个Servlet

request.getRequestDispatcher(资源路径).forward(request,response);

9、转发的代码下边不能再编写转发的程序。

转发的下一个资源可能是:JSPServletHTML等。

获取客户端的IP地址

String clientIP = request.getRemoteAddr();

10、获取URI

String uri = request.getRequestURI();

11、获取URL

StringBuffer url = request.getRequestURL();

12、获取Servlet Path

String servletPath = request.getServletPath();

13、获取应用程序的根路径,获取应用上下文路径(webapp的根路径)

String contextPath = request.getContextPath();

14、解决请求体中的乱码问题(在从request对象中获取任何数据之前设置有效)

request.setCharacterEncoding(“GB18030”);

15、在服务器端获取用户发送的请求中的所有Cookie

Cookie[] cookies = request.getCookies();

16、获取会话对象session

HttpSession sessoin = request.getSessoin();  获取session对象,如果获取不到则开启新session

HttpSession sessoin = request.getSession(true);   获取session对象,如果获取不到则开启新session

HttpSession sessoin = request.getSession(false);  获取session对象,如果获取不到则返回null

HttpServletRequest对象是一个请求级别的对象,一次请求一个对象,所以request对象只能完整在同一次请求中进行数据的传递,可以跨越多个Servlet进行数据的传递,但是必须使用转发机制。如果request对象和ServletContext对象都可以完成此功能,我们优先选择request范围。(到此为止我们已经讲过两个范围对象:ServletContextHttpServletRequest)。request不能完成跨用户传递数据。只能完成在一次请求中传递数据。

 

转载请注明出处:https://www.cnblogs.com/stu-jyj3621
原文地址:https://www.cnblogs.com/stu-jyj3621/p/14366663.html