Springmvc入口是方法Struts入口是fiter
Springmvc基于方法开发的传递参数通过形参,可以设计成单例或者多例
Struts基于类开发传递参数通过属性传递,只可以设计成多例的
Struts采用值栈的方式请求和响应数据,通过OGNL存取在页面
Struts针对每个请求封装成map供action使用保证了线程的安全性,但是在并发量大的时候创建了较多的Action大量占用资源,.并发量大的时候考虑用Springmvc代替Struts
Springmvc继承ajax使用方便只需要一个@requestBody注解返回结果即可.
Struts的拦截器继承了ajax在action中配置必须通过插件,或者代码集成进去,使用起来相对不便.
Springmvc可以认为100%零配置
三、
三、几种典型的内存泄漏
我们知道了在Java中确实会存在内存泄漏,那么就让我们看一看几种典型的泄漏,并找出他们发生的原因和解决方法。
3.1全局集合比如hashmap和ArrayList正名为static生命周期和应用的生命周期一样长
在大型应用程序中存在各种各样的全局数据仓库是很普遍的,比如一个JNDI-tree或者一个sessiontable。在这些情况下,必须注意管理储存库的大小。必须有某种机制从储存库中移除不再需要的数据。
通常有很多不同的解决形式,其中最常用的是一种周期运行的清除作业。这个作业会验证仓库中的数据然后清除一切不需要的数据。
另一种管理储存库的方法是使用反向链接(referrer)计数。然后集合负责统计集合中每个入口的反向链接的数目。这要求反向链接告诉集合何时会退出入口。当反向链接数目为零时,该元素就可以从集合中移除了。
3.2缓存一个已经不用的对象却被缓存引用.
缓存一种用来快速查找已经执行过的操作结果的数据结构。因此,如果一个操作执行需要比较多的资源并会多次被使用,通常做法是把常用的输入数据的操作结果进行缓存,以便在下次调用该操作时使用缓存的数据。缓存通常都是以动态方式实现的,如果缓存设置不正确而大量使用缓存的话则会出现内存溢出的后果,因此需要将所使用的内存容量与检索数据的速度加以平衡。
常用的解决途径是使用java.lang.ref.SoftReference类坚持将对象放入缓存。这个方法可以保证当虚拟机用完内存或者需要更多堆的时候,可以释放这些对象的引用。
四、如何检测和处理内存泄漏
如何查找引起内存泄漏的原因一般有两个步骤:第一是安排有经验的编程人员对代码进行走查和分析,找出内存泄漏发生的位置;第二是使用专门的内存泄漏测试工具进行测试。
hashmap2倍扩容hashtable2倍+1扩容
Http协议的理解HTTP是一个超文本传输协议,属于OSI七层模型的应用层,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是无状态的也就是说同一个客户端的这次请求和上次请求是没有对应关系。tcp属于第四层
应用层(Application):
网络服务与最终用户的一个接口。
协议有:HTTPFTPTFTPSMTPSNMPDNS
表示层(PresentationLayer):
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等
会话层(SessionLayer):
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层(Transport):
定义传输数据的协议端口号,以及流控和差错效验。
协议有:TCPUDP,数据包一旦离开网卡即进入网络传输层
网络层(Network):
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMPIGMPIP(IPV4IPV6)ARPRARP
数据链路层(Link):
建立逻辑连接、进行硬件地址寻址、差错效验等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层(PhysicalLayer):
建立、维护、断开物理连接。(由底层网络定义协议)
'
2.网络聊天系统或论坛,功能是过滤非法文字
3.统一解决编码
怎么创建一个过滤器:
1.生成一个普通的class类,实现Filter接口(javax.servlet.Filter;)。
2.重写接口里面的三个方法:init,doFilter,destroy。
3.然后在web.xml配置过滤器。Servlet过滤器一、Servlet过滤器的概念:◆Servlet过滤器是在JavaServlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。◆Servlet过滤器本身并不产生请求和响应对象,它只能提供过滤作用。Servlet过滤器能够在Servlet被调用之前检查Request对象,修改RequestHeader和Request内容;在Servlet被调用之后检查Response对象,修改ResponseHeader和Response内容。◆Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或者HTML文件。二、Servlet过滤器的特点:◆Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象◆Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器◆Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象
三、Servlet过滤器的作用:◆查询请求并作出相应的行动。◆阻塞请求-响应对,使其不能进一步传递。◆修改请求的头部和数据。用户可以提供自定义的请求。◆修改响应的头部和数据。用户可以通过提供定制的响应版本实现。◆与外部资源进行交互。
五、Servlet过滤器接口的构成:所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:◆init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数◆doFilter(ServletRequest,ServletResponse,FilterChain):这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器◆destroy():Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源
六、Servlet过滤器的创建步骤:◆实现javax.servlet.Filter接口◆实现init方法,读取过滤器的初始化函数◆实现doFilter方法,完成对请求或过滤的响应◆调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应◆销毁过滤器
七、Servlet过滤器对请求的过滤:◆Servlet容器创建一个过滤器实例◆过滤器实例调用init方法,读取过滤器的初始化参数◆过滤器实例调用doFilter方法,根据初始化参数的值判断该请求是否合法◆如果该请求不合法则阻塞该请求◆如果该请求合法则调用chain.doFilter方法将该请求向后续传递
八、Servlet过滤器对响应的过滤:◆过滤器截获客户端的请求◆重新封装ServletResponse,在封装后的ServletResponse中提供用户自定义的输出流◆将请求向后续传递◆Web组件产生响应◆从封装后的ServletResponse中获取用户自定义的输出流◆将响应内容通过用户自定义的输出流写入到缓冲流中◆在缓冲流中修改响应的内容后清空缓冲流,输出响应内容
做事(行为之一)走路(行为之二)说话(行为之三)}
继承:由于封装,使得有共同特征的一类事物的所有描述信息都被归于一类之中,但我们知道,这并不是万能的,有些事物有共性,但还存在区别,比如教师,简单封装起来如下:教师{年龄(属性一)身高(属性二)性别(属性三)
做事(行为之一)走路(行为之二)说话(行为之三)
教书(行为之四)}上面对"教师"的封装,与对"人"的封装基本上差不多,只是多了一个特征行为:教书,教师有与人一样的共性,但我们不能说"人教书",也就是不能把教书封装到"人"之中去,教书是教师的特征行为之一.为了省事地封装教师(代码的复用,这只是继承存在的原因之一),可以让教师去继承人,如:教师extends人{教书(行为之三)}这样,我们就不用重新定义那些已经被"人"这一个类所封装的那些属性与行为了,而只需要使用继承的方式,在人的基础上拓展教师专有的行为,即"教书"即可把教师描述出来;这样的结果,即是教师也同时拥有"人"之中所封装的一切属性与行为,还拥有自己的特征行为"教书".
多态:多态的概念发展出来,是以封装和继承为基础的(其实我觉得抽象也应该算是面向对象的大特征之一,要封装,抽象是必须的)
简单的理解一下多态,比如:人这个类,封装了很多人类共有的特性,教师是人的子类,继承了人的属性与行为,当然教师有自己的特征行为,比如教书授课;学生是人的子类,继承了人的属性与行为,当然学生有自己的特征行为,比如学习做作业;现在,当我们需要去描述教师与学生各自的行为的时候,我们可以分开来说"教师在授课","学生做作业",但如果我们要站在抽象的角度,也就是从教师与学生的父类"人"的角度,来同时描述他们各自的行为时,我们怎么描述"人在授课""人在做作业"这是不是怪怪的很不合适不合适的问题就在于,对于行为主体,我们使用了抽象层次的东东"人",而对于行为本身,我们却使用了具体的东东"授课"与"教书".怎么解决呢那就需要解决抽象与具体的矛盾问题.既然是站在抽象在角度来描述,那我们把行为抽象一下,不就能同时描述了吗比如"人在做事"(教师授课与学生做作业都可以说成人在做事),这样就解决了抽象层次与具体层次之间的矛盾.
到了这一步,我们可以把两个描述:"教师在做事","学生在做事"两者统一为"人在做事",然后,我们可以在"教师"的"做事"行为中去调用教师自己的特征行为"授课",在"学生"的"做事"行为中去调用学生自己的特征行为"做作业",所以,当调用"人"去"做事"的时候,如果这个人是教师,那他所做的事实际上就是"教书",如果这个人是学生,那他所做的事实际上就是"做作业".也就是说在这里"人"是多态的,在不同的形态时,特征行为是不一样的,这里的"人",同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是"授课"与"做作业".
完成上述的描述过程,其实就是多态机制的体现.
多态,就是站在抽象的层面上去实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为.
反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton)。单例模式(Singleton)这个模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录数据库连接都需要这样的单线程操作。这样做就是为了节省内存空间,保证我们所访问到的都是同一个对象。使用反射机制的步骤:u导入java.lang.relfect包u遵循三个步骤第一步是获得你想操作的类的java.lang.Class对象第二步是调用诸如getDeclaredMethods的方法第三步使用反射API来操作这些信息