传智播客javaweb笔记全套_第1页
传智播客javaweb笔记全套_第2页
传智播客javaweb笔记全套_第3页
传智播客javaweb笔记全套_第4页
传智播客javaweb笔记全套_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lesson1一、eclipse工具的使用1.java代码的位置 1)选择工作空间workspace选择一个文件夹存放程序(代码)不要用中文和空格 2)新建一个java工程(Project) 3)建包建类2.快捷键alt+/:代码自动补齐,需要配置的翻开preferences(首选项),搜keys,翻开快捷键配置面板搜alt+/,取消绑定搜contentassist,取消原先的绑定,配置成alt+/ctrl+1:错误自动修复,注意,放行的红叉是可修复的,圆形的是不可修复的 导包的三种方式: 1〕将类名敲完整,按下alt+/进展补齐,会自动导包 2)ctrl+1,修正错误 3)ctrl+shift+o整理包,导入需要的包,去掉多余的导包语句ctrl+shift+f:代码格式化 ctrl+2,L自动声明变量shift+enter光标直接进入下一行ctrl+alt+方向键(向上向下)复制行alt+方向键(向上向下)移动当前行3.断点调试1)可以对程序进展调试 在行的开头双击左键打断点,用debug方式来运行程序,程序就会停留在断点位置F5跳入(stepinto)跳入方法内部F6跳过,让当前行运行F7跳出返回上一层程序resume直接运行到下一个断点2)查看源代码建议使用断点调试的方式,注意当前运行环境需要包含源码4.junit单元测试 1)写一个java类,声明测试方式 修饰符为publicvoid, 在方法前面加注解,(@Test) 此方法就可以进展测试了(交给junit运行) 2)需要在测试方法前做初始化工作 写一个静态方法publicstaticvoidinit() 在方法前加注解@BeforeClass 3)需要在测试后释放资源 写一个静态方法 在方法前加注解@AfterClass二、jdk5新特性1.静态导入1)导入类的静态属性importstaticjava.lang.System.out;out.println("haha");2)导入类的静态方法importstaticjava.lang.Math.*; //导入Math类的所有静态成员intnum=abs(-10);2.增强for循环1)作用:对存储对象的容器进展迭代2)jdk5以前怎么迭代3)增强for循环迭代数组String[]arr={"a","b","c"}; //数组的静态定义方式,只试用于数组首次定义的时候//传统方式for(inti=0;i<arr.length;i++){ //i依次表示数组的角标 Strings=arr[i]; System.out.println(s);}System.out.println("");//在jdk5中我们可以使用增强for循环迭代//增强for循环括号里写两个参数,第一个是声明一个变量,变量类型必须是数组元素的类型//第二个就是需要迭代的容器//for循环会循环容器的length次,每次都将容器的第n-1个元素赋值给声明的变量for(Strings:arr){ //循环体,执行 //每次都将arr中的第n-1个元素给s System.out.println(s); //}3.根本数据类型的包装类int-->Integerbyte-->Byteshort-->Shortlong-->Longchar-->Characterdouble-->Doublefloat-->Floatboolean-->Boolean1)Integerx=1;x=x+1;经历了什么过程?装箱à拆箱à装箱2)为了优化,虚拟机为包装类提供了缓冲池,Integer池的大小-128~127一个字节的大小3)String池Java为了优化字符串操作提供了一个缓冲池面试题:Strings=“abc〞和Strings=newString(“abc〞)的区别Strings=newString(“abc〞)创立了几个对象Strings=“a〞+“b〞+“c〞+“d〞创立了几个对象Strings1=“a〞Strings2=“b〞Strings3=s1+s2;s3==〞ab〞?/*1.Strings="abc",虚拟机首先会检查String池里有没有"abc"对象(通过equals方法) //如果有,直接返回引用,如果没有,会在池里创立一个“abc〞对象,并返回引用 Strings1="abc"; Strings2="abc"; System.out.println(s1==s2); //result:true */ /*2.Stringstr=newString("abc");不管缓冲池是否有"abc",都会在堆内存创立一个"abc"对象,返回引用 //此时,负责检查并维护缓冲池,其实堆内存的对象是缓冲池中"abc"对象的一个拷贝 Strings1=newString("abc"); Strings2=newString("abc"); System.out.println(s1==s2);//result:false */ /*3.Strings="a"+"b"+"c"+"d";java编译器有个合并量的优化功能 //在编译阶段就把"a"+"b"+"c"+"d"合并为〞abcd“ Strings="a"+"b"+"c"+"d"; // Strings="abcd"; System.out.println(s=="abcd");//result:true */ /*4.Strings1="a";Strings2="b";Strings3=s1+s2; //String是常量,不能相加的,java如何实现的? StringBuildersb=newStringBuidler(s1); sb.append(s2); s3=sb.toString();也就是说实际上s3是方法返回的String对象但凡方法返回的字符串对象都是在堆内存的 */ Strings1="a"; Strings2="b"; Strings3=s1+s2; //堆内存的对象 System.out.println(s3=="ab");//result:false4)单列集合CollectionListlist=newArrayList();list.add("aaa");list.add("bbb");list.add("ccc");//传统方式1/*1.获得迭代器Iteratoriter=list.iterator();//2.循环判断迭代器是否有下一个while(iter.hasNext()){ Stringstr=(String)iter.next(); //将迭代器的指针移向下一个,并将迭代当前指向的元素返回 System.out.println(str);}*///传统方式2for(Iteratoriter=list.iterator();iter.hasNext();){ Strings=(String)iter.next(); System.out.println(s);}System.out.println("");//增强for循环,没有使用泛型的集合能不能使用增强for循环迭代?能for(Objectobj:list){ Strings=(String)obj; System.out.println(s);}5)双列集合MapMapmap=newHashMap();map.put("a","aaa");map.put("b","bbb");map.put("c","ccc");//传统方式迭代1//1.获得所有的keySetkeys=map.keySet();//2.迭代keys获得所有的keyIteratoriter=keys.iterator();while(iter.hasNext()){ Stringkey=(String)iter.next(); //abc //3.根据key获得对应的value Stringvalue=(String)map.get(key); System.out.println(key+"="+value);}System.out.println("");//传统方式2,必须掌握这种方式//1.获得所有的键值对Entry对象Setentrys=map.entrySet();//2.迭代出所有的entryiter=entrys.iterator();while(iter.hasNext()){ Map.Entryentry=(Entry)iter.next(); //分别获得key和value Stringkey=(String)entry.getKey(); Stringvalue=(String)entry.getValue(); System.out.println(key+"="+value);}System.out.println("");System.out.println("增强for循环迭代,");//增强for循环迭代,//原那么上map集合是无法使用增强for循环来迭代的,//因为增强for循环只能针对实现了Iterable接口的集合进展迭代//Iterable是jdk5中新定义的接口,就一个方法iterator方法//只有实现了Iterable接口的类,才能保证一定有iterator方法//java有这样的限定是因为增强for循环内部还是用迭代器实现的//而实际上,我们可以通过某种方式来使用增强for循环for(Objectobj:map.entrySet()){ //obj依次表示Entry Map.Entryentry=(Entry)obj; System.out.println(entry.getKey()+"="+entry.getValue());}6〕集合迭代注意问题//在使用迭代器迭代集合的过程中,不能对集合进展增删操作@Testpublicvoidtest4(){ Listlist=newArrayList(); list.add("wangwu"); list.add("zhangsan"); list.add("lisi"); Iteratoriter=list.iterator(); while(iter.hasNext()){ Stringname=(String)iter.next(); if("wangwu".equals(name)){ //从集合中删掉 //list.remove(name); //迭代过程中删除元素需要调用迭代器的方法 iter.remove(); //删除我迭代的集合被我迭代的最后一个元素 } }//124 System.out.println(list.size());}@Testpublicvoidtest5(){ Listlist=newArrayList(); list.add("aa"); list.add("bb"); //使用ListIterator迭代器 ListIteratorlistIterator=list.listIterator(); while(listIterator.hasNext()){ listIterator.next(); //迭代过程中增加元素 listIterator.add("cc"); } System.out.println(list.size());}7)增强for循环注意问题//在使用增强for循环时,不能对元素进展赋值int[]arr={1,2,3};for(intnum:arr){ num=0;}System.out.println(arr[1]);4.可变参数1)jdk5中方法的形参可以定义为可变参数,传入实参个数可变//设计一个方法求n个数的和publicstaticintgetSum(int...arr){ //可变参数在方法中仍被看做一个数组 intsum=0; for(intnum:arr) sum+=num; returnsum;}2)为例演示传入不同参数的情况//list长度为3Listlist=Arrays.asList("a","b","c");//list长度为1,因为考虑语法String[]arr={"a","b","c"};Listlist=Arrays.asList(arr);//同时符合和的语法,此时会优先考虑的语法 //原因是有了新功能要保证以前的代码不出错,向后兼容//现在就需要将arr作为一个元素存入集合Objectobj=arr;Listlist2=Arrays.asList(obj); //此时只符合的语法,不符合的语法,没有歧义Listlist3=Arrays.asList(newObject[]{arr}); //优先考虑,所以数组会拆开//System.out.println(list3.size());//根本数据类型数组只符合的语法int[]nums={1,2,3};list=Arrays.asList(nums);System.out.println(list.size());5.枚举问题:对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个解决方法:在setGrade方法中做判断,不符合格式要求就抛出异常直接限定用户的选择,通过自定义类模拟枚举的方式来限定用户的输入写一个Grade类,私有构造函数,对外提供5个静态的常量表示类的实例jdk5中新定义了枚举类型,专门用于解决此类问题枚举就是一个特殊的java类,可以定义属性、方法、构造函数、实现接口、继承类//枚举类就是一个java类,也可以声明属性,方法,构造函数publicenumGrade4{ A("90-100"),B("80-89"),C("70-79"),D("60-69"),E("0-59"); privateStringvalue; privateGrade4(Stringvalue){ this.value=value; } publicStringgetValue(){ returnvalue; }}//枚举类就是一个java类,也可以继承抽象和实现接口publicenumGrade5{ //抽象类不能创立实例对象 A("90-100"){ //new了一个Grade5的子类实例 publicStringtoLocaleString(){ return"优"; } } ,B("80-89"){ //new了一个Grade5的子类实例 publicStringtoLocaleString(){ return"良"; } } ,C("70-79"){ //new了一个Grade5的子类实例 publicStringtoLocaleString(){ return"中"; } } ,D("60-69"){ //new了一个Grade5的子类实例 publicStringtoLocaleString(){ return"差"; } } ,E("0-59"){ //new了一个Grade5的子类实例 publicStringtoLocaleString(){ return"不及格"; } }; privateStringvalue; privateGrade5(Stringvalue){ this.value=value; } publicStringgetValue(){ returnvalue; } //对外提供一个方法,返回枚举的本地信息 //一个方法不知道如何实现,可以定义为抽象的 publicabstractStringtoLocaleString();}练习:请编写一个关于星期几的枚举WeekDay,要求:枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun星期一。。。。星期日该枚举要有一个方法,调用该方法返回中文格式的星期。6.反射1〕java代码的阶段:一段java代码在程序运行期间会经历三个阶段:source-->class-->runtime2)Class对象:在java中用一个Class对象来表示一个java类的class阶段 Class对象封装了一个java类中定义的成员变量、成员方法、构造方法、类名、包名等获得class对象的三种方式和区别://1.根据给定的类名来获得用于类加载Stringclassname="cn.itcast.reflect.Person"; //来自配置文件Classclazz=Class.forName//2.如果拿到了对象,不知道是什么类型用于获得对象的类型Objectobj=newPerson();Classclazz1=obj.getClass(); //获得对象具体的类型//3.如果是明确地获得某个类的Class对象主要用于传参Classclazz2=Person.class; //在java中所有的类型都会对应一个Class对象intIntegerClassintClazz=int.class;ClassintarrClazz=int[].class;ClassvoidClazz=void.class;3〕反射反射就是获得一个java类的各个组成局部 //反射类的成员方法 Classclazz=Person.class; Methodmethod=clazz.getMethod(methodName,newClass[]{paramClazz1,paramClazz2}); method.invoke(); //反射类的构造函数 Constructorcon=clazz.getConstructor(newClass[]{paramClazz1,paramClazz2,...}) con.newInstance(params...) //反射类的属性 Fieldfield=clazz.getField(fieldName); field.setAccessible(true); field.setObject(value);4)反射用在哪里 到底框架是什么?框架就是将开发中大量重复的代码集中起来写个通用的程序 框架就是用反射来实现的, 框架需要现在的类调用将来写的类 框架是将来的程序员调用的,框架不能实现完整的功能,框架只是一些一些通用的代码; 框架要依赖将来写的类来运行. 现在写的类要调用将来写的类,我们先针对接口进展调用,将来的类需要实现接口,那么方法就固定了 但是将来写的类的类名我们无法获知,这时就需要调用者通过配置文件告诉框架具体的类名7.泛型1)泛型是一种可变化的类型,类型不确定,需要调用者来指定2)用途: 一个类的多个成员方法用到的参数类型或返回值类型都是未知的类型,但又需要是同一个类型,就可将方法的 参数类型定义为泛型,此泛型必须在类上先予以声明才能在方法中使用 一个方法的多个参数和返回值需要是同一个类型,也可以用泛型来解决,在方法返回值前面声明泛型泛型的细节:1〕泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型2〕使用带泛型的类创立对象时,等式两边指定的泛型必须一致 原因:编译器检查对象调用方法时只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了3〕等式两边可以在任意一边使用泛型在另一边不使用(考虑向后兼容)3.泛型的根本概念以List<E>为例:<>念着typeof例,List<String>就是ListtypeofStringList<E>中的E称为类型参数变量方法定义参数形式参数List<Integer>中的Integer称为实际类型参数整个List<E>称为泛型类型GenericType整个List<Integer>称为参数化的泛型类型4.泛型的使用 1)使用带泛型的类时,在创立对象时可以为泛型指定实际类型参数,指定的具体类型相当于给泛型传参 2)子类在继承父类的时候,可以为父类定义的泛型指定实际类型参数 classB<T> classAextendsB<String> 通过子类A获得的父类类型就是一个参数化的类型 3)调用方法时传入参数的具体类型将作为方法中泛型的实际类型Lesson2Servlet(超级重要)1.javaweb学什么用java语言开发动态的web资源,接下来就是介绍如何开发动态的web资源对于java程序员而言,所谓动态web资源就是可以运行在效劳器上的java程序2.实现效劳器管理java程序 开发人员写好一个java类,到底有哪些方法tomcat效劳器是不可能知道的 tomcat效劳器欲执行我们编写的java类,就需要知道我们的java类有哪些方法,然后在适当的时间调用这些方法,所以我们在写的java程序要想运行在效劳器上,就interface Servlet{...}Servlet接口中就定义了可以被tomcat效劳器调用的java方法 通常来讲,我们将实现了Servlet接口的java类称之为Servlet编写好的Servlet需要在web.xml文件中做配置,才能供外界访问3.实现第一个Servlet程序写一个java类实现Servlet接口packagecn.itcast.servlet;importjava.io.*;importjavax.servlet.*;publicclassHelloWorldServletextendsGenericServlet{ //实现service方法 publicvoidservice(ServletRequestrequest,ServletResponseresponse) throwsServletException,java.io.IOException{ //向浏览器输出一句话 PrintWriterout=response.getWriter(); out.write("helloworld!!!"); } publicvoidinit()throwsServletException{ //初始化servlet时被调用 System.out.println("init()"); } publicvoiddestroy(){ //摧毁servlet时被调用 System.out.println("destroy()"); }}3.2.导入servletjar包3.3.编译带包的类3.4.将包拷贝至day05/WEB-INF/classes目录下-->发布web工程3.5.在web.xml文件中做映射<!--做servlet映射--> <!--servlet元素用于给一个类起别名--> <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>cn.itcast.servlet.HelloWorldServlet</servlet-class> </servlet> <!--servlet-mapping元素用于将一个Servlet映射到url--> <!—url必须以/开头,/表示当前web应用即上下文路径--> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern> </servlet-mapping> 注意:servlet对象一旦创立就会驻留在内存中,为所有的请求效劳,servlet对象什么时候销毁? 直到效劳器关闭时或web应用被移除才销毁3.6.Servlet执行流程图4.用eclipse工具开发Servlet4.1.建一个webproject4.2.在src下建包,创立一个java类实现Servlet接口4.3在Webroot\WEB-INF\web.xml做servlet映射4.4配置tomcat效劳器4.5将web工程发布至tomcat效劳器 发布的web应用名称可以配置:web工程右键选properties-->myeclipse-->web 默认情况使用工程名作为发布后的web应用名4.6启动tomcat效劳器运行程序5.Servlet对象一般来讲我们开发一个Servlet会去继承Servlet在eclipse下开发Servlet可以直接新建一个Servlet,覆写Servlet的doGet和doPost方法继承Servlet的原因是:Servlet实现了service方法,将ServletRequst和ServletResponse强转为子类ServletRequest和ServletResponse,让我们用起来更加方便,同时,在service方法中,它判断了请求方式,根据请求方式来调用doGet和doPost二、Servlet细节1.*号统配符一个Servlet可以映射为多个路径在映射Servlet路径时可以使用‘/*’或‘*.扩展名’的形式注意:两者不能同时使用 /*具有较高的优先级2.load-on-startup元素<servlet>元素下可以配置<load-on-startup>子元素,配置方式如下:<load-on-startup>1</load-on-startup>如果一个Servlet配置了该项,web容器会在web应用被加载时就初始化该Servlet,数字越小那么越先初始化3.效劳器下所有web应用中的web.xml都会自动继承该文件中所有的配置DefaultServlet帮我们去web应用下读取a.html文件,并打给浏览器,如果没有发送404页面也就说,我们通过ie访问效劳器访问的都是Servlet4.Servlet线程平安问题解决Servlet线程平安问题:加上同步的锁(lock)实现SingleThreadModel接口的Servlet效劳器会做判断,当有请求过来,如果Servlet对象忙着呢,效劳器会再创立一个Servlet对象为用户提供效劳,如果Servlet闲置,就直接提供效劳这样的方式实际上是回避了线程平安问题,单线程访问Servlet,这样的方式不可取Lesson3一、WEB效劳器1.根本概念WEB在英语中即表示网页的意思,它用于表示Internet主机上供外界访问的资源以及超链接所组成的链表放在internet网上供外界访问的文件或程序被称为web资源web资源被分为:静态web资源:html、css、jpg动态web资源:Servlet、Jsp2.什么是WEB效劳器?就是一台电脑,安装了一个效劳器软件3.为什么需要安装WEB效劳器 思考问题:从一台计算机的IE浏览器如何去访问另一台计算机中的文件3.1两台计算机是如何实现通讯的? IP地址(计算机的唯一标识)IPV44个字节的整数,每个字节以点号隔开00每个字节的取值0~255在计算机中程序会绑定在某一个端口0~65535尽量用1024以上的连接一台计算机就需要输入ip地址和端口号作为接收方,应该绑定ip,监听指定的端口3.2在本地写程序添加一个效劳,供别人来访问,假设监听8888端口3.3编码实现了一个本地效劳器程序 作用:管理本地的资源,只要将html页面放到指定的目录下,外界就可以访问了3.4安装效劳器的目的:开发好的web资源可以发布到效劳器上,这样外界就可以通过浏览器访问了//ServerSocket对象可以监听端口ServerSocketserversocket=newServerSocket(6666);while(true){ Socketsocket=serversocket.accept(); //等待客户端的连接请求,一旦有请求过来,就完毕阻塞,返回客户端对象 //一旦有客户来访问,就另开一个新线程去提供效劳,main线程继续等待下一个客户的连接 newThread(newMyService(socket)).start();}//提供效劳InputStreamin=socket.getInputStream();Thread.sleep(200);intlen=in.available();//估计此流不受阻塞能读取的字节数byte[]buffer=newbyte[len];in.read(buffer);Stringrequest=newString(buffer);//截取第一行StringfirstLine=request.substring(0,request.indexOf("\n"));StringuriName=firstLine.split("")[1];OutputStreamout=socket.getOutputStream();//根据需要访问的资源创立File对象=newFile("src"+uriName);if(!()){ out.write("对不起!您访问的资源不存在!别瞎搞!!".getBytes()); out.close(); return;}//从文件读,往浏览器写fis=new(file);buffer=newbyte[1024];while((len=fis.read(buffer))>0){ out.write(buffer,0,len);}socket.close();二、Tomcat效劳器的安装和配置1.使用tomcat6.0.20.rar文件解压即完成安装2.tomcat就是一个java程序,一定会用到jre tomcat的启动是通过startup.bat文件,实际上startup.bat中是去调用 catalina.bat文件,而且是通过%catalina_home%\bin\catalina.bat去找 所以为了保证效劳器启动正常,需要配置catalina_home环境变量为tomcat的安装目录3.tomcat的目录构造bin:存放一些执行文件conf:存放效劳器的配置文件lib:存放tomcat所依赖的jar文件logs:存放日志文件temp:存放临时文件webapps:webapplications存放所有的web应用程序(web资源)work:tomcat的工作目录,jsp翻译成的Servlet就在这个目录下4.web应用多个web资源存放在一个目录下即为一个web应用(web应用程序、web工程)web应用的目录构造 静态web资源直接放在目录下 java类放在classes目录下 web.xml文件负责管理web应用下所有的web资源 所有jar包放在lib目录下三、WEB应用的映射1.虚拟目录 一个web应用(效劳器上一个目录)需要供外界访问的路径,需要映射虚拟目录 在tomcat6中,放在webapps下的web应用,效劳器会自动做映射(将文件夹名称作为虚拟路径) 对于webapps目录外的web应用需要手动映射虚拟路径1.1.在server.xml文件可以配置 <host> <Contextpath=〞/itcast〞docBase=〞f:\itcast〞/> </host>1.2.在%tomcat目录%\conf\catalina\localhost下写一个xml文件 文件名就是虚拟目录<ContextdocBase=〞f:\itcast〞/> 多级目录配置aaa#bbb.xml对应/aaa/bbb 如果文件名是ROOT.xml那就是配置了缺省的web应用,访问时不需要输入虚拟目录Web.xml的作用: 管理web应用下所有的web资源通俗地讲,一个web应用下所有的web资源如何被外界访问都需要在此文件下做映射包括咱们后面学的Servletjsp都需要在这个文件中做映射实验:配置web应用的首页在web应用下新建目录WEB-INF,在此目录下新建web.xml文件<?xmlversion="1.0"encoding="ISO-8859-1"?><web-appxmlns=""xmlns:xsi=""xsi:schemaLocation=""version="2.5"><welcome-><welcome-</welcome-file></welcome-></web-app>3.域名解析一个完整url协议名主机名端口号资源名〔uri〕IE访问效劳器的原理,在IE中输入的地址中包含域名,域名就需要被翻译成效劳器的IP,才能访问到效劳器IE浏览器IE浏览器sina效劳器看windows是否注册了该主机名DNS效劳器(网络效劳商)解析域名,获得一个IP4.web应用映射的练习:新建一个web应用配置成缺省的web应用配置首页配置tomcat监听端口为80在windows中注册主机名5.虚拟主机效劳器允许在一个IP上配置多个主机,即虚拟主机中的起了两个作用:找DNS效劳器,作为域名被解析为IP通过Host头告诉效劳器访问的主机名配置方式:在server.xml文件中配置Host元素,需要指定name〔主机名〕、appBase(默认web应用存放目录)appBase目录下所有的web应用,tomcat会自动映射虚拟路径<Hostname=""appBase="F:\sohu\webapps"/>做实验:给新配置的虚拟主机配置缺省的web应用<Hostname=""appBase="F:\sohu\webapps"> <Contextpath=""docBase="F:\sohu\webapps\abc"/></Host>

分析web资源访问过程/访问一个a.html静态web资源,IE做了什么事1)将作为域名发送给DNS,解析成IP地址,访问一台效劳器2)发送Host头〔〕,告诉效劳器我要访问的虚拟主机,效劳器拿着Host头找匹配的Host元素3)将abc作为虚拟目录,告诉效劳器我要访问的web应用,效劳器拿着abc找匹配的web应用虚拟目录对应是一个web应用的目录,所以虚拟目录也被我们称作web应用路径(web应用的上下文contextpath)三、协议1.tcp/ip协议:网络通信协议(连接) ip协议:ip地址对应一台计算机〔互联网层〕 tcp高级协议:三次握手,发送请求、返回响应、传输数据 (传输层)2.协议是建立在tcp协议的根底之上 (应用层)3.协议的版本(w3c) 1.0:建立连接,发送一次请求就断开 1.1:建立连接,可以无限次发送请求四、请求消息请求消息内容:包括一个请求行、假设干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。请求行PO 消息头Accept:image/gif,image/x-xbitmap,*/*Referer:Content-Type:application/x-UA-CPU:x86Accept-Encoding:gzip,deflateUser-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;GTB6.5;CIBA)Host:localhost:8080Content-Length:33Connection:Keep-AliveCache-Control:no-cacheCookie:JSESSIONID=B0B3FB4FFB0315B3D3C620548DD4E1EB空一行消息体username=zhangsan&password=1234561.请求行GET为请求方式:get方式的请求参数直接跟在url后面,例如:/itcast/a.html?username=aaa&password=111POST方式:post方式请求参数放在消息体中传输,相对平安,get大小限制1K,post无数据量限制2.请求消息头:IE浏览器用于向效劳器说明情况的(浏览器使用环境)Accept:text/html,image/* 说明浏览器承受的数据类型Accept-Charset:ISO-8859-1 说明浏览器使用的字符编码Accept-Encoding:gzip,compress说明浏览器支持的压缩格式Accept-Language:en-us,zh-cn说明浏览器的语言环境Host:说明浏览器要访问的主机名If-Modified-Since:Tue,11Jul200018:23:51GMT 文件的修改事件,用于做缓存Referer:说明请求来自哪里,防盗链(做实验)User-Agent:Mozilla/4.0(compatible;MSIE5.5;WindowsNT5.0)说明浏览器内核Cookie 向效劳器发送CookieConnection:close/Keep-Alive 说明连接状态Date:Tue,11Jul200018:23:51GMT客户端计算机时间3.实体内容(消息体)浏览器向效劳器发送的数据,例如上传的文件、提交的表单等五、响应消息响应消息的内容包括:一个状态行(类比请求信息的〞请求行〞)、假设干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。/1.1200OKContent-Type:text/html;charset=GB18030Content-Length:766Date:Thu,07Jul202115:40:02GMT<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>MyJSP'index.jsp'startingpage</title></head><body> hello</body></html>1.状态行/1.1404NotFound响应状态码:说明效劳器的响应状态常用状态码状态码含义100~199表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程200~299表示成功接收请求并已完成整个处理过程,常用200300~399为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302、307和304400~499客户端的请求有错误,常用404500~599效劳器端出现错误,常用500200:一切OK302\307请求重定向,你访问我,我通知你访问另一个资源304通知浏览器去读缓存404找不到资源,客户端的请求有错误500效劳器程序出错(效劳器端的程序抛异常了)2.响应消息头效劳器向浏览器说明情况(处理结果)Location:通知浏览器去访问另一个资源Server:apachetomcat 说明效劳器Content-Encoding:gzip 通知浏览器数据的压缩格式Content-Length:80 通知浏览器发送数据的长度Content-Language:zh-cn 通知浏览器语言环境Content-Type:text/html;charset=GB2312 通知浏览器文件的格式和编码Last-Modified:Tue,11Jul200018:23:51GMT 告诉浏览器文件的修改时间Refresh:1;url= 通知浏览器自动刷新Content-Disposition:attachment; 通知浏览器以下载的方式翻开资源Set-Cookie:SS=Q0=5Lb_nQ;path=/search 发cookieExpires:-1//3种制止缓存的头字段 Cache-Control:no-cachePragma:no-cache Connection:close/Keep-Alive 连接状态Date:Tue,11Jul200018:23:51GMT系统时间3.实体内容(响应消息体)一般为效劳器发送给ie浏览器的页面数据六、s协议1.s是一种加密协议能保证数据的平安2.不对称加密对称加密3.s1)制作数字证书keytool-genkey-aliastomcat-keyalgRSA2)将证书拷贝至tomcat\conf3)修改server.xml文件配置s连接器<Connectorport="8443"protocol="/1.1"SSLEnabled="true"maxThreads="150"scheme="s"secure="true"clientAuth="false"sslProtocol="TLS" keystoreFile="conf\.keystore"keystorePass="123456"/>

4)重启效劳器翻开ie访问5)ie中安装证书继续浏览查看证书安装证书删除证书:Lesson5一、ServletConfig对象作用:封装Servlet初始化参数1.可以在web.xml文件中Servlet元素下为Servlet配置初始化参数<init-param> <param-name>name</param-name> <param-value>aaaa</param-value></init-param>2.web容器在初始化Servlet时,会将初始化参数封装到一个ServletConfig对象中,传给init方法3.我们在Servlet中覆写init方法,就可以获得ServletConfig4.父类GenericServlet中定义了一个成员变量用于记住此对象,并提供了getServletConfig方法我们可以直接调用此方法获得config对象5.再调用getInitParameter(name)方法获得想要配置项//指定编码 //获得ServletConfig对象 ServletConfigconfig=getServletConfig(); Stringencoding=config.getInitParameter("encoding"); System.out.println("encoding="+encoding);二、ServletContext对象:ServletContext被称为servlet的上下文1.ServletContext对象代表整个web应用2.ServletContext对象是一个“域〞对象(即:可以存储数据的对象)ServletContext对象的内部维护了一个map集合,key是String类型value是Object类型classServletContext{ privateMap<String,Object>map;}3.ServletContext作为域对象,多个Servlet可以共享数据Servlet6//1.获得ServletContext对象ServletContextcontext=getServletContext();//2.存入域context.setAttribute(“name〞,“zhangsan〞);Servlet7//获得context域,getAttributeStringname=(String)getServletContext().getAttribute("name");web应用的初始化参数 getContext().getInitParameter(“name〞);5.统计一个web应用的访问量在context域中维护一个count变量 访问Servlet时,取出变量加16.实现请求转发实现请求转发需要用到转发对象RequestDispatcher,RequestDispatcher有一个forward方法能转发请求7.如何读取工程中的文件〔分两种情况〕7.1.读取web工程下的资源文件 //获得绝对路径StringrealPath=(相对web应用的路径); 注意URLurl=ServletContext.getResource();web的url //获得与文件关联的流 InputStreamin=ServletContext.getResourceAsStream(“〞;7.2读取java工程下的文件 //不能相对虚拟机目录不能用绝对路径 //只能类加载的方式读//获得流ClassLoaderclassLoader=Demo.class.getClassLoader(); InputStreamin=classLoader.getResourceAsStream("a.txt"); //获得绝对路径URLurl=Demo.class.getClassLoader().getResource("a.txt");Stringpath=url.getPath();类加载方式缺点1〕不能读取类路径以外文件2)由于需要加载到内存,不能读大文件3)web工程中如果用类加载的方式读类加载实际上读取的是内存中加载的文件,此时将读不到硬盘上资源文件的修改解决方法:通过绝对路径去读硬盘上的文件避开内存的文件 例如:Demo.Class.getClassLoader().getResource("a.txt").getPath()三、Servlet缓存 Servlet的Service()方法中的代码 //调用方法longlastModified=getLastModified(req); //如果为-1,就直接放行,给最新的if(lastModified==-1){doGet(req,resp);}//方法返回不是-1

else{ //读取IE发送的头If-Modified-SincelongifModifiedSince=req.getDateHeader(HEADER_IFMODSINCE); //拿着客户端的时间头和方法的返回值比拟if(ifModifiedSince<(lastModified/1000*1000)){//Iftheservletmodtimeislater,calldoGet()//Rounddowntothenearestsecondforapropercompare//AifModifiedSinceof-1willalwaysbeless //方法的返回值大于ie发送过来的时间头 //重新向浏览器发送了一个时间头maybeSetLastModified(resp,lastModified); //放行,发送页面doGet(req,resp);}else{ //方法的返回值没有大于ie发送过来的时间头 //发送304状态码,让用户去读缓存resp.setStatus(ServletResponse.SC_NOT_MODIFIED);}}Lesson6一、中文乱码问题1.出现乱码的原因1)在计算机中数据以二进制的形式进展存储的,数据的传输也是通二进制的形式2〕需要存字符,会出现字符与字节之间的转换(输入字符读到的字符)3)字符和字节之间如何实现转换?都是通过查码表4)字符到字节是编码,字节到字符是解码,编码和解码用到了不同码表就会出现乱码问题2.解决乱码1)拿到乱码根本上都是由于解码错误导致的,解决方法,重新编码再解码2)以后将文件交给解析器,出现乱码,首先想到是否通知别人文件的编码格式Servlet对象一旦创立就驻留在内存,Request和response对象,web容器会针对每次用户的请求创立一个request和response请求完毕,响应发给ie。Request和response对象就会立即被销毁二、Response对象1.responsegetWriter方法获得字符流,用于向浏览器输出字符数据中文乱码问题ServletServletgetWriter().write(“中国〞)Tomcatweb容器中国默认编码iso-8859-16363utf-8989789Response中国IE浏览器6363–>??gb2312解错码2.文件下载文件名中文乱码问题由于文件名是跟着content-disposition头发送给浏览器的但凡头的数据都会经过url编码,编成全世界通用的符号,这样传输过程中才不会乱码3.请求重定向 发送302状态码和location头 ie向浏览器发送了两次请求第一次直接请求资源,第二次重定向的页面 地址栏是有变化4.getWriter和getOutputStream不能同时使用,有冲突 response的流我们不用关闭,交给web容器去管理三、Request对象1.request帮助我们取获取ie浏览器发送给效劳器的请求消息(请求行消息头消息体)2.request获得请求参数:getParameter()和getParameterValues()3.request中文参数乱码问题IEIE老张url编码utf-8%E8%80%81%E5%BC%A0tomcatweb容器%E8%80%81%E5%BC%A0request对象解码iso-8859-1老å¼

乱码程序setCharacterEncoding设置request编码Stringdata=getParameter()Request中文参数乱码的解决方法:post方式下:request.setCharacterEncoding(“utf-8〞);//指定处理消息体的解码方式get方式下: 1) 手动解决乱码问题byte[]bytes=username.getBytes("iso-8859-1");Stringstr=newString(bytes,"utf-8"); 2) 在%tomcat%\conf\server.xml中找到当前连接器元素Connector 配置URIEncoding属性它用于指定web容器的url解码方式 3) 配置useBodyEncodingForURI属性指定为true 用于让tomcat按照处理消息体的编码方式处理消息头超链接提交参数:也是使用get方式提交,(和表单的区别是,表单提交,ie会自动进展url编码) 而超链接提交,ie不进展url编码,此时我们需要将超链接中的中文参数手动进展url编码. 同理:在效劳器端的处理方式和表单get方式的处理一样4.请求转发Servlet负责处理用户的请求,处理完的结果交给jsp来做显示(在Servlet中不输出任何数据,所有数据的显示都交给jsp)获得RequestDispatcher对象做请求转发,时,需要将处理结果存入request域带给jsp时,web容器(如:tomcat)会清空response中的数据后,无法向response输入数据面试题:请求转发forward和包含include的区别Forward的时候,web容器会清空response的数据,并且转发之后,当前Servlet就无法再写入数据了Include的时候,web容器会让两个Servlet的数据都写入responsemvc的过程1)用户发送请求〔提交表单,超链接〕2)Servlet做处理,将数据(响应结果)封装到javabean对象3)将javabean对象存入request域4)请求转发给jsp5)jsp页面中从request域取出数据做显示IE浏览器IE浏览器ServletjavabeanjspWeb资源访问的流程1.客户端(IE)发送请求给效劳器2.用一个Servlet来响应客户的需求根本上分为两种:1)查看数据 请求转发给jsp做显示2)用户登陆\购置商品完成某一个特定的功能结果都是成功或失败 请求重定向到一个目标资源面试题:请求转发和请求重定向的区别?1)请求重定向地址栏有变化请求转发地址栏无变化2)请求重定向客户端向效劳器发送两次请求请求转发发送一次请求3)应用场景: 一件事情做完了,应该做第二件事情了,就请求重定向(用户登陆、购物) Servlet处理完了,让jsp做显示,用请求转发(mvc设计模式)web应用中的路径怎么写?读取web中的文件用context读取,严禁用绝对路径,通通以〞/〞开头原那么:就看路径是给浏览器用的还是给效劳器用的,给浏览器用的,要加上web应用的名称给效劳器用的,斜线〞/〞即表示:当前web应用(/表示web应用,不用加web应用的名称)各种场景:1)请求转发 : 地址是给效劳器用的,不需要加web应用 /b.jsp/servlet/Servlet12)请求重定向3)超链接: 路径给浏览器用的,所以需要加上web应用名称/day06/a.jsp记住:路径以“/〞开头,请求转发不加web应用名,其他的全部都要加Lesson7会话技术(包括cookie和sessionCookie是客户端技术,Session是效劳器端技术)会话,用户翻开浏览器,点了一些超链接,关闭浏览器的过程会话过程中会产生一些数据,这些数据是每个用户独享的,需要找个地方存起来会话技术就是解决上述问题的,Cookie是客户端技术,Session是效劳器端技术Cookie对象Cookie对象的创立Cookiecookie=newCookie(key,value);发送CookieResponse.addCookie(cookie);获取指定的Cookie//获得用户发送的所有Cookie Cookie[]cookies=request.getCookies(); //如果没发Cookie过来,为null //遍历找到lastAccessTime StringlastAccessTime=null;for(inti=0;cookies!=null&&i<cookies.length;i++){ Stringname=cookies[i].getName(); //一个Cookie的nameif("lastAccessTime".equals(name)){ //找到了,几下valuelastAccessTime=cookies[i].getValue(); }}设置Cookie的有效时间cookie默认情况下在当前浏览器进程有效,如果想让cookie长期驻留客户机的硬盘,就需要指定时间cookie.setMaxAge(time)time以秒为单位setMaxAge(0)通知浏览器删除该Cookie显示用户最近的浏览记录两个页面显示所有的商品(从数据库找出商品显示),显示最近的记录(读取客户发送的Cookie中存的id,找出书显示)CookieDemo2显示商品的详细信息,并向客户端发送Cookie,难点如果产生新的Cookie将客户端带过来的Cookie分割后存入集合,根据不同的情况将新的id加进去,迭代集合用分隔符串起来CookieDemo3Session对象session的原理request对象有个方法是getSession()首先看浏览器是否发送了Cookie(JSESSIONID),如果发了,拿着id去内存中找对应的session对象返回;如果没有发Cookie或者没找到对应的Session对象,创立一个新的Session对象getSession(booleancreate)create为true的时候,如果内存有session就返回,没有就创立新的create为false的时候,意味着只查找不创立,有就返回,没有不创立,返回null;session的运行要依靠cookie来发送JSESSIONID如果想让多个浏览器共享一个session,我们就需要人工发送Cookie,并设置Cookie的有效时间3.如果浏览器禁用Cookie,那么Session也玩不起来了要想让session好用,就需要在页面跳转时发送sessionid有一个技术url重写:重写后的地址会在原有的url地址的根底上加上JSESSIONID 超链接或表单提交的地址,重写方式如下:StringnewUrl=response.encodeURL(url); 请求重定向的地址,重写方式如下:StringnewUrl=response.encodeRedirectURL(url);session的应用(重点)简单购物车的实现ListServletBuyServletListCartServlet用户登录Login.jspLoginServletindes.jspLogoutServlet防止表单重复提交(2种方法) 1.可以用js来做,但是只能增加用户的体验,不能完全防止坏人 2.用session做防表单重复提交 FormServletHandleFormServletTokenProcessorLesson13JSP入门全称:javaserverpage1.web资源的运行原理html:静态web资源,DefaultServlet读取html文件,通过response输出给IE浏览器Servlet:动态web资源,web容器(Servlet引擎)解析web.xml文件,找到url对应的java类 通过反射创立Servlet对象,调用service方法 Class.forName(“〞).newInstance();jsp: 动态web资源jsp页面的执行过程:(重要)第一次被访问的时候,web容器(jsp引擎)会将jsp翻译成一个Servlet,然后调用servlet的service方法 2.jsp翻译后的Servlet会被放到%tomcat安装目录%\work\Catalina\localhost\webcontext被再次访问的时候,web容器会去直接调用Servlet的service()方法,所以通常来讲jsp只是在第一次被访问的时候比拟慢 4.如果jsp页面做了修改,此时web容器会重新翻译jsp2.jsp是什么实际上jsp就是Servlet,只是提供了一种比拟直观的书写方式,因为写jsp就像在写Htmljsp中可以写java代码,有两种jsp中写java代码的方法:1)jsp脚本表达式内容会被放到out.print()里面,输出给浏览器格式:<%=newDate()%>2)jsp脚本片段内容会原封不动地被翻译到Servlet的service方法中<% //java代码%>3.jsp和Servlet的区别1)Servlet适合写java代码,因为Servlet就是一个java类 在开发中使用Servlet对用户发送的请求进展处理并做出响应2)jsp适合做数据美化,作为数据显示模板 因为jsp页面直接书写HTML标签3)工程中的web层通常使用mvc设计模式Servlet+jsp+javabean 其中, Servlet做控制器,处理用户请求jsp作为显示模板javabean作为封装数据的实体4)如何养成一种良好的编码风格 在Servlet中应防止做任何的数据输出 在jsp中应防止去直接书写java代码,而实际上要做到这点很难,所以需要用到el和jstljsp语法1.模板元素 在jsp页面中所有的html标签局部被称作模板元素,用于对整个网页进展布局2.jsp脚本:jsp中的java代码被称作jsp脚本 jsp脚本有三种形式 1)脚本表达式:被翻译到out.print()方法中<%=newDate()%> 2)脚本片段:被翻译到service()方法中<% for(inti=0;i<10;i++){ System.out.printl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论