0
点赞
收藏
分享

微信扫一扫

servlet中的注解式开发

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]);
            }
        }
    }
}

举报

相关推荐

0 条评论