response & request
<!-- 配置全局初始化参数 --> <context-param> <param-name>username</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>123</param-value> </context-param> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> Response:代表响应的对象,从服务器向浏览器输出内容 【Response的常用的API】 Ø 响应行: * 设置状态码. Ø 响应头: * 针对一个key对应多个value的头信息.
* 针对一个key对应一个value的头信息. Ø 响应体 文件下载的方式: Ø 一种:超链接下载.直接将文件的路径写到超链接的href中.---前提:文件类型,浏览器不支持. Ø 二种:手动编写代码的方式完成文件的下载. * 设置两个头和一个流: * Content-Type :文件的MIME的类型. * Content-Disposition :以下载的形式打开文件. * InputStream :文件的输入流. getServletContext().getMimeType(String filename); "attachment;filename="+filename); 文件下载的核心思想:io读/写 InputStream in = new FileInputStream(“服务器上的路径”); OutputStream os = response.getOutputStream(); 模板代码读,写: int len = 0; byte[] b = new byte[1024]; while((len = is.read(b))!= -1){ os.write(b, 0, len); } is.close(); 中文文件的下载: IE浏览器下载中文文件的时候采用的URL的编码. Firefox浏览器下载中文文件的时候采用的是Base64的编码. response输出响应内容的方法: 向页面响应的方法: * getOutputStream();字节流 * getWriter();字符流 * 这两个方法是互斥的. * 做出响应的时候只能使用其中的一种流响应. * 输出中文乱码的处理: * 字节流:(不一定会乱码)(一般用于文件下载) * 设置浏览器默认打开的编码: * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”); * 设置中文字节取出的时候编码. * “中文”.getBytes(“UTF-8”); * 字符流:(一定会乱码) * 设置浏览器打开的时候的编码 * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”); * 设置response的缓冲区的编码 * response.setCharacterEncoding(“UTF-8”); 写在所有输出之前 ***** 简化的写法:response.setContentType(“text/html;charset=UTF-8”); 【Request的概述】 Ø Request代表用户的请求. 【Request的API】 功能一:获得客户机相关的信息 Ø 获得请求方式: Ø 获得请求的路径:
Ø 获得客户机相关的信息: Ø 获得工程名: 功能二:获得从页面中提交的参数: 功能三:作为域对象存取数据: 【演示request获得客户机的信息】 // 获得请求方式: String method = request.getMethod(); System.out.println("请求方式:"+method); // 获得客户机的IP地址: String ip = request.getRemoteAddr(); System.out.println("IP地址:"+ip); // 获得用户的请求的路径: String url = request.getRequestURL().toString(); String uri = request.getRequestURI(); System.out.println("获得请求的URL:"+url); System.out.println("获得请求的URI:"+uri); // 获得发布的工程名: String contextPath = request.getContextPath(); System.out.println("工程名:"+contextPath); 请求中文乱码的解决: 现在无论是GET还是POST提交中文的时候,都会出现乱码的问题. 解决: Ø POST的解决方案: * POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码. * 设置request的缓冲区的编码: * request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK. Ø GET的解决方案: * 1.修改tomcat的字符集的编码.(不推荐) * 2.使用URLEncoder和URLDecoder进行编码和解码的操作. * 3.使用String的构造方法: file:///C:\Users\john\AppData\Local\Temp\ksohtml\wps8B50.tmp.jpg new String(request.getParameter(“filename”).getBytes(“IOS-8859-1”),”UTF-8”); Request作为域对象存取数据:使用request对象存取数据: * setAttribute(String name,String value); * Object getAttribute(String name); request的作用范围: * 作用范围就是一次请求的范围. * 创建和销毁: * 创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象. * 销毁:当服务器对这次请求作出了响应之后. 面试题: 重定向和转发的区别:(redirect和forward的区别) 1. 重定向的地址栏会发生变化,转发的地址栏不变 2. 重定向两次请求两次响应,转发一次请求一次响应 3. 重定向路径需要+工程名,转发的路径不需要加工程名 4. 重定向可以跳转到任意网站,转发只能在服务器内部进行转发
cookie && session && JSP cookie Ø 会话 :用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器 关闭的过程称为是一次会话. Ø 常见的会话技术: * Cookie:将数据保存到客户端浏览器. * Session:将数据保存到服务器端. Ø 使用会话技术原因: * 私有的数据,购物信息数据保存在会话技术中. 【Cookie技术的使用】 Ø 向浏览器保存数据: HttpServletResponse有一个方法: * void addCookie(Cookie cookie); Ø 获得浏览器带过来的Cookie: HttpServletRequest有一个方法: * Cookie[] getCookies(); Ø 创建一个Cookie对象: * Cookie(String name,String value); 【cookie的常用API】 Ø cookie的常用的API: * getName(); * getValue(); * setDomain(String domain); --设置Cookie的有效域名.//www.baidu.com music.baidu.com * setPath(String path); -- 设置Cookie的有效路径. * setMaxAge(int maxAge); -- 设置Cookie的有效时间. Ø cookie的分类有关: * 会话级别的Cookie:默认的Cookie.关闭浏览器Cookie就会销毁. * 持久级别的Cookie:可以设置Cookie的有效时间.那么关闭浏览器Cookie还会存在. 手动销毁持久性Cookie. setMaxAge(0)---前提是有效路径必须一致. cookie不能直接存中文,用URLEncoder.encode()编码,之后用URLEncoder.decode()解码,之后存储中文 1.记录商品浏览记录 2.记录的最大长度3,1-2-3 4-1-2 3.商品按照时间的倒叙排列 1-3-4 3-1-4 面试题: 数组->定长,ArrayList可变 ArrayList底层实现原理 LinkedList ArrayList 增删改 查询遍历 ArrayList 底层的实现就是一个数组(固定大小),当数组长度不够用的时候就会重新开辟一个新的数组,然后将原来的数据拷贝到新的数组内。 LinkedList 底层是一个链表,是由java实现的一个双向链表其节点如下: class Node { private Node privious;//指向前一个节点 private Object value;//当前节点的value值 private Node next;//指向下一个节点的值,类似于指针。 } 然后实现其增删改查操作,和数据结构中链表的增删改查完全相同,而且插入是有序的。 HashMap底层是一个数组+链表实现。其基本原理是:定义一个LinkedList的数组,然后将数据存储到这个链表数组内,例如:LinkedList []list = new LinkedList[1000]; session 【session的概述】 cookie本身是有大小和个数的限制,cookie可以人为操作.Session没有限制.Cookie的数据保存在客户端,Session数据保存在服务器端. Ø Session的执行原理:基于cookie的. Ø 使用Session: * 获得Session: -----request.getSession();(可以存储数据) *session.setAttribute(String name,Object value);(存储数据) *Object value = session.getAttribute(String name);(读取数据) *removeAttribute(String name);(删除数据) 【Session是域对象】 session的创建和销毁及作用范围: * 创建:服务器端第一次调用getSession()创建session. * 销毁:三种情况销毁session: * 1.session过期. 默认过期时间为30分钟. * 2.非正常关闭服务器.如果正常关闭session序列化到硬盘. * 3.手动调用session.invalidate(); * 作用范围:多次请求.(一次会话) 一次会话(根本原因:存sessionID的cookie默认是会话级别) 针对自己项目配置session过期时间:单位:分钟 <session-config> <session-timeout> 5 </session-timeout> </session-config> 【使用JS控制图片切换】 <script type="text/javascript"> function changeImg(){ document.getElementById("img1").src="/day11/CheckImgServlet?time="+new Date().getTime(); } </script> Jsp 【JSP的简单概述】 Ø JSP :Java Server Pages(Java服务器端页面).JSP = Java代码 + HTML的元素 + JSP内置东西 JSP是动态网页开发技术 Ø JSP的执行过程: * JSP会被翻译成Servlet,编译成class进行执行的. Ø JSP的嵌入Java代码:JSP的脚本元素 * <%! %>:翻译成类中的成员部分. 定义变量,定义方法,定义类.Servlet是线程不安 全的,尽量少在类中定义成员属性!!(相当于声明) Ø * <% %>:翻译成类的service方法内部的内容.定义变量,定义类,直接写代码块. Ø * <%= %>:翻译成service方法内部的out.print();不能加‘;’(相当于表达式) 【JSP的注释】-了解 Ø HTML的注释 :<!-- 注释 --> Ø Java代码的注释 :// 单行注释 /*多行注释*/ /** 文档注释 */ Ø JSP的注释 :<%-- JSP的注释 --%> 【JSP的指令】 Ø 指令的语法: <%@ 指令名称 属性名称=”属性值” 属性名称=”属性值” ...%> Ø JSP中有三个指令:page指令, include指令, taglib指令. Ø JSP中page指令:<%@ page %> -- 设置JSP的. * language :JSP脚本中使用的语言.现在只能写java.(了解) * contentType :设置浏览器打开这个JSP的时候采用的默认的字符集的编码.(了解) * pageEncoding :设置文件保存到本地硬盘,以及生成Servlet后,Servlet保存到硬盘上的编码.(了解) * import :在JSP中引入类对象.但是import可以出现多次. <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> * extends :设置JSP翻译成Servlet后继承的类,默认值:值org.apache.jasper.ru ntime.HttpJspBase,这个值要想修改,这个类必须是HttpServlet的子类 * autoFlush :设置JSP的缓存自动刷出.true:自动刷出. * buffer :设置JSP的缓冲区的大小,默认8kb. * session :设置在JSP中是否可以直接使用session对象.默认值是true. * isELIgnored :设置在JSP中是否忽略EL表达式$(msg).默认值是false不忽略. * errorPage :设置错误友好页面的提示. * isErrorPage :通过这个设置显示JSP的错误信息. * 设置全局的错误友好页面: * 在web.xml中设置: <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page> Ø JSP中的include指令:指示JSP包含其他的页面.(静态包含) <%@ include file="logo.jsp" %> <%@ include file="menu.jsp" %> <h1>BODY部分</h1> <%@ include file="footer.jsp" %> Ø JSP中的taglib指令:指示JSP引入标签库. <%@ taglib uri="标签的URI的路径" prefix="标签的别名" %> 【JSP的内置对象(*****)】面试点 Ø JSP的内置对象:在JSP中可以直接使用的对象. Ø JSP中有9大内置对象: * request--真实对象-->HttpServletRequest getParameter(),setAttribute(String name,Object value); * response--真实对象-->HttpServletResponse setHeader(String name,String value);getOutputStream();getWriter(); * session--真实对象-->HttpSession setAttribute();getAttribute(); * application--真实对象-->ServletContext setAttribute();getAttribute(); * page--真实对象-->Object toString();wait(); * pageContext--真实对象-->PageContext:JSP的第四个域对象 setAttribute();getAttribute(); * config--真实对象-->ServletConfig getServletName();getServletContext(); * out--真实对象-->JspWriter write(),print(); * exception--真实对象-->Throwable 用时设置isErrorPage=”true” getMessage(),getCause(); page内置对象 :真实对象是Object,就是JSP翻译成Servlet后的类的引用. out内置对象 :out和response.getWriter是不是同一个对象?区别是什么? v 不是,out真实对象JspWriter ,response获得Writer是PrintWriter. pageContext内置对象 : 作用: * 获得其他的8个内置对象:编写通用性代码或者框架的时候. * 向JSP的四个域中存取数据: JSP的四个域范围:(技能拔高) * PageScope :当前页面中有效. pageContext PageContext * RequestScope :一次请求范围. request HttpServletRequest * SessionScope :一次会话范围. session HttpSession * ApplicationScope :应用范围 application ServletContext PageContext.findAttribute(String name)(当名称一样时,可以实现其他三个范围) 【JSP的动作标签】列出6个. Ø 标签的作用:简化代码. <jsp:forward page=””/>:用于页面的转发. * <jsp:forward page="/demo1-jsp/demo3-object/demo3.jsp"></jsp:forward> Ø <jsp:param /> :用于带有路径的标签下,传递参数. Ø <jsp:include page=””/>:用于页面的包含.(动态包含)(面试) *****静态包含和动态包含的区别?(<%@ include%>和<jsp:include>) l 1.动态包含用的元素是page,有两种形式。静态包含用的是file,只有一种形式。 l 2.生成的文件不同,静态的包含是将两个jsp文件二合一,生成一个以包含页面命名的servlet和class文件,动态包含的两个jsp文件各自生成自己的servlet和class文件。(静态包含:相当于copy,翻译成servlet,编译成.class,执行。) l 3. 传参方式一:<jsp:include page=“a.jsp?param=123”/>时被包含的jsp页面是可以访问该参数的。 l 4. 传参方式二: <jsp:include page=“a.jsp”> <jsp:param name=“” value=“”> <jsp:param name=“” value=“”> </ jsp:include > l 5.在客户端访问包含页面时地址栏后面直接加上参数后传递,这种形式的传参是客户端送来的,但是这两个页面的request对象不是同一个,因为3中已经说了包含的页面可以向被包含的页面传递参数,所以被包含的request对象含的参数个数应该大于等于包含页面的参数个数的。所以它们各有各的request对象。而且被包含的jsp页面可以访问传到包含页面的参数。 l 6.动态包含只有在执行到它的时候才加载,所以它才叫动态包含。 <jsp:useBean /> :用于在JSP中使用JavaBean. <jsp:setProperty /> :用于在JSP中向JavaBean设置属 <jsp:getProperty /> :用于在JSP中获得JavaBean的属性.性的.
|