1. 分析oa项目中的web.xml文件 33
- 现在只是一个单标的CRUD,没有复杂的业务逻辑,很简单的一丢丢功能。web.xml文件中就有如此多的配置信息。如果采用这种方式,对于一个大的项目来说,这样的话web.xml文件会非常庞大,有可能最终会达到几十兆。
- 在web.xml文件中进行servlet信息的配置,显然开发效率比较低,每一个都需要配置一下。
- 而且在web.xml文件中的配置是很少被修改的,所以这种配置信息能不能直接写到java类当中呢?可以的。
2. Servlet3.0版本之后,推出了各种Servlet基于注解式开发。优点是什么? 33
- 开发效率高,不需要编写大量的配置信息。直接在java类上使用注解进行标注。
- web.xml文件体积变小了。
- 并不是说注解有了之后,web.xml文件就不需要了:
- 有一些需要变化的信息,还是要配置到web.xml文件中。一般都是 注解+配置文件 的开发模式。
- 一些不会经常变化修改的配置建议使用注解。一些可能会被修改的建议写到配置文件中。
- 我们的第一个注解:
jakarta.servlet.annotation.WebServlet
代码在com.bjpowernode.javaweb.servlet
HelloServlet
package com.bjpowernode.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 javax.jws.WebParam;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
//servlet中的注解式开发 33
//这是servlet中的注解
@WebServlet(name = "Hello",urlPatterns = {"/hello1","/hello2","/hello3"}
//,loadOnStartup = 1
,initParams
= {@WebInitParam(name="username",value="root"),@WebInitParam(name="password",value="lzl")})
public class HelloServlet extends HttpServlet {
//无参构造方法
public HelloServlet(){
System.out.println("无参构造方法执行");
}
@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+"
");//servlet name =Hello
//获取Servlet path
String servletPath = request.getServletPath();
out.print("servlet path ="+servletPath+"
");//servlet path =/hello1
//获取初始化参数
Enumeration names = getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String values = getInitParameter(name);
out.print(name+"="+values+"
");
//输出结果
//password=lzl
//username=root
}
}
}
2.1 在Servlet类上使用:@WebServlet,WebServlet注解中有哪些属性呢?33
- value属性:当注解的属性名是value的时候,使用注解的时候,value属性名是可以省略的。
- 注意:不是必须将所有属性都写上,只需要提供需要的。(需要什么用什么。)
- 注意:属性是一个数组,如果数组中只有一个元素,使用该注解的时候,属性值的大括号可以省略。
com.bjpowernode.javaweb.servlet
WelcomeServlet
package com.bjpowernode.javaweb.servlet;
import jakarta.servlet.ServletException;
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;
//@WebServlet(urlPatterns = {"/welcome1", "/welcome2"}) 33
// 注意:当注解的属性是一个数组,并且数组中只有一个元素,大括号可以省略。
//@WebServlet(urlPatterns = "/welcome")
// 这个value属性和urlPatterns属性一致,都是用来指定Servlet的映射路径的。
//@WebServlet(value = {"/welcome1", "/welcome2"})
// 如果注解的属性名是value的话,属性名也是可以省略的。
//@WebServlet(value = "/welcome1")
@WebServlet({"/wel", "/abc", "/def"})
public class WelcomeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("欢迎学习Servlet。");
}
}
2.2 注解对象的使用格式: 33
- @注解名称(属性名=属性值, 属性名=属性值, 属性名=属性值....)
2.3 使用反射机制将类上面的注解进行解析 34
代码在com.bjpowernode.javaweb.servlet
ReflectAnnotation
package com.bjpowernode.javaweb.servlet;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import java.lang.annotation.Annotation;
//使用反射机制将类上面的注解进行解析 34
public class ReflectAnnotation{
public static void main(String[] args) throws ClassNotFoundException {
//使用反射机制将类上面的注解进行解析
//获取类Class对象
Class welcomeServletClass
= Class.forName("com.bjpowernode.javaweb.servlet.WelcomeServlet");
// 获取这个类上面的注解对象
// 先判断这个类上面有没有这个注解对象,如果有这个注解对象,就获取该注解对象。
// boolean annotationPresent
// = welcomeServletClass.isAnnotationPresent(WebServlet.class);
// System.out.println(annotationPresent);
if(welcomeServletClass.isAnnotationPresent(WebServlet.class)){//如果这个注解存在
//获取这个类上的注解对象
WebServlet webServletAnnotation
= welcomeServletClass.getAnnotation(WebServlet.class);
//获取这个注解上的value属性值
String[] value = webServletAnnotation.value();
for (int i = 0; i < value.length; i++) {
System.out.println(value[i]);
}
}
}
}