Response:Response表明响应,响应消息中的状态码、响应头、实体内容均可以由它进行操做html
response.setContentType("text/html;charset=utf-8") ···解决中文乱码 response.getOutputStream().write(···); response.getWriter.wtite(···);
对于一次请求,Response的getOutputStream方法和getWriter方法是互斥,只能调用其一,特别注意forward后也不要违反这一规则web
response.setHeader("Content-Disposition","attachment;filename=1.jpg"/"attachment;filename="+URLEncoder.encode("图片.jpg", "utf-8")···将下载文件名改成中文); response.setHeader("Content-Disposition", InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg")); OutputStream out = response.getOutputStream(); byte[]bs = new byte[1024]; int i = 0; while((i=in.read(bs))!=-1){ out.write(bs,0,i); } in.close(); //将下载后的文件名改成中文 response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("图片.jpg", "utf-8")); response.setHeader("Content-Disposition", InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg")); OutputStream out = response.getOutputStream(); byte[]bs = new byte[1024]; int i = 0; while((i=in.read(bs))!=-1){ out.write(bs,0,i); } in.close();
response.getWriter().write(new Date().toLocaleString()); response.setHeader("Refresh", "1");
response.setContentType("text/html;charset=utf-8"); response.getWriter().write("恭喜您注册成功!3秒后回到主页....."); response.setHeader("refresh", "3;url=/Day04/index.jsp");
<html> <head> <meta http-equiv="Refresh" content="3;url=/Day04/index.jsp"> </head> <body> 恭喜您注册成功!3秒后回到主页...... </body> </html>
response.setIntHeader("Expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", System.currentTimeMillis()+想缓存的时间);
若是想缓存的时间超出int的范围,可转化为long型来计算,如:“1000*3600*24*30”
超出了int的范围,因此须要写成“1000l*3600*24*30”
。segmentfault
response.sendRedirect("地址");
实现验证码(https://segmentfault.com/a/11...浏览器
Request:Request表明请求对象,其中封装了对请求中具备请求行、请求头、实体内容的操做的方法缓存
String url = request.getRequestURL().toString(); System.out.println(url);
String uri = request.getRequestURI(); System.out.println(uri);
String qStr = request.getQueryString(); System.out.println(qSt):
String ip = request.getRemoteAddr(); System.out.println(ip);
String method = request.getMethod(); System.out.println(method);
String name = request.getContextPath(); System.out.println(name);
//获取某个请求头的方法 String value = request.getHeader("某个请求头"); System.out.println(value); //获取全部请求头的方法 Enumeration<String> enumeration = request.getHeaderNames(); while(enumeration.hasMoreElements()){ String name = enumeration.nextElement(); String value = request.getHeader(name); System.out.println(name+":"+value); } 得到具体类型客户机请求头 getIntHeader(name)方法 --- int getDateHeader(name)方法 --- long(日期对应毫秒)
getParameter(name) --- String 经过name得到值
getParameterValues --- String[ ] 经过name得到多值 checkbox
getParameterNames --- Enumeration<String> 得到全部name
getParameterMap --- Map<String,String[ ]> key :name value: 多值服务器
使用的HTML文件: <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <h1>POST提交</h1><hr> <form action="/Day04/servlet/ParamServlet" method="POST"> 姓名:<input type="text" name="username"/> 地址:<input type="text" name="addr"/> <input type="submit" value="提交" /> </form> <h1>GET提交</h1><hr> <form action="/Day04/servlet/ParamServlet" method="GET"> 姓名:<input type="text" name="username"/> 地址:<input type="text" name="addr"/> <input type="submit" value="提交" /> </form> </body> </html> //获取客户端提交的usename的值 String username = request.getParameter("username"); System.out.println(username); //遍历全部的请求参数并打印出来 Enumeration<String> enumeration = request.getParameterNames(); while(enumeration.hasMoreElements()){ String name = enumeration.nextElement(); String value = request.getParameter(name); System.out.println(name+":"+value); }
若是提交内容有中文从而致使乱码:jsp
对于POST提交,能够设置request.setCharacterEncoding("utf-8")来能够解决乱码ui
request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); System.out.println(username);
对于GET提交的乱码,只能手动的进行编解码从而解决乱码问题this
String username = request.getParameter("username"); username = new String(username.getBytes("iso8859-1"),"utf-8"); System.out.println(username);
做用范围:整个请求链上url
生命周期:当服务器收到一个请求,建立出表明请求的request对象,request开始。当请求结束,服务器销毁表明请求的request对象,request域结束.
做用:在整个请求链范围内共享数据,一般咱们在Servlet中处理好的数据会存入request域后请求转发到jsp页面来进行展现
Demo3: public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setAttribute("banana", "yellow banana"); this.getServletContext().getRequestDispatcher("/servlet/Demo4").forward(request, response); Demo4: String value = (String)request.getAttribute("banana"); System.out.println(value); 浏览器访问Demo3,而后Eclipse打印的结果为: yellow banana
request.getRequestDispatcher("").forward(request,response);
Demo5: request.getRequestDispatcher("/servlet/Demo6").forward(request, response); Demo6: response.getWriter().write("from demo6...."); 访问Demo5,浏览器上打印结果: from demo6
1)一个Servlet里两次请求转发也是不能够的,一次请求交给两人处理天然也是不行
2)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还能够重定向到同一个站点上的其余应用程序中的资源,甚至是使用绝对URL重定向到其余站点的资源。
request.getRequestDispatcher("").include(request,response);
Demo7: response.getWriter().write("from demo7"); request.getRequestDispatcher("/servlet/Demo8").include(request, response); Demo8: response.getWriter().write("from demo8"); 访问Demo7,浏览器上打印结果: from demo7from demo8
被包含的Servlet程序不能改变响应消息的状态码和响应头,若是它里面存在这样的语句,这些语句的执行结果将被忽略
1.绝对路径:以/开头的路径就叫作绝对路径,绝对路径在相对于的路径上直接拼接获得最终的路径。
2.相对路径:不以/开头的路径就叫作相对路径,相对路径基于当前所在的路径计算的到最终的路径。
1)若是路径是给浏览器用的,这个路径相对于虚拟主机,因此须要写上web应用的名称(最好用request.getContextPath()代替,以避免web名称有变化)。(前四个)
2)若是路径是个服务器用的,这个路径相对于web应用,因此能够省写web应用的名称。
<a href="/Day04/....."> <form action="/Day04/..."> <img src="/Day04/...."> response.setHeader("refresh","3;url=/Day04/..."); response.sendRedirect("/Day04/..."); request.getRequestDispathce("/index.jsp").forward(): request.getRequestDispathce("/index.jsp").include();
根据原理,具体问题具体分析
servletContext.getRealPath("config.properties");//--给一个相对于web应用目录的路径 classLoader.getResource("../../config.properties");//--给一个相对于类加载目录的路径 File file = new File("config.properties");//--相对于程序的启动目录 new InputStream("config.properties");//--相对于程序的启动目录