做安卓开发钱途很大,但是也得学好Javaweb,尤其是Javaweb基础;
不知道要不要学ajax?
我要有扎实的Java基础和Javaweb基础
比如;html+css+javascript
jdbc+SSH+Servlet+jsp+jstl+EL;
记得会学校有网的时候要每天写技术博客;
XML文档:扩展标记语言,external mark language
原来是想替代html的,现在已经替代不了,因此成为了配置文件中的一种,用于描述数据,
供程序读取,将一些不方便写死的数据放入配置文件中;比如struts,等框架就是用的xml配置文件,
但是现在出现了@注解替代;
html5:是最新的技术,用来面向web编程的高级语言;
xml文档需要遵循一些规则,就出现了xml约束文件,包括schema和dtd文件;
dtd:document type definition;文档类型定义;
对xml文档的解析:
dom和sax解析区别:
dom:适合于对xml的crud,占用内存较大;
sax:解析速度快,适合对文档的读取,占用内存小;
不适合对其进行增删改操作;
如何调整jvm虚拟机的内存大小;默认是64M;
-Xmx80M
dom解析:sun公司提供的api,还有dom4j解析方式,后者必须掌握;
记住要有面向对象的思想,要遵循一定的命名规则,我们自己使用也跟着规则去找相应的方法;
提高开发效率;
crud:create read update delete常用的操作;
当我们要用到某个对象时,也许该对象不能new,那么他可能有静态方法获取该类对象,或者有个工厂来提供该类对象;
也就是我们要用到的对象一定可以获取,否则是个铜墙铁壁,用不到,这个类就是虚好看;
记得要学会断点观察法,debug as。。。这个学会了,不错。。。
dom解析的内部细节,比如说我们添加一个节点到xml文件中时,每次都会重新写入到xml文件中;
因为我们每次都会构建一个新的源和结果,交给一个XMLWriter,去写;
sax解析:解析器,处理器;
基本步骤和dom解析差不多,就是多了个处理器,要我们自己去写,并作为参数传递给解析器;
处理器中有三个方法必须要覆盖DefaultHandler;内容方法:character,开始标签方法startTag和
结束标签方法endTag,所有操作从这三个方法入手,根据实际需求,设计并处理,一般我们会将解析到的文档内容封装成一个个对象;
然后 将这些对象存入一个集合中,这些数据要作为返回值给调用者;这是我们最常使用的sax解析方式,跟面向对象紧密结合;
xpath表达式写法:
//user [@name='"+name+"' and @password='"+password+"']
这个结合下namespace使用更加方便快捷;
平面图形题的通用解决方案:二维数组解决方法;
web服务器:就是一个socket程序,加上gui技术,做出来的图形用户界面的服务器程序;需要指定端口号,
可以支持多用户同时访问的一个Java程序;
产品包括:weblogic bea公司的 贵,文档多;
IBM:WEBSEPHER ,很贵,银行等使用;文档少,学习成本高;
apache:TOMCAT
JBoss,免费,开源组织;
记得要记住常用应用层协议使用的端口号;
域名,主机名 URL
http://www.sina.com
其中主机名:www.sina.com
域名:sina.com
URL:http://www.sina.com
表示要以http协议方式访问www.sina.com这台主机上的80端口;http默认端口是80端口;
记得要学会用rose画程序流程图或者类似的流程图;这个已经下载好了。。
web请求资源访问流程图;
加密连接器:
tomcat服务器管理平台,比较重要哦!!!这个已经搞定了..就是在conf配置文件中,配置用户角色和密码就是了;
可以实现远程发布程序到服务器中;
尽量要减少向服务器发送的请求次数,尽量将小的文件组织打包成大的文件;
除了特殊需求,最好使用请求转发,而不是重定向,以减少请求次数,减轻服务器压力;
Java中对于数据压缩有对象GZIPOutputStream;这个已经搞定了.呵呵
打给浏览器的数据格式要事先设置好;通过设置setHeader();
好好查查Servlet类的相关api文档;
servlet的生命周期,或者说我们在浏览器中输入www.baidu.com/mail进入到百度首页看到了搜索界面这一过程中他们都干了些什么;
1 浏览器解析并获取用户要连接的主机名和相应的端口;www.baidu.com表示要连接百度的的某台主机的80端口(http默认是80端口);连上服务器;
2 浏览器根据这一请求,将这些消息封装成一个请求头消息,向服务器发送服务请求;
3 服务器收到该请求后,预先创建好两个对象,request,response;
将浏览器发过来的Http请求头封装成request对象,
解析请求头消息,比如要找那个应用(即哪个servlet)根据浏览器带来的数据和指定点web应用;
4 服务器根据指定web应用(解析出来的)的名称去应用的WEB-INF目录下的,web.xml配置文件中查找;
如果没有找到对应的应用,那么看web.xml中有没有配置缺省的应用,如果还是没有,则tomcat服务器中的conf目录中配置了一个全局的
缺省servlet,比如应用中的静态资源;比如图片,html等;如果还是没有找到,就返回一个404错误提示,其实404错误提示他
也是一个servlet处理的即tomcat全局默认的servlet;即org.apache.catalina.servlets.DefaultServlet;
大家可以看看他的源代码;对于静态资源,该类内部读取静态资源,设置好相应的MIMETYPE,然后写给浏览器,使得浏览器能正常打开;
如果都没有的话,程序会自动跳转到一个404页面;
servlet中的方法写成protected,这是因为,protected权限修饰的方法只能在同一个包中使用;不同包中即使通过对象调用也不行;
因此只能在servlet的包中使用它;算是对servlet的一种保护吧...
5 如果是第一次请求,则根据配置文件中的配置找到相应servlet类,利用反射技术创建出servlet对象(默认构造函数),并调用init()方法初始化servlet;
6 servlet中有service方法,由服务器调用该方法为客户端提供服务;该service方法中提供了两个对象:
request和response,request代表客户端即浏览器写给服务端的请求消息,服务器通过request对象获取一个输入流对象;
读取客户端发来的请求信息,参数信息等;response对象代表服务器对浏览器的请求的响应消息,里面有一个输出流对象,服务器通过该输出流
对象向浏览器发送相应的数据;形成一个响应消息头;
本次服务完成;
7 浏览器得到服务器的响应消息,通过本身内置的解析器对响应消息进行解析,然后显示在浏览器中给用户看;
8 web容器将servlet移除时。调用destroy方法;或者重新部署的时候也会调用;或者关闭服务器时;
因为重新部署的意思就是先删除原应用然后复制新应用;
1 浏览器只认识Http协议格式写出的消息;
2 不管我们访问什么,都首先找的是一个servlet;
UML时序图;
将某个web应用配置成默认的应用,或者说如果没找到某个应用就找到web应用;
所以在配置文件中将其配置个/
MainServlet
/
比如我们访问某个不存在的servlet时,服务器给我们显示404错误提示,其实该提示也是一个javaweb程序,他被配置成了一个默认的;
但是这个不能用,否则你的静态资源就显示不了了....
13:46 2013/6/29
请求;
集合最好不要定义成静态的;静态要慎用;
servlet api文档好好学学,学会了这套api,servlet就基本没问题了
ServletConfig:可以通过这个对象获取web.xml配置文件中的信息;可以通过this对象来获取;
因为父类已经定义好了,直接获取就可以了,this.getServletConfig();
有些数据不适合写死,可以配置中web。xml文件中的init-param;
实际开发中,指定编码,和数据库连接密码等,可以配置到web.xml文件中去;
以及指定配置文件名等;
servletconfig类中封装了servlet的配置信息;
ServletContext:代表当前应用的对象,里面封装了一系列操作web应用及与之相关的方法,我们只要有面向对象的思想,
少了什么,需要什么功能,他应该是谁必须具备的,去找到该对象,然后使用它就对了,方法是不用记得;
既然他代表这整体web应用肯定有操作应用的相关方法;
它的作用范围是一个web应用,即共该应用下的所以servlet程序共享该容器;
context-param配置参数配置整个web应用都要用到的参数,比如数据库连接一般都是这样的;
可以同Servletcontext读取配置文件中的 内容,但是要注意文件的路径问题;
在获取资源文件或者说配置文件时,我们如果有必要获取文件的名称时,可以先获得文件的绝对路径,然后
通过String类的方法去截取到文件名称,在做进一步的操作;
servletcontext是一个全局性的容器,供所有用户和应用所共享;已经被证实了
类装载器也可以读取资源文件,这个也比较方便;但是这个文件不能太大;
由于类装载器要把资源文件放入内存中,因此当更改了该资源文件时,并不会马上
同步刷新内存中的数据;因为类只装载一次,即使改变了,也没法获取到最新的数据;
response:是服务器对浏览器的响应消息的封装;
服务器处理浏览器的请求时,将数据封装进该对象中,包括响应头等等信息;
打给浏览器时,按照http协议中请求头中要求的格式输出响应头;
response输出后无需关闭流,用面向对象的思想看:就是谁开的流,谁就得关;
既然是tomcat服务器帮我们开的流,就要帮我关;
设置编码:
response.setHeader("content-type","text/html;charset=UTF-8");这句话是告诉浏览器要以utf-8码表打开;当然我们也可以发送数据,
模拟一个meta标签设置好相应编码;
response.setCharacterEncoding("UTF-8");设置response输出流要以utf-8编码格式写数据给浏览器;
response.setContentType("text/html;charset=utf-8");这个也是设置contenttype头,设置编码通知浏览器以什么方式打开数据;
他有以上两个方法共同的功效;
在JavaEE5中:
response.setHeader("content-type", "text/html;utf-8");
response.getWriter().write("中文");
response.getWriter().write("中文");
在浏览器中访问中文时,会出现乱码;
而在JavaEE6中不会.
这是由于我们在用PW时,将字符数据写入PW的缓冲区中.
response会从pw中取出字符数据,在取出的过程中会对字符数据进行编码,当然这采用的是ISO8859-1;
然而我们设置浏览器打开时的编码确实UTF-8,因此会出现乱码,而且往往是??号;
但是在JavaEE6中确不会,这算是一种技术上的进步吧...
编码:我们使用的GBK或者说各个国家自己使用的编码是兼容ISO8859-1;也就是说各个国家的编码集是在ISO8859-1的基础上
增加本国的字符编码集;
byte[] buf="welcome".getBytes("UTF-8");
System.out.println(new String(buf,"GBK"));
那么这个也就不会出现乱码了;
byte[] utf8="欢迎".getBytes("UTF-8");
byte[] gbk="欢迎".getBytes("GBK");
System.out.println(utf8.length+"---"+gbk.length);
一个结果是6一个是4;
这是因为,在UTF-8编码集中,为了包容所有国家的编码格式,用一个字符对应了三个字节;
而GBK针对每个中文字符是两个字节;
Java中一个char,是两个字节,因此可以保存一个中文字符;
即 char ch='爱';//是正确的;
URL编码,由URLEncoder实现,解码有URLDecoder实现;
URL编码的规则,标准规定:url地址中只能是英文字母,数字和部分字符.
而我们的中文字符必须要经过URL编码;
URL进行编码时,对一个字节用%+两个二进制位进行表示;
比如吴岁岁.jpg--表示吴岁岁.jpg;
吴---吴;
岁---岁
因为我们知道一个utf-8编码的字符,用三个字节表示;
response中设置一个头,他可以对应多个值;
用addHeader();增加头,一个头可以对应多个值;
而setHeader()方法,如果你没有添加这个头,就添加,如果有,则后者覆盖前者;
一定要学会怎么查看源码
中文文件的下载问题:需要URL编码;
web+前端处理:html+javascript;
控制浏览器缓存,要用到几个缓存头:三个缓存头;
1 请求转发与重定向区别;
请求转发:浏览器只发一次请求,浏览器地址栏不变。下一个servlet程序可以沿袭上一个request中的数据;没有访问局限(可以访问WEB-INF下单jsp应用);
由request对象,servletcontext对象可完成请求转发;
请求重定向;浏览器要发两次请求,浏览器地址栏发生变化,下一个servlet不可以沿袭上一个servlet中的数据,
因为是两个不同的servlet,存在访问局限(不可以直接访问WEB-INF/下的jsp应用);由response对象可以实现;
response中字符流和字节流只能使用其一,否则会抛出异常;
servlet中文件上传下载一定要学会并熟悉使用;
1文件下载时碰到的问题,一对一个路径中截取文件名注意\和/的区别以及subString的角标的获取;
2文件下载头的设置要按照规范来:setHeader("Content-Disposition","attachment;filename"+filename);
3:对文件名进行URL编码时要记得加码表;
通过超链接方式给servlet传数据,如果是中文,需要进行URL编码,否则会出问题;
我们在表单中填写中文数据,然后提交给服务器,服务器端用request获取会出现乱码,他是怎么产生的呢?
首先用户在表单中填写的数据,提交后,浏览器给服务器的数据是由浏览器使用的码表(如果最初的编码由之前servlet设置过了就延续之前的编码,如果没有则采用平台默认编码)进行编码后产生的
编码值,即一堆0000110101数据,然后服务器端通过request.getParameter("usernmae");
该方法获取一个字符串数据,该数据也是需要经过查码表的,也就是说,浏览器传过来的一堆000111101数据中request对象默认使用的码表中对应的字符;
而request默认的使用的是ISO8859-1编码,这是tomcat服务帮我们做的事,我们可以设置默认的编码格式useBodyEncodingForURI
而中文字符一般是gb2312或者utf-8码表,这必然会产生乱码问题;
所以我们应该设置request的编码格式为浏览器的格式,即两者要一致,才不会产生乱码问题;
但是这种处理方式只适合提交方式为post,而get方式要手动对器其进行先解码,后编码,再解码;找一个中间码来解决;
这一过程称之为转码;转码操作对post和get请求提交的数据乱码问题具有通用性;
但是,如果在tomcat服务器的Connector标签中,将 useBodyEncodingForURI 属性设置为true就可以了;
为什么说超链接方式是采用get方式提交数据呢?
1 因为get方式提交数据时,数据会跟着url地址后面;而超链接也类似,所以超链接提交方式是get
为什么request.setCharacterEncoding("");方法只对post方法有效;
这是因为,request.setCharacterEncoding("");这个方法只对请求的消息体有效;
我们知道一个Http请求分为三部分,请求行,请求头,请求实体;
而我们又知道,post请求带过来的参数是放在请求实体中,而get请求带过来的参数是放在请求行中的;
这是根本原因,一句话request.setCharacterEncoding("");该方法只对请求实体内容有效;
请求转发的原理:一个servlet要将请求转发到另一个servlet,其实第一个servlet是先将请求发到tomcat服务器,
有服务器在定位到需要转发到的servlet.同时如果说当前servlet中的数据已经到达浏览器就不能在转发了,还会回到源servlet继续执行;
这个重定向也会...
比如:我在RequestForwardServlet中写这么2行代码:
request.getRequestDispatcher("/servlet/RequestForwardServlet2").forward(request, response);
System.out.println("我又回来了啊...");
RequestForwardServlet2中的代码是:response.getOutputStream().write("这个不会乱码呢...".getBytes());
那么这个程序的执行流程是这样的;首先RequestForwardServlet中会首先将请求转发到服务器,有服务器负责将RequestForwardServlet
需要转发的路径进行解析并定位到它要转发的servlet中;直到整个转发链完成,程序又回到RequestForwardServlet中继续执行
System.out.println("我又回来了啊...");代码;即使在RequestForwardServlet2中return了也还是会回到RequestForwardServlet
中继续执行后续代码;
但是这后面不能再向response中写数据了,写了也没用白写了;
但是需要注意的是,在转发链中如果有servlet已经将数据输出到浏览器(可以flush;)那么请求就不能在转发了;
在用request做请求转发到时候,如果写给浏览器的数据已经到达客户端,或者说response获取到的输出流已经关闭,
那么跳转到其他页面时会发生无效状态异常,同时因为程序已经跳转到一个页面,就不能再跳转到其他页面;
更不能陷入请求转发循环;
否则也会发生无效状态异常;IllegalStateException
因此我们写完跳转语句后,要记得return;结束程序;以免发生其他问题;使得程序的逻辑更加的清晰;
forward会清空response中的数据;即用request请求转发之前,我们通过response写给页面的数据被清除;只显示转发页面中的数据;
然而,虽然转发之前数据被清空,但是对response头设置的消息仍然生效;
可不可以说,在request转发后,如果说数据已经到达了浏览器端,那么response已经失效,对他进行的任何操作都不起作用;
下载中文文件-----搞定
request:request.getQueryString();是获取请求行中的所有用户输入参数;username=xiaoqiang
String requestURI = request.getRequestURI();
System.out.println(requestURI);// /Day04/servlet/HttpServletRequestTest
上面这个代表的是获取当前servlet的对外访问路径(不包括主机名)
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL.toString());// http://localhost:8080/Day04/servlet/HttpServletRequestTest
上面这个代表的是获取当前servlet的对外访问路径(包括主机名和端口号)
String servletPath = request.getServletPath();
System.out.println(servletPath);
/servlet/HttpServletRequestTest
这个代表当前servlet url的pattern;对外访问路径,不包括应用名称;
String parameterName = parameterNames.nextElement();
String parameterValue = request.getParameter(parameterName);//如果一个属性名对应了多个属性值,该方法默认取第一个;
但是得注意的是,我们一般填写注册表单是用post提交,更加安全;
cookie存储数据的过程:
1 首先用户通过浏览器访问服务器,服务器针对该浏览器创建一个cookie,把数据存入cookie中去(当然对cookie中设置path,setMaxAge等默认是 /Day05/servlet 类似的 cookie默认设置setMaxAge()为0,这个时候首先cookie是在浏览器内存中,如果关闭浏览器,cookie将不复存在,因此要让一个cookie在关闭浏览器后仍然有效,必须设置setMaxAge,且值必须为一个正整数值);服务器负责将cookie写入response中;
由服务器组织成一个response响应头,即对应的Set-cookie头;
下一次浏览器再去访问服务器时,将cookie带给服务器(当然事先将cookie组织成http请求头中的cookie头),由服务器创建request对象;
服务器可以从request从取出浏览器带过来的cookie,从而实现了用cookie将数据存储在客户端;虽然说cookie可以长时间的存在于客户端;
但是用户可以手动删除,或者用工具自动删除;具有不稳定性;因此虽然session的生命周期很短,但是在这一时间段内,他很稳定;
将数据存储在服务端的session技术的原理是什么呢?
首先一个用户用浏览器访问了一个servlet,servlet中第一次调用getSession方法,创建一个session,而且是针对每一个浏览器创建的;
当用户访问另一个servlet时,由于服务已经针对了这个浏览器创建了session,因此服务器可以识别,就不在针对该浏览器创建session了,
直接给他就是;那么服务器是怎么识别到这个浏览器的呢?
这是因为session的工作原理基于cookie;
用户用浏览器访问一个servlet说,服务器调用getSession方法为该浏览器创建session对象,并自动给该session对象生成一个唯一的id值;
然后在以cookie的形式将这个id值(但是这个cookie值的MaxAge没有设置,即默认为0所以当浏览器关闭的时候,cookie就被浏览器内存给清除了,因此要做到关闭浏览器数据还可以带回来的话,必须设置MaxAge值),写给浏览器;浏览器下次来的时候,又将该cookie带过来,服务器对该cookie进行解析,解析出了session id号;
和之前创建时 的id号相比,从而完成匹配过程;
注:以上所有的对象都是有服务器创建,浏览器只认识http协议,他发数据是以http协议的格式写的,写成http请求,有服务器将http请求数据 封装成request对象;同时服务器写给浏览器的数据首先要写给response对象,由服务器按照http协议进行组织一个响应头,发给浏览器,供浏览器进行解析;
会话:用户从点开浏览器到关闭浏览器,这期间发生的一些动作称之为会话;
session的生命周期:
在我们第一次调用request.getSession();时创建;有三种方式摧毁;
1 关闭浏览器后,或者说与浏览器断开连接超过30分钟(默认的,可以在web.xml中配置session-config,timeout属性),服务器的超时机制会摧毁该
session对象;
2 session对象本身有一个session.invalidate()方法,自杀;
3 服务器非正常关闭的时候;即JVM都停止运行了,tomcat也就不工作了,什么都没了;
为什么是非正常关闭呢?因为服务器正常关闭的时候在存放tomcat\work\Catalina\localhost\Day05\下会创建一个文件,保存我们的session信息;这一过程称之为钝化,而当服务器正常启动的时候,这个文件会被重新加载,也就是说原来的session还是有效的;但是原来的目录中的文件会被删除;这一个过程称之为活化;
在这期间。用户的如何与服务器交互,及如何存储数据;
有两种技术:cookie,他是把数据存放在浏览器端;
session,他是把数据存放在服务器端;
cookie:将数据存入cooki通常是时,需要添加cookie的存储周期的,setMaxAge();即该cookie在浏览器中可以存多久;和有效路径;setPath();
指该cookie只对那个路径下的应用有效;一般默认为当前servlet的目录;比如当前servlet在 Day05/servlet/SessionServlet;
那么这个path就是 Day05/servlet;
cookie在浏览器还没有被关闭的时候是放在浏览器内存中的;
浏览历史,采用cookie可以实现;
还可以用cookie实现自动登录;这个要结合filter使用;
一个cookie的唯一标识有三部分组成:一个是cookie名称,一个是domain+还有path;只有这三个一样则才是相同的cookie;
我们想想看cookie是客户端技术,;我们要向浏览器写cookie头,通过response对象;获取浏览器带过来的cookie用request对象;
那么他是怎么工作的.首先我们访问服务器时,服务器为该浏览器创建cookie对象,如果没有设置maxAge方法,则该cookie存在于浏览器的内存中;
随着浏览器的关闭而消失,而设置了maxage方法时,浏览器会将其写入到浏览器临时文件夹中保存起来,当然用户可以自己去删除某个cookie对应的文件;当然这些cookie也代表这用户的操作习惯,可以被其他人利用,泄露用户的隐私,因此对他的争议不断;
对他的替代的新技术比如cookieflush和计算机指纹;
我们讲到浏览器会对cookie进行硬盘存档,下次浏览器再去访问那个服务器时,会带上这个cookie;服务器对cookie进行解析;
从中取出数据,从而保证了数据的客户端保存;
如果我们一个cookie中设置了domain了,那么不管怎么样.浏览器都不在接受你的cookie了,等于白写了;
而cookie.setMaxAge();//如果设置了0或-1,则表示要删除或者cookie生成后马上删除;
使用Map集合存储数据时,如果需要按照存储数据的先后顺序,可以考虑使用LinkedHashMap集合;即我们使用集合时,先看看这个集合要实现什么功能;
是否要排序和按顺序存储;
Session:是一个域对象,他是服务器端用于存储用户数据的一个容器;
session是如何实现一个session为一个浏览器服务的呢?
原来当我们访问某个需要用session存储数据的servlet应用时,服务器会为该浏览器创建一个cookie,并回写给浏览器;
当浏览器访问其他要使用到session存储数据的servlet应用时,会将该cookie带过来,供服务器识别,从而做到一个session为
一个浏览器服务的效果;但是需要注意到时,服务器写给浏览器的cookie他没有设置有效期,即没有cookie.setMaxAge();
这个时候我们可以自己创建一个覆盖掉服务器创建的那个cookie;其名称为JSESSIONID,值为session.getId();
然后我们掉用自己创建的cookie为该cookie设置path和maxage;并response.addCookie(cookie);这样就覆盖掉了服务器自己创建的了;
但是用户也可能手动的把cookie给禁止掉了;我们又该怎么办呢?我们可以使用URL重写方式来解决;response.encodingURl();
还有response.encodingRedirectURL();即进行URL编码;
在进行URL编码的时候,他会有三个步骤;
session工作原理:1 首先浏览器访问一个服务器,服务器针对每个浏览器创建一个session,同时将sessionid以cookie的形式返回给浏览器;
处理完登录请求,要跳到首页,这一般使用的是重定向技术;
做用户注册登录时,要选用session容器来实现;为什么呢?因为session容器的作用范围是会话范围,
我们在个页面之间做跳转和点击超链接时,session都是存在的;servletcontext虽然存在,但是是供所有用户和应用共享,容易出现覆盖;
而request容器的作用范围是一个请求范围;点击超链接和或者浏览器重定向后,request不复存在;即又是一个新的request;
使用session技术的实际应用:
1 对图片验证码的校验;
原理:由服务器产生的验证码存入session中,同时根据用户提交的表单中验证码的数据进行比对;如果二者相符,则验证码通过;
2 防止表单重复提交;
1 首先在输出表单时在服务器中将一个随机的id值存入session中,同时将这个id值赋给输出的表单;然后校验二者是否相同;
如果校验通过证明不是重复提交,同时将该id值从session中移除,达到防止表单重复提交的效果;
struts2中有类似的功能token标签可以实现;
应用session,cookie技术实现用户自动登录功能;我的用户管理系统里面必须要有的;还有分页列表标签;实现数据分页显示;display;
要综合使用过滤器中;
md5:取得数据的数据摘要,而不是加密;
还可以校验数据的完整性;比如下载的文件和光盘
jsp:Java server pages
pagecontext域中可以访问其他域中的数据;有个findAttribute()方法;特别牛;从四个域中取数据
EL表达式${name}底层也是调用了findAttribute方法;
pageContext也可以跳转和包含;现在我们已经有很多类似的方式实现这样的功能
这个标签表示在session中创建一个一个Person类的实例对象,并以person的名字,存入session域中;
因此useBean标签只在创建类的实例时才执行;当我们对jsp不熟悉时,可以查看tomcat服务器work目录下的jsp翻译成servlet的源文件;
jsp就是一个servlet,只要我们servlet学好了,jsp就小case;
对于jsp标签和el表达式以及jstl表达式;他们底层都对应着一个个都标签处理器来处理这些标签中的内容;底层使用了
反射技术来实现从容器中存取数据;因此只要弄懂了servlet,就没什么大问题,就是些个语法;
浮点数运算容易出现精度问题;有个BigDecimal类,可以解决;
MVC设计模式:M即Model,可以将其视为一个javabean,用于封装数据的对象模型;
V即view可以将其视为一个jsp用于做数据显示的;
C即controller,可以将其视为一个servlet,控制服务器的页面之间的跳转问题;
在tomcat服务器下,我们浏览一个页面,即使是首页,tomcat服务器会去根据web.xml中的配置去找servlet,然后根据用户的请求去
找相应的jsp或者html或者servlet;由于servlet不适合做输出,因此要用到jsp,同时jsp中有大量数据要交给servlet。这个时候,
处理jsp页面请求的servlet通常会将其封装成一个个都Javabean;这三者各司其职,发挥各自的特长;
而三层架构思想是为了程序运行维护以及扩展性考虑;分层开发有利于运行维护,理清开发思路;促进个层即模块之间的完全解耦;
日期,地址等实用的js控件要好好看看,争取学会;
产生一个全球唯一的id值;UUID类
UUID.randomUUID();
使用MyEclipse的特有功能导入开发jar包;
一分钟速算,不错!值得一学;
在同一个网段中,别人怎么浏览我的页面?这个问题需要好好解决下,给他们秀一下我的网页!
JSTL:核心标签库;重点中的重点;
JSTL函数:EL函数,这个还是好好看看相关文档;
可以实现表格间色(varStatus)和分页显示(start end step)
jstl表达式中,只要看到var="";则该var是保存了迭代到底数据;可以通过${}取出来;
重写url地址,如果浏览器禁用cookie,是一种安全的作法;同时如果在超链接后面加了中文参数是会经过中文编码的;
网页爬虫:即内置了正则表达式,解析其文件内容;爬出相应的消息;
可以从网页上爬出来:通过URL和URLConnection;爬出邮箱地址;然后向该邮箱地址发送广告从而获利!!
泛型在编译后,没有了,是为了提高效率;去泛型的过程称之为擦除;
请求行
请求头:名称+:空格+内容;
结束:空格 +回车符
get请求方式不带内容,而post请求带内容???
怎么理解???
关于JavaSE下路径的问题;
1:如果你的文件放在程序的根目录下,比如你建了一个TestFilePath目录,这是一个JavaSE目录,
你在TestFilePath目录下,放了一个 1.txt文件,即: TestFilePath/1.txt;
这个时候你用流去读取,可以这样;
FileInputStream fis=new FileInputStream("1.txt");//这是一个相对路径;
2:如果你的文件放在Exam应用根目录的src目录下,那么你创建一个流去读取他可以这样;
FileInputStream fis=new FileInputStream("src/1.txt");
如果你想用类加载器的方式去加载时,可以这样;
// InputStream fis=TestFilePath.class.getResourceAsStream("1.txt");//两者有什么区别
InputStream fis=TestFilePath.class.getClassLoader().getResourceAsStream("1.txt");
myeclipse会自动将应用程序根目录下的src中的内容自动组织发布到WEB-INF/classes下;
在JavaSE中,即ServletTest应用目录中的程序写入如下代码(仅仅是一个普通的java类);
File file=new File("2.txt");
System.out.println(file.getAbsoluteFile());
File file1=new File("/2.txt");----想当于:new File(H:/2.txt);
System.out.println(file1.getAbsoluteFile());
打印的结果是:
H:\Program\ServletTest\2.txt
----File file=new File("2.txt");
相当于:new File("H:\Program\ServletTest\2.txt");
也就是说这个相对目录省略的部分就是应用程序的根目录,即H:\Program\ServletTest
H:\2.txt
----File file1=new File("/2.txt");----想当于:new File(H:/2.txt);
也就是说,带/的,在前面省略的是当前所在的盘符;比如D盘,或者H盘,反正必须是磁盘的根目录.
而同样是相同的代码:放在JavaWeb程序中,即servlet中,
File file=new File("1.txt");
System.out.println(file.getAbsoluteFile());
File file1=new File("/1.txt");
System.out.println(file1.getAbsoluteFile());
输出的结果却是这样;
D:\apache-tomcat-7.0.32-windows-x86\apache-tomcat-7.0.32\bin\1.txt
查看文档:
java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir 指定,
通常是 Java 虚拟机的调用目录。
----也就是说,java虚拟机从哪里开始执行,在上面的
\Program\ServletTest中,由于我的.class文件目录是放在这里的,java虚拟机从这里开始执行我的程序;
而在tomcat服务器中,虚拟机要先启动tomcat服务器中的java程序,因此要从bin目录开始执行,
然后由tomcat服务器通过反射技术调用我的servlet;
因此这里说的java虚拟机的调用目录就是---D:\apache-tomcat-7.0.32-windows-x86\apache-tomcat-7.0.32\bin
可以这样理解吗?????-------------问题;
问题根由:这个Java的虚拟机的调用目录到底是指的什么;
D:\1.txt----这个好理解,就是省略了盘符;
new File("");
new FileInputStream(""); ---- 相对的是程序的启动目录,或者说你的.class文件放在哪里,就相对哪个目录
ClassLoader.getResource();
ClassLoader.getResourceAsStream();
---- 相对于类加载器加载类的目录. 这个根据你的类加载器的不同加载的目录就不同;
InputStream fisa = this.getServletContext().getClassLoader()
.getResourceAsStream("/1.html");
//这个方法在ServletContext中有这个方法this.getServletContext().getClassLoader(),但是
我的不能调用,他的确可以...这是什么情况???
这个是由于JAVAEE5中,不行,JavaEE6可以;算是新特性吧...
在老方讲的视频第四天课程,最后一节讲用ClassLoader加载资源时的实时更新情况,
试验的时候静态代码块加载资源不能够做到实时更新;
而直接使用classloader去加载的时候;有些时候可以做到实时更新,有些时候却不能...
这什么情况;
使用增强for循环时记得校验空指针;
服务器正常关闭后,之前的session如果超过规定时间服务器在启动;
或者说,服务器正常关闭的时间间隔超过了session的默认超时机制;
session将失效;不会在有活化的操作了.
jsp乱码问题解析:
1 jsp文件用什么编码格式保存的;如果保存编码格式和jsp翻译引擎所使用的编码不一样的话,会产生乱码问题;
2 jsp被翻译成了servlet后,如果这个servlet写给浏览器的数据采用的编码跟浏览器解析数据采用的编码不一样的话也会产生乱码;
搞清楚了乱码的根由后我们就可以对症下药了
1 首先通过page指令的 pageEncoding属性设置jsp翻译引擎将jsp翻译成servlet采用的编码;使得jsp文件的编码格式和翻译时的格式一致;
2 通过contentType属性设置浏览器解析数据时使用的编码格式;
我们的福音:只要设置了pageEncoding属性,jsp翻译引擎底层会将contenttype属性设置跟pageEnconding的值一样;也就是说一段代码干两件事;
同时MyEclipse工具会将pageEncoding的属性值设置为jsp文件的保存格式;
自己写一个函数,供el表达式调用;
步骤:首先定义好一个java类,在该类中定义好静态公有函数;
其次在配置文件中描述一把;用MYEclipse工具生成的时候,
使用http://www.itheima.com //记得带上http://至于为什么不知道;
在jsp页面中通过taglib指令引入;
style="ime-mode:inactive" 用于设置下浏览器的输入法;
getAttribute(java.lang.String name, int scope) pageContext中有个重载方法;
session被invalidate并不是直接被销毁,而是移除其中的一些属性;使得session不可用,如果你在调用它就抛异常;
HttpClient:是用来模拟Http请求,以前
我们发送请求是通过浏览器的,浏览器会加一些固定的请求头,比如你用浏览器取访问一个只有手机才能访问的
页面,用浏览器取访问是不行的,他会对你的 User-agent进行检查;
如果用HttpClient就可以实现用程序发送Http请求,并加上自己的请求头消息;
HttpURLConnection:用来获取服务器端的页面数据;
HttpClient也可以;