1、1. 反射重写(覆盖):父子重载:一个类内equalshashSet,hasMap,HashTable对集合的操作?1. hashSet.add(object o);他会先调用这个对象的 hashcode()方法,定位到他要放的物理位置如果该位置上没有元素,则直接把该元素存储在该位置上。如果该位置有元素,则会调用该对象的 equals 方法,判断他们是否相同。相同,则不存储 不相同,则散列到其他地址。2.hashSet.contains(object o);查找一个元素时:首先调用该对象的 hashCode 方法,若该位置有元素则调用 equals 方法,否则不调用。默认的 hashCode
2、是一个本地方法,返回的是一个与地址所对应的值(但不是内存地址)如果 Student 覆盖了 equals and hashCode 方法hashSet.add(new student(1,”zs”); /只调用 hashCode hashSet.add(new student(2,”ls”); /只调用 hashCodehashSet.add(new student(3,”ww”); /只调用 hashCodehashSet.add(new student(1,”zs”); /调用 hashCode 还要调用 equals如果 Student 覆盖了 equals 但 hashCode 返回值
3、相等hashSet.add(new student(1,”zs”); /只调用 hashCode hashSet.add(new student(2,”ls”); /只调用 hashCode,1 次 equalshashSet.add(new student(3,”ww”); /只调用 hashCode,2 次 equalshashSet.add(new student(1,”zs”); /调用 hashCode X 次 equalsString :2.html 有浏览器解析执行,主要:兼容性问题css 数据与外观分离(主要负责页面的外观)js :用于与页面交互的脚本语言,在浏览器端执行。作用
4、:1.前端验证(验证不通过,浏览器不提交数据到服务器。 )2.ajax 核心技术一,用于异步的向服务器发送请求,并动态更新页面。3.与页面交互,生成一些动态效果(比如:嵌入动态文本于 HTML 页面)4.获取浏览器的相关信息。3.浏览器如何处理 URL:http:/ip:port/appname /login.do 第一步:服务器查看有没有 appname 对应的用户存在,若没有返回 404,如有则进入下一步。第二步:在 web.xml 中(与 appname 所对应的) ,使用 “/login.do”与 url-pattern 进行匹配第三步:如果任然没有匹配到,会查询静态资源。如果找到返回
5、,找不到返回 404.4.get特点:一件事情未完成转发的目的地,只能是同一个应用内部转发时浏览器地址栏的地址没有任何改变。转发涉及组件之间,可以共享同一个 request,response 对象。前后两个页面 有数据传递 用请求转发(servlet 查询出数据,转发到 jsp) ,没有则用重定向。要注意的:重定向/转发之前不能有任何的输出(有则报错) 。如果缓存中有数据,重定向/转发之前会清空缓存中的数据。6.servlet: 在服务器上运行的小程序 .也是扩展 web 服务器的一种组件。组件(程序员写):组件是符合规范,完成一定功能,并可以单独部署的软件模块,组件一般不能单独运行,需要依赖
6、容器才能运行。容器(一般由大厂商提供):提供组件的运行环境,并且管理组件的生命周期。Servlet 容器:提供 servlet 运行的环境,并且管理 servlet 的生命周期,一般常见的 web 容器:比如 tomcat,除了一个 servlet 以外,同时也是一个 web 服务器。 (既是 servlet 容器,又是 web 容器)servlet 是运行于 servlet 容器中,可以被 servlet 容器动态加载,来扩展服务器的功能,并提供特定的服务。servlet 按照请求 /相应的方式工作。主要作用:web 服务器本身没有计算能力,也就谁说,不能处理动态资源的请求。servlet
7、可以处理动态资源的请求。Servlet 响应用户请求的过程:浏览器输入一个地址(指向一个 servlet)http:/ip:port/mytest /login.do1.浏览器依据 ip,端口号 连接服务器2.浏览器将请求数据包按 http 协议打包成一个 http 请求数据包3.服务器“看出来”这个请求要的是一个 servlet(web.xml 中的 url-pattern 进行匹配) ,此时服务器中的一个负责通讯的模块(一般叫做 servlet 引擎)会创建HttpServletRequest 实例(HttpServletRequest 实际上是一个接口,有服务器提供者实现,该实例包含了请
8、求数据中的数据)还创建了 HttpServletResponse 实例。4.服务器依据 port 之后的部分 mytest /login.do 找到 web.xml,依据 web.xml 中的信息找到对应的 servlet 类名。 UserMgmtweb.UserMgmtUserMgmt*.do会查看该 servlet 有没有对应的实例,如果没有则创建实例,如果有则使用现成实例(此时可能出现线程安全问题)/service(HttpServletRequest request, HttpServletResponse response)/对于程序员,就操作这两个对象。接下来调用 service(
9、)方法。Service 方法里面的代码可以通过 HttpServletRequest 提供的方法获取请求中的数据。并且可以将处理之后的结果通过 HttpServletResponse 提供的方法设置返回的结果。5.servlet 引擎从 HttpServletResponse 获取数据,生成 http 响应数据包,发送给浏览器。6.servlet 生命周期:核心接口:servlet 接口(所有的 servlet 必须实现该接口)该接口主要定义三个方法:init(ServletConfig config):初始化方法 ServletConfig:主要用于获取servlet 配置参数。servic
10、e(req,res):处理请求 (判断 get/post 请求,调用响应的doget/dopost)destroy():销毁资源 容器根据自己的算法,在删除之前调用 destory()释放资源。servlet 容器默认调用有参的(GenericServlet 类中)public void init(ServletConfig config)this.config= config;init();1、实现 servlet 接口2、继承 GenericServlet(实现 service 方法 )3、继承 HttpServlet 类(重写 doGet,doPost 方法就行)默认的 init()方法
11、由 GenericServlet 来实现,如果想自定义自己的初始化过程,可以重写Init()(直接写要写的代码)方法或重写 init(ServletConfig config)(要调用父类的super.init(config))7.Why?jsp: 因为直接使用 servlet 生成动态页面过于繁琐,使用 jsp 生成动态页面更方便。(jsp 不需要编译,直接打包,就可以运行)Jsp(java server page): 服务器端动态页面生成技术,主要组成部分是 html 元素,以及少量java 代码,Jsp:如何运行当访问某个.Jsp 文件时,jsp 引擎(servlet 容器中的某一个特点
12、的模块)会将.Jsp 文件转换为.Java 文件(.java 就是一个 servlet)然创建其实例,并调用其 service()方法。Jsp-java对于 java 代码片段 :把代码直接放在 service()方法中对于 java 表达式 :放到 service()方法中,使用 out.prin()输出 对于 html :放到 service()方法中,使用 out.write()输出注:print (null)输出 null, write(null)输出”对于:声明的变量会作为对应的 servlet 的属性方法。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。一个
13、独立方法(不建议用,容易导致线程不安全)8. Session /注册回调函数,用于处理服务器请求。4)XMLHttpRequest.Send()3.在服务器端编写相应代码处理请求。再服务器端,一般不会返回完整的页面,只需要返回部分数据。4.在回调函数中,通过 XMLHttpRequest 获取数据,然后更新页面。ElOverridepublic User getModel() return user;过程为:当浏览器提交 ModelAction.action 请求时,先经过拦截器。其中有一个拦截器为ModelDrivenInterceptor,从这个源代码可以看出,这个拦截器的作用就是获取实现
14、了ModelDriver 接口的 action 的模型驱动。在这里为 user。然后把模型驱动利用 push 方法压入到栈顶。这样我们就能直接通过属性进行回显和赋值了。通过这个图也可以看出模型驱动的拦截器在参数拦截器前面,也就是先把模型驱动压入栈顶,再进行赋值。模型驱动过程:当用户触发 UserAction 动作时,ModelDriven 拦截器会调用相关 UserAction对象的 getModel()方法,并将返回值(User 实例)压入到 valueStack 栈中,接下来parameters 拦截器将把表单中的字段映射到 valueStack 栈顶对应的各个属性当中。因为此时栈顶是刚刚
15、被压入的模型,所以模型被填充。不能转换的怎么办:比如 struts2 要求的日期是: yyyy-mm-dd但如果是 yyyyMMdd 怎么办?1、 写一个 java 类,这个类必须继承 DefaultTypeConverter 或者实现TypeConverter 接口。2、 配置自定义的类型转换器:1.基于字段(局部的)创建一个属性文件 actionName(根据 action 类名来写)-conversion.properties,该文件需要与相对应的 动作类放在同一目录下 。Egg:UserAction-conversion.properties 中createTime = com.lyg
16、.converter.DateConverter2.基于类(全局的)在根目录下:创建 xwork- conversion.properties Java.util.Date = com.lyg.converter.DateConverter2.国际化1.定义不同的资源文件 resources_en_US.propertiesresources_zh_CN.propertiesresources.properties(默认)2.在 struts.xml 中配置通过 ie internet 选项 修改 语言来测试。2.自定义拦截器:拦截器是 AOP 的一种实现所有的拦截器都实现了 Intercep
17、tor 接口,或者继承了 Interceptor 接口扩展类实现类。重写 init(),intercept(),destroy()方法intercept()每次请求就执行一次,做相关的处理工作在 struts.xml 中配置,注册 即:把默认栈加入到自己写的拦截器中使用自己写的拦截器栈:说明:使用拦截器栈。从上面声明部分可以看出,accessInterceptorStack 栈既包括了自定义的拦截器,又包括了 struts2 内部的拦截器栈。拦截器与过滤器的区别;1)拦截器是基于 Java 反射机制的,而过滤器是基于接口回调的。s2)过滤器依赖于 Servlet 容器,而拦截器不依赖于 Ser
18、vlet 容器。3)拦截器只能对 Action 请求起作用,而过滤器可以对所有请求起作用。4)拦截器可以访问 Action 上下文、值栈里的对象,而过滤器不能。3.文件上传4.struts2 手工验证 Classes.java 中 private Set students;配置文件:Student.hbm.xml/外键 描述了,通过 student 建立与 classes 之间的关系Classes.hbm.xml/ 指出 Classes 和那个对象进行关联。多对多:Course studentStudent.hbm.xmlCourse.hbm.xml一般一对多的涉及到关系的维护:都通过多的一方
19、来维护。避免发出 update 语句Inverse:不维护关系 false 维护Cascade: 级联 6.一级缓存二级缓存:二级缓存在 sessionFctory 中存放 存放共享的 sessionFctory 级别的缓存存放很少被修改的数据,数据可以公开的EhCache, OSCache, JBossCache查询缓存:依赖于二级缓存,所以必须开启二级缓存才可用。查询数据时:如果查询缓存存在。则直接返回。否则 到数据库查询,然后把查询结果放在查询缓存。 缓存的作用:1。减少访问数据库的频率。2。保证缓存中的对象与数据库中的相关记录保持同步。For(int i=0;i org.springframework.web.context.ContextLoaderLister2. 让 spring 创建 action3. 把 struts 的请求委托给 spring 管理:作用:创建 Action 实例的过程由 spring 处理struts.xml4. 创建 package 并配置 Action/index.jsp框架各自流程:Hibernate:加载配置文件(hibernate.cfg.xml *.hbm.xml)产生 sessionFactory 产生 session查询/启动事务 cud 关闭事务