HTTP应用
概念
HTTP继承自GenericServlet实现类,而GenericServlet则实现了Servlet接口。
因此从不严格的意义上来讲,属于Servlet的分支,因此全称为’HttpServlet‘。
HTTP是WEB服务的一种,我相信我不必多讲了。
创建和使用
创建方式一:手动创建
步骤一:创建一个类,继承实现类‘HttpServlet’
并按Alt+回车重写两个方法,分别为’doPost‘和’doGet’
步骤二:
在WebServlet注解处声明一个’loadOnStartup
‘属性或者’value
‘属性来定义虚拟路径
创建方式二(推荐):IDEA快捷生成
步骤一:选择一个作为包名,右键单击,选择’new’,再单击‘Servlet‘
接着会弹出一个对话框,让你设置类名,默认点OK就行。
步骤二:
在WebServlet注解处声明一个’loadOnStartup
‘属性或者’value
‘属性来定义虚拟路径
doGet类方法
用于请求和响应,如果客户请求(即访问)的类型为get,那么将会触发或用到该方法
当你访问指定的虚拟路径时,将会触动该方法
doPost类方法
同样也用于请求和响应,如果客户请求(即访问)的类型为post,那么将会触发或用到该方法
请求行/请求头/请求体
大致概念
请求信息是HTTP理论的核心,它分为请求行/请求头/请求体,当你浏览网页时,基本每个数据包都有这种信息。
请求行的概念
请求行如果要具体归纳,是服务器专门获取的信息,比如它能够获取配置项目中的虚拟目录等等
请求头的概念
用于获取用户的一些HTTP版本协议,以及浏览器等相关信息
请求体的概念
用于获取用户从浏览器提交给服务器的信息
只有在POST方式的情况下,才能获取请求体
request和response对象
request和response是HttpServlet中的一个封装对象
request和response对象是由服务器创建的。
从大致的概念来讲,request对象是来获取客户从浏览器发来的请求消息,response对象来设置响应消息。
request对象的概念与应用
概念
request
是HttpServlet体系中的一个对象,准确来讲,request就是HttpServletRequest,而HttpServletRequest不仅仅是个接口,还继承了ServletRequest接口中的方法。
request对象中的方法可以对客户请求过来的请求行,请求头,请求体数据进行详细地获取(查看)
因此,它的应用于请求行,请求头,请求体。
请求行的方法应用
request中的方法可以应用于客户请求过来的请求行数据
话不多说,来看。
方法一. 获取请求方式
格式:String 自定义结果名 = request.getMethod();
列如:
String methodGet = request.getMethod();
方法二.获取项目配置中的虚拟目录
注意,是获取项目配置中的
虚拟目录,而不是WebServlet注解的虚拟目录
格式:String 自定义结果名 = request.getContextPath();
列如:
String inventedPath = request.getContextPath();
方法三.获取Servlet(注解)路径
这个是获取WebServlet注解
所指定的虚拟路径名
格式:String 自定义结果名 = request.getServletPath();
列如:
String serverPath = request.getServletPath();
方法四.获取get请求方式的参数
注意:当请求方式为get(也就是doGet)时才会有效
格式:String 自定义结果名 = request.getQueryString();
列如:
String queryString = request.getQueryString();
方法五.获取所请求的URL
获取客户要请求的目标URL链接
格式:StringBuffer 自定义结果名 = request.getRequestURL();
列如:
StringBuffer requestUrl = request.getRequestURL();
方法六.获取所请求的URI
获取客户要请求的目标URI链接
注意,是URI,不是URL
URI和URL的区别在于,只会获取除域名外的路径
如:
请求URI为:/hexie/nihao
请求URL为:http://localhost:8080/hexie/nihao
格式:String 自定义结果名 = request.getRequestURI();
列如:
String requestUri = request.getRequestURI();
方法七. 获取协议(HTTP)及版本
格式:String 自定义结果名= request.getProtocol();
列如:
String protocol = request.getProtocol();
方法八.获取客户机的IP地址
格式:String 自定义结果名 = request.getRemoteAddr();
列如:
String remoteAddr = request.getRemoteAddr();
请求头的方法应用
获取请求头中的信息,可以应用于防盗链等等。
有两个方式,一个是单个获取,一个是返回成集合,
但后者的集合只能获取头名,所以麻烦,现在用的不多。
方式一(推荐):根据请求头的名字,获取请求头的值
注意:请求头名必须全部为小写
格式:String 自定义结果名 = request.getHeader("请求头的名字");
列如:
String header = request.getHeader("user-agent");
方式二(不推荐):获取所有请求头的名字,返回成一个集合
格式:Enumeration<String> 自定义结果名 = request.getHeaderNames();
列如:
Enumeration<String> headerNames = request.getHeaderNames();
//default Iterator<E> asIterator() 返回一个Iterator ,它遍历此枚举覆盖的其余元素。
//boolean hasMoreElements() 测试此枚举是否包含更多元素。
//E nextElement() 如果此枚举对象至少有一个要提供的元素,则返回此枚举的下一个元素。
请求体的方法应用
话不多说,所谓请求体,上面也讲了,此处讲的是如何获取用户从浏览器提交的数据(如表单)等。
请求体分为两种方式,一个是获取字符流的请求体,一个是获取字节流的请求体
这都属于IO流学过的知识,我就不多说了。
只有在POST方式的情况下,才能获取请求体
方式一:以字符流获取
格式:BufferedReader 自定义字符流请求体接收名 = request.getReader();
列如:
BufferedReader reader = request.getReader();
方式二:以字节流获取
格式:ServletInputStream 自定义字节流请求体接收名 = request.getInputStream();
列如:
ServletInputStream input = request.getInputStream();
请求体的其它方法
在关于请求体的方法中,实际上不仅仅能通过字节或字符流获取请求体的内容,也能通过其它方法直接获取。
【【【注意】】】准备工作:解决中文参数值乱码
如果请求体的参数为中文会存在乱码,在Tomcat8及以后的版本中,已经将get请求方式乱码问题解决了
但post方式依然存在乱码,因此需要进行编码转换。
设置参数值编码的固定格式:request.setCharacterEncoding("utf-8");
方法一:根据请求体的参数名称获取参数值
格式:String 自定义结果接收名 = request.getParameter("欲获取请求体的参数名称");
列如:
String dateResult = request.getParameter("comment");
方法二:根据请求体的参数名称获取该符合条件名称的参数值,返回一个集合
当html文件中存在多个name属性值相同的参数标识时,又想都获取时,则使用该方法
格式:String[] 自定义结果接收名 = request.getParameterValues("pass");
列如:
String[] passes = request.getParameterValues("pass");
for (String pass : passes) {
System.out.println(pass);
}
方法三:获取所有请求体的参数名称,返回一个集合
格式:Enumeration<String> 自定义结果接收名 = request.getParameterNames();
列如:
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);
}
方法四:获取所有请求体的参数名称和其对应的参数值,返回一个map集合
格式:Map<String, String[]> 自定义结果接收名 = request.getParameterMap();
列如:
Map<String, String[]> parameterMap = request.getParameterMap();
for (String key : parameterMap.keySet()) {
String[] values = parameterMap.get(key);
System.out.println("键名:"+key);
for (String value : values) {
System.out.println("请求体名称:"+value);
}
}
请求转发
概念
转发是什么不用我说了吧,当初搞nginx时就研究了转发
具体来讲,就是当你访问某个页面时,该页面把网页跳转到了其它页面,但URL链接还是不变,还是原来页面的链接。
特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
创建格式一(繁琐,不推荐)
步骤一:通过request对象获取请求Dispatcher转发器对象
格式:RequestDispatcher 自定义dispatcher转发器对象名 = request.getRequestDispatcher("/被转发的虚拟路径");
列如:
RequestDispatcher dispatcherObj = request.getRequestDispatcher("/zhuanfaTwo");
步骤二:通过Dispatcher对象来进行转发
格式:自定义dispatcher转发器对象名.dispatcherObj.forward(request对象名,response对象名);
列如:
dispatcherObj.forward(request,response );
创建格式二(推荐,链式编程)
格式:request.getRequestDispatcher("/被转发的虚拟路径").forward(request对象名,response对象名);
列如:
request.getRequestDispatcher("/zhuanfaTwo").forward(request,response);
共享数据
所谓共享数据,这是’请求转发’下的一种应用,
当’转发处页面’接收到了用户请求的信息数据了后,将其数据传递给’被转发的目标页面’.
那么此时,'被转发的页面’也可以使用’转发处页面’所获取到的用户请求数据了.
代码必须写在转发方法的前面.
创建与使用
步骤一:根据参数名,将欲获取参数值存储,并命名自定义的域对象名(在转发处页面定义)
格式:request.setAttribute("自定义存储域对象名",欲传递的任意类型的参数);
列如:
request.setAttribute("test",paramResult );
步骤二:根据’自定义存储域对象名’来接收转发处页面传递过来的参数(在被转发的目标页面定义)
格式:Object 自定义接收域对象的结果名 = request.getAttribute("欲接收的自定义域对象名");
列如:
Object test = request.getAttribute("test");
步骤三(可省略):删除存储域对象名
格式:request.removeAttribute("欲接收的自定义域对象名");
获取ServletContext
格式:ServletContext 自定义ServletContext对象名 = request.getServletContext();
BeanUtils的应用
概念
BeanUtils是一种用于封装HTTP信息的工具,它需要两个jar包,分别是
commons-beanutils-1.8.0.jar
和 commons-logging-1.2.jar
往常,当要对用户浏览器提交的表单(请求体)用于sql数据库的效验时,我们常常需要用到’getParameter’和用户对象的’setXXXX’方法来进行信息封装,这个过程未免过于麻烦.
而BeanUtils则简化了这一过程,能够简单地将用户浏览器提交的表单数据封装到(用户的)信息储存的对象中
但需要注意的是:由于是简化了封装过程,因此网页提交处的’name’属性值,必须同信息存储对象的成员变量名一样
BeanUtils是什么?有什么用?Apache基金提供的一个用来封装JavaBean对象的一个工具。
JavaBean: Java(咖啡名) Bean(豆子)
就是Java语言中最基本的数据结构,用来存储数据。
怎么样定义JavaBean:
1、public修饰的
2、必须有public的无参构造(方便创建JavaBean)
3、所有的成员变量需要私有(保存数据、封装的特性)
4、根据需要提供公有的get/set方法
BeanUtils就是一个可以帮助我们把数据填充到JavaBean的一个工具(利用了get/set)
方法:
setProperty(Object obj, String 属性名, Object 属性值)
Object 属性值 = getProperty(Object obj, String 属性名)
populate(Object obj, Map map)
使用步骤
步骤一 导入commons-beanutils-1.8.0.jar
和 commons-logging-1.2.jar
这两个Jay包
步骤二 以集合地形式获取其请求体的数据
格式:Map<String, String[]> 自定义结果接收名 = request.getParameterMap();
列如:
Map<String, String[]> mapResut = request.getParameterMap();
步骤三 将集合中的请求体参数数据加入到指定的信息储存对象中
格式: BeanUtils.populate(指定的信息储存对象,自定义结果接收名);
列如:
try {
BeanUtils.populate(userObj,mapResut);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}