HTTP,Hyper Text Transfer Protocol,超文本传输协议,定义了客户端和服务器通信时,发送数据的格式。其特点是:
【HTTP历史版本】:
【请求消息数据格式】:
request对象和response对象是由服务器创建的,我们来使用他们;request对象是来获取请求消息对象,response对象是来设置响应消息数据。
1)request对象的继承体系结构如下:
ServletRequset ——接口
| 继承
HttpServletRequest ——接口
| 实现
org.apache.catalina.connector.RequestFacade类(tomcat)
2)request对象的功能:
2、获取请求头数据
通过请求头名称获取请求头的值:String getHeader(String name);
获取所有的请求头名称:Enumeration<String> getHeaderNames(); @WebServlet("/requestDemo2") public class RequestDemo2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String s = headerNames.nextElement(); String value = request.getHeader(s); System.out.println(s+"---"+value); } //user-agent头 String agent = request.getHeader("user-agent"); if(agent.contains("Chrome")){ System.out.println("谷歌来了"); }else if(agent.contains("Firefox")){ System.out.println("火狐来了"); } //referer头 String referer = request.getHeader("referer"); System.out.println(referer); //防盗链 if(referer!=null){ if(referer.contains("/4.servlet")){ System.out.println("非盗链"); }else{ System.out.println("盗链"); } } } }
3、获取请求体数据
请求体:只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数;
获取步骤:1、获取流对象
--BufferedReader getReader():获取字符输入流,只能操作字符数据;
--ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据;
2、从流对象中拿数据 @WebServlet("/requestDemo3") public class RequestDemo3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedReader reader = request.getReader(); String line = null; while ((line=reader.readLine())!=null){ System.out.println(line); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
1、获取请求参数通用方式:GET或POST方式均可
》String getParameter(String name):根据参数名称获取参数值; username=zhang&password=123
》String[] getParameterValues(String name):根据参数名称获取参数值的数组;hobby=1&hobby=2
》Enumeration<String> getParameterNames():获取所有请求的参数名称
》Map<String,String[]> getParameterMap():获取所有参数的map集合
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
String s = headerNames.nextElement();
String value = request.getHeader(s);
System.out.println(s+"---"+value);
}
//user-agent头
String agent = request.getHeader("user-agent");
if(agent.contains("Chrome")){
System.out.println("谷歌来了");
}else if(agent.contains("Firefox")){
System.out.println("火狐来了");
}
//referer头
String referer = request.getHeader("referer");
System.out.println(referer);
//防盗链
if(referer!=null){
if(referer.contains("/4.servlet")){
System.out.println("非盗链");
}else{
System.out.println("盗链");
}
}
}
}
【中文乱码问题】:get方式:tomcat8 已经将get乱码问题解决了;
post方式:在获取参数前设置request的编码 ,request.setCharacterEncoding("utf-8");
2、请求转发:一种在服务器内部的资源跳转方式,步骤:
》通过request对象和以前请求转发器对象:RequestDispatcher getRequestDispatcher(String path);
》使用该对象进行转发:forward(ServletRequest request, ServletResponse response);
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("requestDemo4被访问了");
//转发到demo5资源
request.getRequestDispatcher("/requestDemo5").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
请求转发的特点:
3、共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据;
request域对象:代表一次请求的范围,一般用于请求转发的多个资源中共享数据,提供的方法:
》setAttribute(String name,Object obj):存储数据;
》Object getAttribute(String name):通过键获取值;
》void removeAttribute(String name):通过键移除键值对;
4、获取ServletContext:ServletContext getServletContext();
下面通过一个登录案例,对上述的request对象相关方法进行实战,需求如下:
对于以上需求,分析如下:
开发步骤:
代码就不往上贴了,登录案例的实战代码传送门。
以上我们在LoginServlet中封装User对象时,是一个个获取再封装的,若参数较多时就比较麻烦了,有没有简单的封装方式?这里我们介绍下一个开源工具类,BeanUtils,加完jar包(commons-beanutils-1.8.0.jar)后使用步骤如下示例:
//2、获取所有请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
//3、创建user对象
User loginUser = new User();
try {
BeanUtils.populate(loginUser,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
BeanUtils就是用来封装JavaBean的,JavaBean是标准的Java类,就是用来封装数据的,定义要求如下:
BeanUtils的几个重要方法:
———————————————————————————————————————
本文为博主原创文章,转载请注明出处!