A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庞帅 初级黑马   /  2018-5-21 15:04  /  747 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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的属性.性的.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马