\
1.1 Servlet概述
Servlet是一个web容器,我们通常用的servlet是httpservlet,而httpservlet又是继承于genericservlet,而genericservlet又实现了servlet接口。
servlet的生命周期是:先进行实例化,然后是初始化,然后是提高服务,然后销毁,最后不可用,在这五个生命周期,其中,初始化是调用的init方法,这个方法只有一个,而提高服务的时候调用的是service方法,而我们具体在我们所写的这个方法中,因为我们继承了httpservlet,其实就是对应了doGet(),doPost(),这种方法,然后据我了解,servlet是单例的。非线程安全的,我们通常有一下几种方案来解决:
第一种,继承SingleThreadModel但是这样每次都会创建一个新的servlet实例,但这样消耗服务器的内存,降低了性能,并且这个接口现在已经过时了,不推荐使用。
第二种:我们尽量避免使用全局变量,就我个人而言,我比较喜欢使用这种方法。
第三种,我们可以通过使用ThreadLocal,内部结构是一个Map结构,用当前线程作为key,他会创建多个副本。get,set方。
第四种,我们当然还可以来加锁,进行解决线程问题。
而且我还知道,向我们这种常用的MVC框架,struts1,spring这些MVC框架,都是基于servlet发展而来的,就比如struts1 的核心总控制器是ActionServlet,而springMVC的前端总控制器是dispatchServlet,在项目我们曾经用serlet来生成图片验证码的,防止用户进行暴力破解
(别人问了,再回答)
servlet的配置文件 web.xml
ImageCodeServlet org.leopard.code.ImageCodeServlet
ImageCodeServlet
/d
描述:
我在web.xml中,我首先需要写一个servlet标签,servlet标签中有两个子标签,一个叫servlet-name,这个name可以随便起,但是要保证唯一性,除此之外,在这个servlet-name下有一个servlet-class,这个servlet-class对应的就是我后台提高服务的servlet,除此之外还有一个servlet-mapping,这个里边首先有一个servl-name。,这个servl-name首先要保证和上边的servlet-name保持一致,除此之外还有一个url-pattern,这是一个虚拟路径,是用来发送请求的url地址。
1.2 九大隐式对象
输入/输出对象: request(也属于作用域通信对象) response out
作用域通信对象: session application pageContext
Servlet 对象: page config
错误对象: exception
1.3 page和pageContext的区别
page是servlet对象;使用this关键字,它的作用范围是在同一页面。
pageContext是作用域通信对象;通常使用setAttribute()和getAttribute()来设置和获取存放对象的值。
1.4 GET和POST的区别
1、 get是从服务器上获取数据,post是向服务器传送数据。
2、 get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
3、 get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
4、 在进行文件上传时只能使用post而不能是get。
1.5 转发与重定向的区别
1、 从数据共享上区别:forword是一个请求的延续,可以共享request作用域的数据。redirect开启一个新的请求,不可以共享request作用域的数据,但可以通过URL方式进行数据发送。
2、 从地址栏上区别:forword转发地址栏不发生变化,redirect转发地址栏发生变化。
3、 从性能上区别:forword性能要高于redirect。
4、 常见使用上的区别:因为上性能上有区别,在本系统中请求跳转建议使用forword,如果是跨域访问,建议使用redirect。