JavaWeb-Servlet(三)Servlet的一些细节 小咪咪 2021-06-24 16:11 446阅读 0赞 ### 一、Servlet与线程安全 ### 因为一个类型的Servlet只有一个实例对象,那么就有可能会显示出一个servlet同时处理多个请求,那么servlet是否为线程安全的呢?答案是:“不是线程安全的”。这说明servlet的工作效率很高,但是也存在线程安全问题! 所以我们不应该在servlet中随便的创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。 所以我们尽可能的做到以下几点: * 不要在servlet中创建成员,创建局部变量即可。 * 可以创建无状态成员。 * 可以创建有状态的成员,但状态必须为只读的。 ### 二、让服务器在启动时就创建Servlet ### 默认情况下,服务器会在某个Servlet第一次收到请求时创建它。也可以在web.xml中对Servlet进行配置,是服务器启动时就创建Servlet。 在`<servlet>`标签中配置`<load-on-startup>`标签,里面的值是一个非负的整数,可以在多个servlet中都做这样的配置,这样都会在服务器启动的时候创建servlet。但是多个servlet都是在启动时创建,所以用这个值来决定它们之间的顺序,数值越小,越先启动。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70] ### 三、<url-pattern> ### `<url-pattern>`是`<servlet-mapping>`的子元素,用来指定Servlet的访问路径,即URL。它必须是以“/”开头。 ![在这里插入图片描述][20190519223310796.png] #### 1) #### 可以在`<servlet-mapping>`中给出多个`<url-pattern>`,例如: <servlet-mapping> <servlet-name>XXX</servlet-name> <url-pattern>/AServlet</url-pattern> <url-pattern>/BServlet</url-pattern> </servlet-mapping> 那么这说明一个servlet绑定了多个URL,这样无论访问/AServlet还是/BServlet,访问的都是同一个servlet。 #### 2) #### 还可以在`<url-pattern>`中使用通配符,所谓通配符就是星号“ \* ”,星号可以匹配任何的URL前缀或者后缀,使用通配符可以命名一个servlet绑定一组URL,例如: * `<url-pattern>/Servlet/*</url-pattern>`:/Servlet/a、/Servlet/b,都匹配/Servlet/\*; * `<url-pattern>*.do</url-pattern>`:/abc/def/ghi.do、/a.do,都匹配\*.do; * `<url-pattern>/*</url-pattern>`:匹配所有URL。 请注意,通配符要么为前缀,要么为后缀,不能出现在URL中间位置,也不能只有通配符。例如:`/*.do`就是错误的,因为星号出现在URL的中间位置上了。`*.*`也是不对的,因为一个URL中最多只能出现一个通配符。 注意,通配符是一种模糊匹配URL 的方式,如果存在更具体的<url-pattern>,那么访问路径会去匹配具体的<url-pattern>。 ### 四、web.xml文件的继承 ### 每个完整的JavaWeb应用中都需要有web.xml,但是我们不知道所有的web.xml文件都有一个共同的父文件,它在Tomcat的conf/web.xml路径。在这个文件里面的内容,相当于写在了每个项目的web.xml中。 * **DefaultServlet** 其中有两段: <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 我们可以看到,它的路径信息是“/”,它的优先级最低,也就是当一个请求没有任何servlet处理的时候,它就会处理,也就是显示404页面。 * **jspServlet** <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> 这个servlet会响应我们的请求,把动态资源转换成静态资源。然后响应给浏览器。 * **session的过期时间** <session-config> <session-timeout>30</session-timeout> </session-config> session的过期时间为30分钟。 * **mine-mapping** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70 1] 后面大段大段的mine-mapping是各种文件扩展名对应的mime类型。 -------------------- end. [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70]: /images/20210615/ff2b0b4aa79e443593f28df91396de4b.png [20190519223310796.png]: /images/20210615/ab1165081f5e43af8d78df86808e2f73.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70 1]: /images/20210615/d8a26a6066594612bd315d058165f6c2.png
还没有评论,来说两句吧...