1. 反射
重写(覆盖):父子 重载:一个类内
equals&&hashCode:为什么要同时覆盖?
hashCode覆盖的主要作用是为了配合基于散列的集合一起正常运行,这些结合包括;
hashSet,hasMap,HashTable…..
对集合的操作?
1.hashSet.add(object o); 他会先调用这个对象的hashcode()方法,定位到他要放的物理位置
如果该位置上没有元素,则直接把该元素存储在该位置上。 如果该位置有元素,则会调用该对象的equals方法,判断他们是否相同。 相同,则不存储不相同,则散列到其他地址。
2.hashSet.contains(object o); 查找一个元素时:首先调用该对象的hashCode方法,若该位置有元素则调用equals方法,否则不调用。
默认的hashCode是一个本地方法,返回的是一个与地址所对应的值(但不是内存地址) 如果Student 覆盖了equals and hashCode方法 hashSet.add(new student(1,”zs”)); //只调用hashCode hashSet.add(new student(2,”ls”));//只调用hashCode hashSet.add(new student(3,”ww”));//只调用hashCode
hashSet.add(new student(1,”zs”)); //调用hashCode还要调用equals
如果Student 覆盖了equals 但hashCode返回值相等 hashSet.add(new student(1,”zs”)); //只调用hashCode
hashSet.add(new student(2,”ls”)); //只调用hashCode,1次equals hashSet.add(new student(3,”ww”)); //只调用hashCode,2次equals hashSet.add(new student(1,”zs”)); //调用hashCodeX次equals
String :
2.html 有浏览器解析执行,主要:兼容性问题 css数据与外观分离(主要负责页面的外观)
js :用于与页面交互的脚本语言,在浏览器端执行。 作用:
1.前端验证(验证不通过,浏览器不提交数据到服务器。) 2.ajax核心技术一,用于异步的向服务器发送请求,并动态更新页面。 3.与页面交互,生成一些动态效果(比如:嵌入动态文本于HTML页面)
4.获取浏览器的相关信息。
3.浏览器如何处理URL:http://ip:port/appname /login.do
第一步:服务器查看有没有appname对应的用户存在,若没有返回404,如有则进入下一
步。
第二步:在 web.xml中(与appname所对应的),使用“/login.do”与url-pattern进行匹配 第三步:如果任然没有匹配到,会查询静态资源。 如果找到返回,找不到返回404. 4.get&&post请求 Get:
什么时候采用:表单的默认提交方式,直接在浏览器上输入地址,通过链接访问。
特点:在地址栏会显示数据,请求数据会放在请求资源路径后面,一般用于向服务器获取资源。 Post :
设置表单为post方式:
特点:数据不会在地址栏显示,数据会存放在实体内容里,一般用于向服务器发送数据。
二者对比:get的缺点:提交的数据有限制(因为只能存放在请求行之后) 不安全(浏览器地址栏能看到数据)
Post的优点:数据量大(因为存放到实体内容里面)
相对安全(但是实体内容的数据任然没有加密,可以借助工具看到) 5.重定向与转发
重定向:服务器向浏览器发送一个状态码为302及一个消息头location,浏览器会立即向
location所指向的地址发送一个新的请求。
编程:response.sendRedirect(重定向地址)
重定向的特点及需要注意的: 重定向的地址是任意的
浏览器中地址栏的地址会变成重定向的地址 一件事情已经做完了。
由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。
转发:在同一个应用内部,一个组件将未完成的任务转交给另外一个组件来完成。 编程:request.getRequestDispatcher(\另一个组件的地址 \
特点:一件事情未完成
转发的目的地,只能是同一个应用内部 转发时浏览器地址栏的地址没有任何改变。
转发涉及组件之间,可以共享同一个request,response对象。
前后两个页面有数据传递用请求转发(servlet查询出数据,转发到jsp),没有则用重定向。
要注意的:重定向/转发之前不能有任何的输出(有则报错)。如果缓存中有数据,重定向/转发之前会清空缓存中的数据。
6.servlet:在服务器上运行的小程序.也是扩展web服务器的一种组件。
组件(程序员写):组件是符合规范,完成一定功能,并可以单独部署的软件模块,组件一般不能单独运行,需要依赖容器才能运行。
容器(一般由大厂商提供):提供组件的运行环境,并且管理组件的生命周期。
Servlet容器:提供servlet运行的环境,并且管理servlet的生命周期,一般常见的web容器:比如tomcat,除了一个servlet以外,同时也是一个web服务器。(既是servlet容器,又是web容器)
servlet是运行于servlet容器中,可以被servlet容器动态加载,来扩展服务器的功能,并提供特定的服务。servlet按照请求/相应的方式工作。
主要作用:web服务器本身没有计算能力,也就谁说,不能处理动态资源的请求。servlet可以处理动态资源的请求。
Servlet响应用户请求的过程:
浏览器输入一个地址(指向一个servlet)http://ip:port/mytest /login.do 1.浏览器依据ip,端口号连接服务器
2.浏览器将请求数据包按http协议打包成一个http请求数据包
3.服务器“看出来”这个请求要的是一个servlet(web.xml 中的url-pattern进行匹配),此时服务器中的一个负责通讯的模块(一般叫做servlet引擎)会创建
HttpServletRequest实例(HttpServletRequest实际上是一个接口,有服务器提供者实现,该实例包含了请求数据中的数据)
还创建了HttpServletResponse实例。
4.服务器依据port之后的部分mytest/login.do找到web.xml,依据web.xml中的信息找到对应的servlet类名。
会查看该servlet有没有对应的实例,如果没有则创建实例,如果有则使用现成实例(此时可能出现线程安全问题)
//service(HttpServletRequest request, HttpServletResponse response) //对于程序员,就操作这两个对象。
接下来调用service()方法。Service方法里面的代码可以通过HttpServletRequest提供
的方法获取请求中的数据。并且可以将处理之后的结果通过HttpServletResponse提供的方法设置返回的结果。
5.servlet引擎从HttpServletResponse获取数据,生成http响应数据包,发送给浏览器。
6.servlet生命周期:
核心接口:servlet接口(所有的servlet必须实现该接口) 该接口主要定义三个方法:
init(ServletConfigconfig):初始化方法ServletConfig:主要用于获取
servlet配置参数。
service(req,res):处理请求 (判断get/post请求,调用响应的doget/dopost)
destroy():销毁资源容器根据自己的算法,在删除之前调用destory()释放资源。
servlet容器默认调用有参的(GenericServlet类中)
public void init(ServletConfigconfig){
this.config=config; init();
}
1、实现servlet接口
2、继承GenericServlet(实现service 方法)
3、继承HttpServlet类(重写doGet,doPost方法就行)
默认的init()方法由GenericServlet来实现,如果想自定义自己的初始化过程,可以重写 Init()(直接写要写的代码)方法或重写init(ServletConfigconfig)(要调用父类的super.init(config))
7.Why?jsp: 因为直接使用servlet生成动态页面过于繁琐,使用jsp生成动态页面更方便。(jsp不需要编译,直接打包,就可以运行)
Jsp(java server page):服务器端动态页面生成技术,主要组成部分是html元素,以及少量java代码,
Jsp:如何运行
当访问某个.Jsp文件时,jsp引擎(servlet容器中的某一个特点的模块)会将.Jsp文件转换为.Java 文件(.java就是一个servlet)然创建其实例,并调用其service()方法。 Jsp----?java
对于java代码片段<% %>:把代码直接放在service()方法中
对于java表达式<%= %>:放到service()方法中,使用out.prin()输出 对于html :放到service()方法中,使用out.write()输出 注:print(null)输出 null, write(null)输出””
对于<%! String line =”hello world!” %>:声明的变量会作为对应的servlet的属性 方法。。。。。。。。。。。。。。。。。。。一个独立方法 (不建议用,容易导致线程不安全)
8.Session && cookie
http是无状态的,(可以利用有限的资源为多个客户服务)即:http服务器不记录哪一个浏览器访问了
要记录状态的情况:比如购物系统,要记录客户端的状态。 Cookie:将用户的状态保存在客户端。 Session将用户的状态保存在服务器端。
Cookie:浏览器访问某个服务器时,服务器会创建一部分数据。(以消息头set-cookie的方式)发送给浏览器,浏览器会将这部分数据保存下来。当浏览器再次访问该服务器时,将会把这部分数据发送给服务器。 创建:response.addCookie(…) 查询:request.getCookies() Cookie限制:
1.cookie只能保存字符串,并且对于中文,需要编码。 2.cookie大小有限制(4k左右)
3.cookie的个数也有限制(本地大约三百) 4.cookie不是很安全 5.cookie可能被用户禁止。
Cookie的时用场合:自动登录,网页换肤,。。。。。。 路径问题:http://ip:port/appname/jsp01/jsp01.jsp
创建cookie时都会有一个默认的path 此时为:/appname/jsp01
当请求这个路径之下的,都会把cookie带过去egg:/appname/jsp01/acd/cde.jsp /appname/jsp01.jsp 则不会。
Session:浏览器访问服务器时,服务器会创建一个对象(session对象),同时,还会生成一个标识该对象的唯一字符串(sessionID),服务器在默认的情况下使用cookie机制将sessionID发送到浏览器,浏览器下次访问时,会将sessionID携带到服务器,服务器使用sessionID查找对应的session对象。
用户禁止cookie: