前言:进入了web的第二节课感觉很抽象,而且方法也非常多,非常的复杂,询问了学长的意见,还是得多敲多练,提高熟练度,争取做到,看一遍就能明白他这个方法的作用是什么;
一、HttpServletRequest
简单而说,这个类就是客户端(一些手机app,web网页)所包含的全部信息,都存放在这个类里;然后大体分为3个部分,请求头,请求行,请求体;
1:请求行;
想要获取请求行的信息,可以通过
req.getMethod()-获取请求方式
req.getRequestURL()-获取完整路径
req.getRequestURI()-获取处域名外的路径
req.getServletPath()-获取接口路径
req.getContextPath()-获取根路径
这些数据都需要通过doget方法后获取
2:请求头;
想要获取请求头的信息,可以通过一个枚举迭代器来获取请求行里的全部信息
因为请求头的信息是通过键值对来存储的,那我们就可以通过循环将键值全部循环出来,然后再通过while循环将键值所对应的数据打印出来
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
这里是通过键值将数据导入定义好的字符串里
String value = request.getHeader(name);
最后这边在输出字符串
System.out.println(value);
}
3,请求体;
获取请求体的信息,一般doget方法用不到,因为doget方法里面的数据都直接存放在它的路径上,不需要使用那个方法就可以直接在请求行里打印出来,所以一般使用在dopost方法里
//这边这一行必须要有,因为浏览器自带的编辑格式与服务端的不一样,所以这边要输入这个语句,这样传送的中文就不会出现乱码情况
req.setCharacterEncoding("utf8");
String name = req.getParameter("name");
System.out.println(name);
这样就能获取到post请求存放在方法体里的数据了
4,请求转发;
这个功能可以将这个路径下的数据,转发到下一个路径里,且浏览器的路径不会发生任何改变,这是一次请求,并且不能转发外部资源,只能转发内部资源
实现操作:前面那个就是一个发射器,将你要转发的路径存放到这个发射器里,后面就是一个命令,将你要转发的内容放进去,一般放的都是(req,resp)
request.getRequestDispatcher("转发路径").forward(request, response)
这个请求转发作用在于可以共享数据,在第一个端口通过setAttribute(String name, Object object) // 存储数据;
第二个端口就可以通过getAttribute(String name) // 通过键获取数据
想要删除数据时在第一个端口输入removeAttribute(String name) // 通过键移除数据
二,HttpServletResponse
1,当服务端要把信息传输到客户端时一般就是使用resp这个类来实现
//因为浏览器在接受服务端数据后会在响应头中寻找ContentType数据
//没有找到他就会使用默认自带编码格式GBK,而服务端
// 则使用的是UTF8会导致乱码
//所以这里我们主动写一个Content-Type,相应文本类型;修改的格式;
// resp.setHeader("Content-Type","text/html;charset=utf8");
//简便方法
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("<h1>湖人总冠军</h1>");
//可以自定义状态码 resp.setStatus(201);默认状态码是200
2,重定向
重定向和前面那个请求转发有所不同,重定向是会直接跳转到下一个接口,而请求转发则是会在浏览器里直接跳转到下一个接口,且重定向是两次请求,可以访问到外部资源
//这样可以动态获输入根路径,加上接口路径就可以实现跳转网站
resp.sendRedirect(req.getContextPath()+"/h08");
红色标记的方法正是req中访问请求行信息中的一个方法,这样可以获取根路径,因为根路径都是一样的,根路径+接口路径就可以成功跳转了;
三、ServletContext
这个官方话叫做Servlet上下文,用我自己的理解方式我觉得这个很像static的另一种版本;
只要你有去实现这个类,那么他所存储的数据都能被共享到
//只要是有实现servletContext对象以后,就能获取到存储的值 //这个对象是服务于整个工程的 ServletContext servletContext = req.getServletContext(); servletContext.setAttribute("a",10); servletContext.setAttribute("b",20);
setAttribute(name, value) | 添加数据 |
getArrtibute(name) | 获取数据 |
removeAttribute(name) | 删除数据 |
这边有个简易方法那就是直接req.getServletContext()。var他就会自己帮你把类型名打出来,更加简便;
2,获取mini类型,这个主要是可以知道什么输出什么样的数据,所对应的类型是什么东西
String filename = "a.jpg";
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);