ServletContext
Servlet上下文对象
一个应用程序只有一个上下文对象
生命周期和Servlet的一样长.
上下文地址就是运行的项目地址
获取方式:
1.ServletContext Context = getServletContext();
2.ServletContext Context = getServletConfig.getServletContext;
方法:
-
Object getAttribute(String name): 获取属性值
-
void setAttribute(String name,Object value): 设置属性值
-
void remoteAttribute(String name):删除属性值
这个类底层用一个map映射:Map(String ,object)
这三个方法分别调用了get(key),put(key,value),remove(key)
-
String getContextPath():获取项目名称
-
String getRealPath():获取项目部署路径
这两个servlet一起指向ServletContex,ServletContex是公共且唯一的.
ServletContext主要用于访问量的统计
访问量的代码:
ServletContext application = this.getServletContext(); Integer count = (Integer)application.getAttribute("count"); if(count ==null){ count = 1; }else{ count++; } response.setContentType("text/html;charset=utf-8"); //设置响应的文本类型 response.getWriter().print("<h1>本页面一共被访问" + count + "次!</h1>"); application.setAttribute("count", count);
Servletrequest
原理:
主要的类:HttpServletRequest类
HttpServletRequest类的作用:
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的 信息。
主要的方法:
-
getRequestURI() 获取请求的资源路径
-
getRequestURL() 获取请求的统一资源定位符(绝对路径)
-
getRemoteHost() 获取客户端的 ip 地址
-
getHeader() 获取请求头
-
getParameter() 获取请求的参数
-
getParameterValues() 获取请求的参数(多个值的时候使用)
-
getMethod() 获取请求的方式 GET 或 POST
-
setAttribute(key, value); 设置域数据
-
getAttribute(key); 获取域数据
-
getRequestDispatcher() 获取请求转发对象
乱码问题: 1.POST
request.setCharacterEncoding("UTF-8");
2.GET
String username = request.getParameter("username"); //GBK username = new String(username.getBytes("GBK"),"UTF-8")
[理解请求转发]
Servletreponse
主要用到的类是HttpServletReponse
HttpServletReponse类的作用:
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
响应返回数据肯定要输出流,最重要的两个输出流:
-
字节流 :getOutputStream();
-
常用于下载(传递二进制数据)
-
-
字符流 :getWriter();
-
常用于回传字符串(常用)
-
两个流同时只能使用一个。 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
下载的代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("get请求"); boolean flag =false; if (flag){ response.sendRedirect("web/user/login.html"); } else{ String mine = getServletContext().getMimeType("D:\\桌面\\05.png"); response.setHeader("content-type",mine); response.setHeader("content-disposition","attachment;filename=05.png"); FileInputStream fis = new FileInputStream("D:\\桌面\\05.png"); OutputStream os = response.getOutputStream(); byte bys[] = new byte[1024]; while (fis.read(bys) !=-1){ os.write(bys); } os.close(); fis.close(); }
请求转发和重定位
请求转发:服务器收到请求后,从一次资源跳转到另一个资源的操作
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");//这是找去servlet2的路 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录 requestDispatcher.forward(req,resp);通过forward方法去到servlet2
重定位:
代码:
resp.sendRedirect("http://localhost:8080");
1.重定位需要请求两次
2.重定位的时候不能使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;
请求转发与重定位的区别:
-
请求转发是一个请求,而重定向是两个请求;
-
请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
-
请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
-
请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
-
重定向的第二个请求一定是GET;
-
请求转发是在服务端内部执行的,而重定向是在客户端执行的.