2.原文连接2
目录
一般在 web 工程中都会用到 web.xml 来配置 Servlet、Filter、Listener 欢迎页面等,可以方便的开发web工程。需要知道的是 web.xml 并不是必须的,一个web 工程可以没有 web.xml 文件,只不过网站的功能复杂起来后,web.xml 有非常大用处,因此在 web 工程中创建一个 web.xml 还是非常有必要的。
在 web.xml 中,使用的 web-app_4_0.xsd 文件定义的规则,需要指定这个文件的位置。
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
</web-app>
关于命名空间这部分内容,就不在这里详细讲了,需要了解的可以看这篇博文XML 中的 xmlns、xmlns:xsi、xsi:schemaLocation
欢迎页面的配置不是很重要,了解即可。
<project...>
<welcome-file-list>
<welcome-file>wecome1.jsp</welcome-file>
<welcome-file>wecome2.jsp</welcome-file>
</welcome-file-list>
</project>
上面代码中就配置了两个欢迎页面 wecome1.jsp 和 wecome2.jsp,显示时按照配置顺序显示,如果能找到 wecome1.jsp 文件就显示该文件,如果找不到就找第二个,依次类推。
欢迎页面是用于访问 web 工程时,只给了根名,没有给出具体的页面,这时就回去访问配置的欢迎页面,如果没有配置欢迎页面,不同的应用服务器可能会有不同的行为。对于 Tomcat 来说,会默认先查找 index.html 文件,如果找到了,就将其返回给浏览器;如果没有找到,就继续查找 index.jsp 文件,如果都没有找到,那么 Tomcat 就会显示 The requested resource is not available 的页面。
欢迎页面只是在没有给出具体的访问页面时会被用到,如果指定了具体页面,只要访问的路径正确,是可以正常访问的。
这是我们常用的一个配置,主要使用的标签是<servlet></servlet>为Servlet 命名和<servlet-mapping></servlet-mapping>为 Servlet 定制 URL。
<project..>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>D20210220.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</project>
在 <servlet> 标签中, <servlet-name> 中设置的是为 Servlet 注册的名字,要保证该名字在 web.xml 文件中是唯一的,一般直接使用类名即可,<servlet-class> 中设置的是需要配置的 Servlet 的全类名。
在 <servlet-mapping> 中, <servlet-name> 中的名字,需要和 <servlet> 中的名字一致,<url-pattern> 为这个 Servlet 映射一个对外访问路径。
servlet 和 url-pattern 之间的关系是 一对多的关系。
在学习了 Servlet 的配置之后,学习 Filter 的配置就很简单了。
Filter 的配置和 Servlet 的配置很相似,只是将 servlet 换成 filter 而已。
<filter>
<filter-name>Filter1</filter-name>
<filter-class>D2020128.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/TestServlet</url-pattern>
</filter-mapping>
Filter 的配置中和 Servlet 配置差别较大的地方在于 url-pattern,Servlet 的 url-pattern 中配置的路径是访问 Servlet 的路径,而 Filter 的 url-pattern 中配置的路径是访问已经存在的网络资源,如静态页面、jsp、servlet等。
filter 和 url-pattern 之间的关系是 多对多的关系。即,一个 filter 可以有多个 url-pattern(使用多个 URL 地址,都会访问同一个 FIlter),多个 filter 可以对应一个 url-pattern(多个 filter 会根据 web.xml 中配置的顺序组成 filter 链)。
因此,Filter 的 url-pattern 有一种配置是<url-pattern>/*</url-pattern>,表示所有外部访问都需要先经过该过滤器。
Filter 应用场景:防盗链、编码过滤器
Listener 不需要处理外界访问,所以它的配置不需要定制 URL,因此只需要配置<listener>
<listener>
<listener-class>Listener的全类名<listener-class>
</listener>
在 Servlet 3.0 版本以上,可以使用@WebServlet注解代替 web.xml 进行配置,@WebServlet的配置是一套独立的用法。
一般用@WebServlet( "/TestServlet1")即可,其中 TestServlet1 的位置可以自己起一个名字,但是需要注意不能在项目中有重名。
下面展示一下@WebServlet注解的复杂一些的用法,不做详解
@WebServlet(urlPatterns = "/TestServlet1",initParams = {
@WebInitParam(name = "name1",value="value1"),
@WebInitParam(name = "name2",value="value2")
}, name = "Hello")
在 Filter 类文件的开头处写上 @WebFilter("/TestFilter")
<context-param>的作用和用法:
1.<context-param>配置是是一组键值对,比如:
<context-param>
<param-name>home-page</param-name>
<param-value>home.jsp</param-value>
</context-param>
param-name是键,相当于就是参数名,param-value是值,相当于参数值
2.当服务器启动时,服务器会读取web.xml配置,当读到<listener></listener>和<context-param></context-param>这两个节点的时候,容器会将这两个节点set到ServletContext(上下文对象)中,这样我们在程序中就能通过这个上下文对象去取得我们这个配置值。
具体代码实现:
String sHomePage = getServletContext().getInitParameter("home-page");
通过上面这句代码,我们就可以取得web.xml中配置的home.jsp这个值。
说白了,他就相当于设定了一个固定值,我们可以在程序中去使用它。就这么个作用。
注:我看到很多文章都是把它和监听一起说的,写说这个配置在监听中怎么用。我要说的他并不是为了监听去设定的。程序中的所有servlet可以利用这个值,我在这里强调一下这一点,希望大家不要被误导
<context-param>配置和<init-param>的区别:
<servlet>
<servlet-name>ServletInit</servlet-name>
<servlet-class>com.sunrain.datalk.wserver.util.servlet.ServletInit</servlet-class>
<init-param>
<param-name>home-page</param-name>
<param-value>home.jsp</param-value>
</init-param>
</servlet>
1.我们可以看到<init-param>是放在一个servlet内的,所以这个参数是只针对某一个servlet而言的
所以他们的区别就有点像全局变量和和局部变量的<context-param>是针对整个项目,所有的servlet都可以取得使用,<init-param>只能是在那个servlet下面
配置,就在那个servlet里面调用