学习servlet
Servlet–>GenericServlet–>HttpServlet
我们常用的就是它的孙子类HttpServlet
一、HttpServletRequest常用方法
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
1.常用方法
String getMethod(): 返回请求方式(GET/POST)
String getRequestURI():返回请求行中资源名字部分: 如/test/index.html
StringBuffer getRequestURL():返回浏览器地址栏的内容
String getContextPath():获取上下文路径(虚拟目录),<Context path=“上下文” …/>
String getRemoteAddr():返回请求服务器的客户端的IP地址
String getHeader(String headName):根据指定的请求头获取对应的请求头的值.
2.获取请求参数的方法
String getParameter(String name):根据参数名称,获取对应参数的值.
String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
Enumeration<String> getParameterNames(): 获取所有请求参数的名字
Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
key:参数名称
value:参数值,封装在String数组中.
3.中文乱码
在tomcat8中已经自己解决get获取参数的乱码问题,post得手动解决
req.setCharacterEncoding(“UTF-8”)
4.请求转发
通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
// 常用方式转发到servlet2资源
req.getRequestDispatcher("/servlet2").forward(req, resp);
特点:
浏览器地址栏路径不发生变化
只能转发到当前服务器内部资源中
转发只发送一次请求
5.共享数据
域对象: 一个有作用范围的对象,可以在范围内共享数据
request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法
void setAttribute(String name,Object obj):在servlet1存储数据
Object getAttitude(String name):就可以在servlet2通过键获取值
void removeAttribute(String name):通过键移除键值对
二、HttpServletResponse常用方法
ServletResponse接口: 响应对象, 封装了获取所有响应信息(状态行, 响应头, 请求实体)的方法
HttpServletResponse接口:是ServletResponse的子接口, 处理HTTP协议响应的方法.
1.常用方法
OutputStream getOutputStream():获取字节输出流对象. :一般输出图片
response.getOutputStream().writer(“你好”.getBytes(“这里面可以指定字符编码”));
Writer getWriter():获取字符输出流对象 :输出内容,一般输出文字
response.getwriter().writer(“Hello,world”)
如果输出内容为中文会乱码
response.setContextType(“text/html;charset=utf-8”);告诉浏览器用什么编码来解码,乱码解决
2.重定向
当访问responseDemo1,会自动跳转到/responseDemo2
---------方式一------------
设置状态码
resp.setStatus(302);
设置响应头 location
resp.setHeader(“location”, “/Servlet/responseDemo2”);
---------方式二------------
resp.sendRedirect("/Servlet/responseDemo2");
1).重定向的特点:redirect
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
2).转发的特点:forward
-
转发地址栏路径不变
-
转发只能访问当前服务器下的资源
-
转发是一次请求,可以使用request对象来共享数据
4.常见应用
1).向浏览器输出消息
2).下载文件
-
获取下载文件路径
-
下载文件名叫啥
-
设置想办法让浏览器支持我们下载需要的东西
-
获取下载文件的输入流
-
创建缓冲区
-
获取outputStream对象
-
将FileOutputStream流写入到buffer缓冲区
-
使用outputStream将缓冲区的数据输出到客户端
package com.wangningbo.servlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; /** * @author wangningbo * @date 2020/6/7 - 12:11 */ public class HelloHttpServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取下载文件路径 String realpath = "E:\\myidea_workspace\\javaweb\\05-study-javaweb\\httpservlertresponse-01\\target\\classes\\老婆.jpg"; //下载文件名叫啥,截取到文件名 String fileName = realpath.substring(realpath.lastIndexOf("\\")+1); System.out.println(fileName); //设置想办法让浏览器支持我们下载需要的东西,一中文命名会存在编码问题,指定URLEncoder.encode(fileName,"UTF-8") resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); //获取下载文件的输入流 FileInputStream inputStream = new FileInputStream(realpath); //创建缓冲区 byte[] bytes = new byte[1024]; //获取outputStream对象 ServletOutputStream outputStream = resp.getOutputStream(); //将FileOutputStream流写入到buffer缓冲区,使用outputStream将缓冲区的数据输出到客户端 int i = 0; while ((i=inputStream.read(bytes))!=-1){ outputStream.write(bytes,0,i); } outputStream.flush(); inputStream.close(); outputStream.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
三、绝对路径和相对路径
1.相对路径:通过相对路径不可以确定唯一资源
如:./index.html
不以/开头,以.开头路径
规则:找到当前资源和目标资源之间的相对位置关系./:当前目录
…/:后退一级目录
2.绝对路径:通过绝对路径可以确定唯一资源
如:http://localhost/day15/responseDemo2
/day15/responseDemo2以/开头的路径
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
建议虚拟目录动态获取:String contextpath=request.getContextPath()
contextpath+"/responseDemo2"
例如:<a> , <form> 重定向…
给服务器使用:不需要加虚拟目录
例如:转发路径
四、ServletContext(里面的功能后期用其他的来代替掉,了解)
1.ServletContext概述
ServletContext对象,tomcat为每一个web项目单独创建的一个(ServletContext)上下文(知上知下贯穿全文)对象。服务器启动的时候,为每个WEB应用创建一个单独的ServletContext对象,我们可以使用这个对象存取数据,用这个对象存取的数据,可以在整个WEB应用中获取.
服务器会为每个应用创建一个ServletContext对象:
ServletContext对象的创建是在服务器启动时完成的;
ServletContext对象的销毁是在服务器关闭时完成的。
2.获取ServletContext对象
request.getServletContext();
或者
this.getServletContext();
3.ServletContext常用功能
1)获取MIME类型:在互联网通信过程中的一种文件数据类型
String name = “a.jpg” // 类型为:image/jpeg
String mimeType = this.getServletContext().getMimeType(filname);
2)多个servlet之间共享数据
ServletContext很大一旦创建所有的servlet都可以从其中拿数据,生命周期很长,数据也不安全
this.getServletContext().setAttribute(String name,Object object) 向ServletContext中存数据
this.getServletContext().getAttribute(String name) 从ServletContext中取数据
this.getServletContext().removeAttribute(name) 从ServletContext中移除数据
3)获取文件真实路径
获取文件保存的位置 :
1.src下 : 发布到 /WEB-INF/classes/a.txt
String path = this.getServletContext().getRealPath("/WEB-INF/classes/a.txt");
2.web目录下 : 发布到/a.xt
String path = this.getServletContext().getRealPath("/a.txt");
3.WEB-INF目录下 : 发布到 /WEB-INF/a.txt
String path = this.getServletContext().getRealPath("/WEB-INF/a.txt");
String getRealPath(String str) 获取资源绝对路径
getResourceAsStream(String str) 获取资源输入流对象
参数 : str 与 getRealPath()的参数一致
返回值 : 输入流对象, 用来直接读取文件.