栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet执行原理(注解底层原理配置)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet执行原理(注解底层原理配置)

文章目录
  • 前言
  • 一、Servlet是什么?
  • 二、Servlet执行原理.
  • 三、Servlet的生命周期.
  • 四.Servlet注解配置3.0
    • 4.2.1@WebServlet底层原理介绍
  • 五.Servlet的体系结构
  • 六.response
    • 6.1.1 request基本原理:
    • 6.2.1 要点:
      • 6.2.2 获取请求行数据:
      • 6.2.3 获取请求头数据:
  • 七.通用请求方式


前言

提示:以下是本篇文章正文内容,下面案例可供参考.我不是创造知识的人,只是知识的搬运工…希望大家能够通过本篇文章了解前辈们的设计造诣.

一、Servlet是什么?

Servlet是一个java接口,定义了java类被tomcat识别的规则.

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和
HTTP 服务器上的数据库或应用程序之间的中间层。
使用Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
–菜鸟教程

二、Servlet执行原理.

执行原理∶
1,当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径
2.查找web.xml文件,是否有对应的标签体内容。
3.如果有,则在找到对应的全类名
4. tomcat会将字节码文件加载进内存(Class.forName())
并且创建其对象newInstance()
5.调用其方法–service

三、Servlet的生命周期.
//init 方法只调用一次,创建 Servlet 时被调用.即Servlet是单例的,只存在一个对象。
//多线程访问,共享对象可能存在安全问题.
//解决:尽量不要在servlet中定义成员变量.即使定义了成员变量,也不要修改值.
public void init() throws ServletException {
  // 初始化代码...
  system.out.print("init.....");
  
}

//Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
public void service(ServletRequest request, ServletResponse response) 
      throws ServletException, IOException{
      system.out.print("service.....");
}


//destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用(服务器正常被关闭).
public void destroy() {
    // 终止化代码...
 	}

四.Servlet注解配置3.0

好处:不需要web.xml

1.创建JavaEE项目,选择servlet的版本3.0以上,可以不创建web.xml
2.定义一个类,实现servlet接口
3.重写方法
4.在类上使用@webservlet注解,进行配置

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

4.2.1@WebServlet底层原理介绍

原理:
  首先,浏览器发出请求后,经过过滤器。过滤器执行初始init方法。工具类扫描配置文件中指定的包。扫描工具把指定包下的所有类的字节码文件存放到Set集合中,然后遍历set集合,如果set集合中的元素(包中的各个类的字节码文件)用的是WebServlet.class这个注解类型编写开发的,那么就获取当前set元素的在注解中定义的value值(URI地址),这个value值在注解接口WebServlet中定义的是Servlet的访问URI。因此过滤器的初始化init()方法就把"指定包下的所有使用WebServlet注解开发的普通类的字节码文件"作为值value,使用注解中的String value()定义了Servlet访问的URI 作为键key, 存放到 Map> classMap 这个Map集合中。map集合存放到全局对象ServeltContext中。然后在过滤器的doFilter方法中,在ServeltContext中获取到这个map。过滤器如果执行了,那么肯定是用户发出request请求了。先通过request对象获取用户的URI,在map集合中找到此使用注解的java普通类,反射创建此java类的对象。如果没有指定调用哪个方法,那么就根据用户的请求方式get还是post,调用相对应的方法。如果指定了方法,先根据URI在map集合中找到对应的字节码文件,创建java普通类的对象。根据地址中"!"后面的方法,反射执行java普通类对象的方法。当然,有了字节码文件,就能获取到java类中的所有方法,当然也能获取到注解中定义的参数值,从而作为参数执行java类的init方法。

  原理出处:https://www.cnblogs.com/huangdabing/p/9219444.html

@WebServlet("资源路径")

				@Target({ElementType.TYPE})
				@Retention(RetentionPolicy.RUNTIME)
				@documented
				public @interface WebServlet {
				    String name() default "";//指定servlet的name属性,相当于,没有写则为全类名
				
				    String[] value() default {};//代表urlPatterns()属性配置,等价于urlPatterns,二者不能共存
				
				    String[] urlPatterns() default {};//指定一组servlet的url,相当于
				
				    int loadOnStartup() default -1;//指定servlet的加载顺序,相当于
				
				    WebInitParam[] initParams() default {};//相当于标签.
				
				    boolean asyncSupported() default false;//servlet是否开启异步操作,相当于标签.
				
				    String smallIcon() default "";
				
				    String largeIcon() default "";
				
				    String description() default "";//servlet的描述信息,相当于标签.
				
				    String displayName() default "";//servlet的显示名,相当于标签.
				}
五.Servlet的体系结构

六.response 6.1.1 request基本原理:

1.tomcat服务器会根据请求url中的资源路径,创建对应的Servlet实现类的对象。
2.tomcat服务器,会创建request和response对象,request对象中封装请求消息数据。
3.tomcat将request和response两个对象传递给service方法,并且调用service方法。
4.程序员可以通过request对象获取请求消息数据,通过通过response对象设置响应消息数据.
5.服务器在给浏览器做出响应之前,会从response对象中拿程序员设置的响应消息数据。

6.2.1 要点:

1.request和response对象是由服务器创建的。我们来使用它们.
2.request对象是来获取请求消息,response对象是来设置响应消息

6.2.2 获取请求行数据:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取请求方式,GET
        String method = request.getMethod();
        System.out.println(method);
        //2.(*)获取虚拟目录: servlet01
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        //3.获取Servlet路径
        String servletPath = request.getServletPath();
        System.out.println(servletPath);
        //4.获取get方法请求参数: null
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //5.(*)获取请求URI:servlet01/Servlet
        String requestURI = request.getRequestURI();
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURI);
        System.out.println(requestURL);
        //6.获取协议版本:HTTP/1.1
        String protocol = request.getProtocol();
        System.out.println(protocol);
        //7.获取客户机ip
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

6.2.3 获取请求头数据:

   String referer = request.getHeader("referer");
        System.out.println(referer);

        //2.防盗链
        if( referer!= null){
            if(referer.contains("/Servlet")){
                System.out.println("通过");
            }else System.out.println("禁止");
        }
七.通用请求方式
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;


@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.根据参数名获取参数值
        String username = request.getParameter("username");
        //2.根据参数名获取参数值的数组
        String[] hobbies = request.getParameterValues("hobby");
        for(String hobby:hobbies){
            System.out.println(hobby);
        };
        //3.获取所有请求的参数名称
        Enumeration parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.println(s);
        }
        //4.获取所有参数的map集合
        Map parameterMap = request.getParameterMap();
        Set keySet = parameterMap.keySet();
        for (String name:keySet){
            String[] values = parameterMap.get(name);
            System.out.println(name);
            for (String value:values){
                System.out.println(value);
            }
            System.out.println("");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

}



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号