Servlet细节

修改发布到tomcat/webapps下面的应用名称:Web Project Settings。

修改或删掉Servlet,web.xml里面相关的配置不会与之同步。

Servlet的实现类:

1.GenericServlet:覆写感兴趣的方法,一般情况下,只需要覆写service方法。

2.在web开发中,由于使用http协议,程序员在编写servlet时,一般都是继承GenericServlet的子类HttpServlet。

在HttpServlet中覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET方式,则调用doGet方法 ,如为post方式,则调用doPost方法。因此,在开发中,我们完全没有必要覆写service方法,直接根据请求方式覆写对应的doGet和doPost方法即可。

3.HttpServlet在调用doGet和doPost方法之前(service方法中),会将ServletRequest和ServletResponse对象强转成HttpServletRequest和HttpServletResponse。

src目录下面各种类型的文件都会发布到WEB-INF目录下面的classes文件夹下面。

Servlet映射

url-pattern用于指定供外界访问的路径或资源名,"/"表示web应用

Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:① "*.扩展名" ② 以"/"开头并以"/*"结尾

such as:

<url-pattern>/itcast/*</url-pattern>

<url-pattern>*.do</url-pattern>

注意:

*.do 与 /*这两种方式不可同时使用

针对于满足多个条件的访问路径时,只会访问一个Servlet,此时会访问路径最相仿的那个,同时,/*的优先级要高于*.do

默认的Servlet映射

<url-pattern>/</url-pattern>

load-on-startup元素

servlet 元素中配置此元素,会在web应用加载时实例化并调用其init()方法,数字越小就越先完成初始化,当值小于0或者没有指定时,表示容器在该servlet被选择时才会去加载。

tomcat\conf\web.xml

该服务器下所有的web应用中的web.xml都继承自此文件

http://localhost:8080/day05/a.html

上面的url访问的url在web.xml文件中并没有配置

此时会去访问缺省的Servlet,在tomcat\conf\web.xml文件中配置了一个缺省的DefaultServlet,它会帮我们去web应用下读取a.html文件,并打给浏览器,如果没有发送404页面,也就是说通过IE访问服务器访问的都是Servlet。

Servlet 线程安全问题

方法的局部变量不会有线程安全问题!

Servlet 创建之后驻留在内存中 所以会出现线程安全问题!

同步的解决方案:对方法的执行过程进行加锁 synchronized(this) {};

实现接口的解决方案:实现 SingleThreadModel 接口的 Servlet ,服务器会做判断,当有请求过来,如果 Servlet 对象忙,服务器会再创建一个 Servlet 对象为用户提供服务,如果 Servlet 闲置,就直接提供服务,这样的方式实际上是回避了线程安全问题,单线程访问Servlet,这样的方式不可取。

原文地址:https://www.cnblogs.com/Knuth/p/2471675.html