首先,我们需要了解到的是在Servlet2.x版本中,配置依然是通过web.xml的形式进行配置的,升级到Servlet3.x后,才可以依赖注解式方式进行配置。
1、通过Web.xml文件进行配置
代码格式:
<!--注册Servlet-->
<servlet>
<!--自定义,一般为类名-->
<servlet-name></servlet-name>
<!--servlet的类全名:package.类名-->
<servlet-class></servlet-class>
</servlet>
<!--Servlet的请求路径-->
<!--给Servlet提供(映射)一个可供客户端访问的URI-->
<servlet-mapping>
<!--必须和servlet中的name相同-->
<servlet-name></servlet-name>
<!-- servlet的映射路径(访问serclet的名称) -->
<url-pattern></url-pattern>
</servlet-mapping>
代码展示:
访问过程:
①servlet通过浏览器地址栏输入的路径与servlet-mapping标签中的url-pattern的标签值进行匹配。
②通过url-pattern这个映射值找到servlet-mapping标签中的servlet-name的值与servlet标签中的servlet-name进行匹配。
③通过mapping映射关系找到真正的servlet中的servlet-name以后,找到servlet标签中的servlet-class标签中对应的servlet类的src文件夹下的全路径。
④从⽽调⽤并执⾏相应的servlet类。
注意:
- servlet-mapping标签中的servlet-name的值与servlet标签中的servlet-name必须相同。
- servlet-class是全限定名。
- url-pattern是网页要提交的对应地址。
2、使用@WebServlet注解进行配置
注解的话比较简单,只用写出注解,填写name和urlPatterns就好了,name是类名,urlPatterns是网页要提交的对应地址,但是我一般只写urlPatterns。
代码展示:
import javax.servlet.annotation.WebServlet;
@WebServlet("/demo01")
public class demo01 extends HttpServlet {}
下面是一些@WebServlet注解属性:
注意:
- 不要再Web.xml文件的根元素()中指定metadata-complete=“true”;默认metadata-complete=“true"的话就将该属性修改为"false”。
- @WebServlet中value和urlPatterns属性都可以用来表示Servlet的访问路径。value和urlPatterns都是数组形式,表示我们可以把一个Servlet映射到多个访问路径,但是value和urlPatterns不能同时使用。如果同时使用了value和urlPatterns,Servlet无法访问到。
urlPattern配置拓展
Servlet类编写好后,要想被访问到,就需要配置其访问路径(urlPattern)
- 一个Servlet,可以配置多个URLPattern
package com.aDiao.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/demo04","/aDiao04"})
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo04 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
上附代码中"/demo04","/aDiao04"这两个地址都能访问到。
- urlPattern配置规则
- 精确匹配
package com.aDiao.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user/demo05")
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo05 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 目录匹配
package com.aDiao.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user/*")
public class ServletDemo06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo06 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
思考:
(1)访问路径“/user”是否能访问ServletDemo06的doGet方法?
(2)访问路径“/user/a/b”是否能访问ServletDemo06的doGet方法?
(3)访问路径“/user/demo05”是否能访问ServletDemo06的doGet方法?
答:能,能,不能(访问的是demo05中的doGet方法)进而我们可以得到的结论是/user/*中的/*代表的是零或多个层级访问目录同时精确匹配优先级要高于目录匹配。
- 扩展名匹配
package com.aDiao.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("*.demo07")
public class ServletDemo07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo07 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注意:
(1) 如果路径配置的不是扩展名,那么在路径的前面就必须要加/否则会报错;
(2)如果路径配置的是*.do,那么在*.do的前面不能加/,否则会报错。
- 任意匹配
package com.aDiao.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
//@WebServlet("/*")
public class ServletDemo08 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo08 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注意:/ 和 /* 的区别:
(1)当我们的项目中的Servlet配置了 “ / ”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet;
(2)当我们的项目中配置了“ /* ”,意味着匹配任意访问路径;
(3)DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问。
3、下面我们来对比一下二者的优缺点
- 通过Web.xml文件进行配置
优点:配置信息全部卸载Web.xml文件中,可以集中管理各servlet类路径的映射路径,方便修改和查找。
缺点:对“懒癌患者”不太友好,代码量大且繁琐,可读性不强。
- 使用@WebServlet注解进行配置
优点:代码量少,直接在Servlet类中使用。每个类只关注自身的业务逻辑,彼此之间互不干扰。
缺点:一个类配置一个,如果大量使用servlet注解,当servlet类文件数量过多时,不方便查找和修改。文章来源:https://www.toymoban.com/news/detail-736700.html
如有错误,请指正。文章来源地址https://www.toymoban.com/news/detail-736700.html
到了这里,关于【JavaWeb】关于Servlet的两种配置Web.xml文件配置或使用@WebServlet注解及urlPattern配置规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!