问题引入
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.HttpServletRequest是SUN制定的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集合的value(value是一个字符串类型的一维数组)用于获取复选框提交的数据
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、转发的代码下边不能再编写转发的程序。
转发的下一个资源可能是:JSP、Servlet、HTML等。
获取客户端的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范围。(到此为止我们已经讲过两个范围对象:ServletContext、HttpServletRequest)。request不能完成跨用户传递数据。只能完成在一次请求中传递数据。