Servlet注解,简化配置
-
分析web.xml文件
- 只是一个单标的CRUD,没有复杂的业务逻辑,很简单的功能。web.xml文件中就有如此多的配置信息。如果采用这种方式,对于一个大的项目来说,这样的话web.xml文件会非常庞大,有可能最终会达到几十兆。
- 在web.xml文件中进行servlet信息的配置,显然开发效率比较低,每一个都需要配置一下。
- 而且在web.xml文件中的配置是很少被修改的,所以这种配置信息能不能直接写到java类当中呢?可以的。
-
Servlet3.0版本之后,推出了各种Servlet基于注解式开发。优点是什么?
- 开发效率高,不需要编写大量的配置信息。直接在java类上使用注解进行标注。
- web.xml文件体积变小了。
-
并不是说注解有了之后,web.xml文件就不需要了:
- 有一些需要变化的信息,还是要配置到web.xml文件中。一般都是 注解+配置文件 的开发模式。
- 一些不会经常变化修改的配置建议使用注解。一些可能会被修改的建议写到配置文件中。
-
我们的第一个注解:
-
jakarta.servlet.annotation.WebServlet
-
在Servlet类上使用:@WebServlet,WebServlet注解中有哪些属性呢?
-
name属性:用来指定Servlet的名字。等同于:<servlet-name>
-
urlPatterns属性:用来指定Servlet的映射路径。可以指定多个字符串。<url-pattern>
-
loadOnStartUp属性:用来指定在服务器启动阶段是否加载该Servlet。等同于:<load-on-startup>
-
value属性:当注解的属性名是value的时候,使用注解的时候,value属性名是可以省略的。
-
initParams属性:初始化参数。等同于:<init-param>
-
注意:不是必须将所有属性都写上,只需要提供需要的。(需要什么用什么。)
-
注意:属性是一个数组,如果数组中只有一个元素,使用该注解的时候,属性值的大括号可以省略。
-
@WebServlet源码
package jakarta.servlet.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet { /** * @return name of the Servlet * name属性 */ String name() default ""; /** * A convenience method, to allow extremely simple annotation of a class. * value属性 * * @return array of URL patterns * @see #urlPatterns() */ String[] value() default {}; /** * @return array of URL patterns to which this Filter applies * urlPatterns属性 */ String[] urlPatterns() default {}; /** * @return load on startup ordering hint * loadOnStartUp属性 */ int loadOnStartup() default -1; /** * @return array of initialization params for this Servlet */ WebInitParam[] initParams() default {}; /** * @return asynchronous operation supported by this Servlet */ boolean asyncSupported() default false; /** * @return small icon for this Servlet, if present */ String smallIcon() default ""; /** * @return large icon for this Servlet, if present */ String largeIcon() default ""; /** * @return description of this Servlet, if present */ String description() default ""; /** * @return display name of this Servlet, if present */ String displayName() default ""; }
-
-
-
注解对象的使用格式:
- @注解名称(属性名=属性值, 属性名=属性值, 属性名=属性值…)
package com.javaweb.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet(name = "hello",
urlPatterns = {"/hello1","/hello2"},
loadOnStartup = 1,
initParams = {@WebInitParam(name = "username", value = "root"), @WebInitParam(name = "password", value = "root")})
// 如果注解的属性是value,属性名可以省略
//@WebServlet("/hello1")
public class HelloServlet extends HttpServlet {
// 无参数构造方法
public HelloServlet() {
System.out.println("无参数构造方法执行,HelloServlet加载完成");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取Servlet name
String servletName = getServletName();
out.print("Servlet name = " + servletName + "<br>");
// 获取servlet path
String servletPath = request.getServletPath();
out.print("servlet path = " + servletPath + "<br>");
// 获取初始化参数
Enumeration<String> initParameterNames = getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();
String initParameter = getInitParameter(name);
out.print(name + "=" + initParameter + "<br>");
}
}
}