Javaweb-servlet

一、servlet入门

1.Servlet介绍

(1)什么是Servlet

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

(2)Servlet的使用方法

Servlet技术的核心是Servlet接口,定义了Servlet与Servlet容器之间的契约,Servlet容器将Servlet类载入内存,生成Servlet实例并调用它具体的方法,所以它是所有Servlet类必须直接或者间接实现的一个接口。

(3)Servlet接口的继承结构

  • Servlet接口:只负责定义Servlet程序的访问规范;

  • GenericServlet抽象类:实现了Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用,并提供了一些ServletConfig的使用方法;

  • HttpServlet抽象类:实现了service方法,并实现了请求分发处理;

​ 2.Servlet快速入门

(1)创建javaweb项目

创建maven工程

添加webapp目录

a.右击项目,选择Add Frameworks Support

​ b.选择Web Application,再点击OK

()c.将web目录拖拽到main目录下,并改名为webapp

  • webapp:静态资源比如 html css js可以定义在web下面

  • WEB-INF:里面的资源不能直接被外界访问 web.xml 是web项目的核心配置文件

  • index.jsp:web项目的访问首页,在默认情况我们访问的首页就是index.jsp

(2) 添加依赖

  • 在pom.xml中添加依赖
java 复制代码
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>

(3)创建servlet实例

java 复制代码
package com.by.servlet;

import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse servletResponse) 
        									throws ServletException, IOException {
        servletResponse.setContentType("text/html;charset=utf-8");
        servletResponse.getWriter().write("<h1>hello<h1>");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

(4)配置servlet

  • web.xml中配置
java 复制代码
<!--
   配置Servlet
   servlet-name:servlet的名称
   servlet-class:servlet的全类名
   url-pattern: 访问servlet的url
 -->
<servlet>
    <servlet-name>hello</servlet-name>
    <!--     servlet-name要和servlet-mapping所对应,映射的关系-->
    <servlet-class>com.by.servlet.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

(5)设置打包方式

  • 修改pom.xml
java 复制代码
<!--打包方式-->
<packaging>war</packaging>

(6)部署web项目

1.点击"Edit Configurations"

2.点击"+"

3.点击Tomcat Server中的Local

4.配置Tomcat路径

5.部署web项目

6.启动tomcat

7.查看是否部署成功

(7)测试

浏览器访问:http://localhost:8080/01_servlet_HelloWorld_war/demo

二、servlet的生命周期

1.什么是servlet的生命周期

Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法,什么时候销毁。

对象的生命周期:

java 复制代码
Student student = new Student(); //创建对象
student.setName("eric"); // 使用对象
student.show();// 使用对象
student = null; // 销毁对象

也就是说自定义对象的生命周期由我们程序员自己手动控制。但是!!!Servlet它不是一个普通的java类。是一个被tomcat服务器调用的。所以Servlet是生命周期是被tomcat服务器去控制的。

2.servlet生命周期中重要的方法

  • 构造方法:创建servlet的时候调用。默认情况下,第一次访问servlet的时候,会创建servlet对象。此时会有且只会调用1次构造函数,证明了servlet对象是单实例的。

  • init方法:创建完servlet对象之后调用,也只是会调用1次。

  • service方法:提供服务的方法,接收用户的请求,并处理用户的请求,然后响应用户的请求。每次发送请求,都会调用service方法。调用几次,service方法会执行几次。

  • destroy方法:销毁的方法。销毁servlet对象的时候调用。比如我们停止tomcat服务器或者重新部署tomcat服务器,都会销毁servlet对象,只会调用1次。

3.tomcat服务器内部执行代码的原理

1、用户发送请求,tomcat服务器会根据用户发送的请求,解析web.xml配置文件,获取servlet-class的全限定名路径(com.by.servlet.ServletDemo)

2、获取字节码对象,然后通过字节码对象获取对应的实例对象

Class clazz = Class.forName("com.by.servlet.ServletDemo");

Object o = clazz.newInstance();

3、创建ServletConfig对象,然后调用init方法

Method method = clazz.getDeclaredMethod("init",ServletConfig.class);// 获取方法对象

method.invoke(o,config);

4、创建request对象,创建response对象,然后调用service方法

Method m = clazz.getDeclaredMethod("service",ServletRequest.class,ServletResponse.class);

m.invoke(o,request,response);

5、销毁servlet实例对象,也是通过反射的机制实现的

Method m1 = clazz.getDeclaredMethod("destroy",null);

m1.invoke(o,null);

4.测试servlet的声明周期

java 复制代码
public class LifeCycleServlet implements Servlet {

    public ServletDemo(){
        System.out.println("LifeCycleServlet has run........");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init method has run........");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

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

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy method has run........");
    }
}

三、创建servlet的三种方式

1.实现Servlet接口的方式

java 复制代码
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/test1")
public class Servlet1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //s使用ServletConfig对象初始化我们的Servlet
        //执行了,从这个地方可以说明一个问题 Servlet已经被实例化了
        System.out.println("init方法执行");
    }

    @Override
    public ServletConfig getServletConfig() {
        //获取servlet配置信息对象
        //没有执行
        System.out.println("getServletConfig方法执行");
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //核心方法  类似于我们的doGet()方法,和doPost()方法 请求和响应
        //一定执行的
        System.out.println("service");
    }

    @Override
    public String getServletInfo() {
        //获取Servlet的详细信息
        //没有执行
        System.out.println("getServletInfo方法执行");
        return null;
    }

    @Override
    public void destroy() {
        //当tomcat关闭的时候,执行销毁这个servlet的方法
        System.out.println("destroy方法执行");
        //只有当tomcat关闭的时候,才会执行这个方法
        
    }
}

2.继承GenericServlet抽象类的方式

java 复制代码
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/*
* 第二种方式:继承GenericServlet
*
* */
@WebServlet("/test2")
public class Servlet2 extends GenericServlet {
    //只有一个方法是必须重写的,抽象方法
    //为什么?service是核心方法,因为请求和响应就是执行这个方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //解决中文乱码问题
        servletResponse.setContentType("text/html;charset=utf-8");
        servletResponse.getWriter().append("我是第二种创建Servlet的方法");

    }
}

3.继承HttpServlet的方式

java 复制代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/test3")
public class Servlet3 extends HttpServlet {
    //因为在前端的时候,有两种请求方式get和post
    //doGet和doPost方法写在了Service方法中了
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("我是HttpServlet创建的Servlet");
    }
}

这三个创建方式选择哪个?

最好的方式是继承HttpServlet

1.可以减少对其他方法的要求 init destroy

2.可以根据前端的要求进行分门别类 doGet doPost

相关推荐
大新新大浩浩13 小时前
jenkins平台使用Login Theme、Customizable Header插件定制修改登陆页图片文字及首页标题
运维·servlet·jenkins
杨过姑父1 天前
Servlet3 简单测试
java·servlet
Wanna7151 天前
后端开发基础——JavaWeb(Servlet)
java·后端·servlet·tomcat
Wanna7151 天前
后端开发基础——JavaWeb(根基,了解原理)浓缩
java·后端·servlet·tomcat
小殷要努力刷题!3 天前
JavaWeb项目——如何处理管理员登录和退出——笔记
java·javascript·笔记·学习·servlet·javaweb·寒假
电脑玩家粉色男孩6 天前
二、学习SpringMVC
java·学习·servlet
1.01^10006 天前
[0242-06].第06节:SpringBoot中的Web开发
前端·spring boot·servlet
Hi竹子9 天前
Jenkins简单的安装运行
运维·servlet·jenkins
Mr_sun.9 天前
Day05-后端Web基础——Tomcat&Servlet&HTTP协议&SpringBootWeb入门
前端·servlet·tomcat
穷儒公羊10 天前
第三十八章 Spring之假如让你来写MVC——适配器篇
spring·servlet·mvc·web·jsp