sverletb笔记

Servlet笔记

什么时Servlet

  1. Servlet 是运行在服务器端的小程序
  2. Servlet在java中就是一个接口,定义了浏览器访问tomcat的规则
  3. Servlet : Server appleet

快速入门

  1. 创建一个JavaEE项目

  2. 定义一个类,且该类必须实现Servlet接口中的抽象方法

    public interface Servlet {
        void init(ServletConfig var1) throws ServletException;
    
        ServletConfig getServletConfig();
    
        void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
        String getServletInfo();
    
        void destroy();
    }
    
    
  3. 配置Servlet

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYfAYmPj-1638320462743)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129093704451.png)]

在浏览器中输入

http://localhost:8080/servlet_01/test1

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello,servlet");
    }

控制台

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ITTcqy0t-1638320462747)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129095057887.png)]

Serverlet执行原理

1.浏览器解析

http://localhost:8080/servlet_01/test1

localhost: 本机

8080端口号:tomcat

servlet_01:项目名称

test1:xml文件中的/test1

2.xml映射

执行如下4步
1浏览器通过test1找到该路径
2通过该路径找到名字为test1的servlet程序
3通过该名字找到对应的全类路径
4通过这个全类路径,在tomcat服务器中,使用Class.forName(com.shun.web.ServletTest1)
造出对应的对象,再调用service.invok(),执行service方法中的sout语句



<servlet>
        <servlet-name>test1</servlet-name>//3
        <servlet-class>com.shun.web.ServletTest1</servlet-class>//4
    </servlet>



    <servlet-mapping>
        <servlet-name>test1</servlet-name>//2
        <url-pattern>/test1</url-pattern>//1
    </servlet-mapping>

Servlet的生命周期

  1. 在类被加载的时候调用init方法只会执行一次,
  2. 在浏览器解析的时候执行service方法,可以被执行多次
  3. 在关闭服务器的时候调用destroy方法,也是只会执行一次(正常关闭),

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sas0VQ1z-1638320462751)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129105259356.png)]

public class ServletTest2 implements Servlet {

    /**
     * 再Servlet被创建的时候执行,只执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init方法执行了");
    }

    /**
     * 获得ServletConfig对象
     * ServletConfig servlet的配置对象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服务的方法,
     * 每一次Servlet被访问时,执行,可以执行多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service 方法执行了");
    }

    /**
     * 获取servlet的信息,版本
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * Servlet的销毁方法,该方法在服务器正常关闭时执行一次
     * 也是只执行一次
     */
    @Override
    public void destroy() {
        System.out.println("destroy方法执行了");

    }

可以通过xml配置servletd的创建时机

 <servlet>
        <servlet-name>test2</servlet-name>
        <servlet-class>com.shun.web.ServletTest2</servlet-class>
       <!--指定Servlet的创建时机
            1.在第一次被访问时创建,当值为负数的时候(也是默认值)
            <load-on-startup>-1</load-on-startup>
            2在服务器启动时候被创建:设置其中的值大于等于0就行了
            <load-on-startup>-1</load-on-startup>

       -->
        <load-on-startup>1</load-on-startup>
    </servlet>

特别说明:一个servlet在内存中只存在一个对象,是单例的多个用户访问时会存在线程安全,所以尽量不要在Servlet中定义成员变量,在方法中定义局部变量就行了,就算定义了也不要定义,或修改

使用注解配置

  1. jdk必须大于jdk6

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKfibYGL-1638320462753)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129111328353.png)]

  2. 实现接口

    @WebServlet()
    public class ServletTest1 implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("注解开发");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    点开@WebServlet()注解

    @Target({ElementType.TYPE})//表明该注解只能用于描述类、接口(包括注解类型) 或enum声明
    @Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
    @Documented//生成文档时被保留
    public @interface WebServlet {
        String name() default "";//等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
    
        String[] value() default {};//该属性等价于 urlPatterns 属性。两个属性不能同时使用。
    
        String[] urlPatterns() default {};//指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。
    
        int loadOnStartup() default -1;//指定 Servlet 的加载顺序,等价于 <load-on-startup>标签。
    
        WebInitParam[] initParams() default {};//指定一组 Servlet 初始化参数,等价于<init-param>标签。
    
        boolean asyncSupported() default false;//声明 Servlet 是否支持异步操作模式,等价于<async-supported> 标签
    
        String smallIcon() default "";
    
        String largeIcon() default "";
    
        String description() default "";
    
        String displayName() default "";//该 Servlet 的显示名,通常配合工具使用,等价于 <display-name>标签
    }
    
    
    1. 配置urlPatterns的路径,再通过浏览器http://localhost:8080/servlet_anno/test1刷新,即可完成注解配置,当然也可以使用默认的value,即 @WebServlet("/test1")

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNsgy3Qm-1638320462756)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129113153337.png)]

继承体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G99ndDTJ-1638320462757)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129142757392.png)]

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final long serialVersionUID = 1L;
    private transient ServletConfig config;

    public GenericServlet() {
    }

    public void destroy() {
    }

    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }

    public Enumeration<String> getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }

    public ServletConfig getServletConfig() {
        return this.config;
    }

    public ServletContext getServletContext() {
        return this.getServletConfig().getServletContext();
    }

    public String getServletInfo() {
        return "";
    }

    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }

    public void log(String msg) {
        this.getServletContext().log(this.getServletName() + ": " + msg);
    }

    public void log(String message, Throwable t) {
        this.getServletContext().log(this.getServletName() + ": " + message, t);
    }
//在继承该类的时候只需要重写service方法
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    public String getServletName() {
        return this.config.getServletName();
    }
}

在HttpServlet类中:对http协议的一种封装

  1. 该类继承了HttpServlet

  2. 腹泻了doGet/doPost方法

    @WebServlet("/test3")
    public class ServletTest3 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("doget");
        }
    
        //如果传入的是doPost请求则调用不同的方法
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("dopost");
        }
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avIEH5zk-1638320462758)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129144540267.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqmkSeOY-1638320462759)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129144633653.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e5zswYpt-1638320462760)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129144802306.png)]

Servlet相关配置

urlpartten属性配置规则

  1. 一个Servlet可以定义多个访问路径

    @WebServlet(urlPatterns = {"/test4","/test44","/aaa"})
    public class ServletTest4 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            System.out.println("test4执行了");
        }
    }
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPeLTX0F-1638320462761)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129145446754.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CfwxSmO-1638320462762)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129145541293.png)]

  2. 路径定义规则

    1

    @WebServlet("/user/test4")
    public class ServletTest4 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            System.out.println("test4执行了");
        }
    }
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFol33nH-1638320462763)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129145949027.png)]

    2使用/* 后面写什么都可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tiOdhjpA-1638320462764)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129150241608.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值