1.Servlet定义

Java Servlet或简称Servlet是在某些Web或应用程序服务器上运行的程序。
它们充当来自Web浏览器或HTTP客户端的入站请求
与HTTP服务器上存在的应用程序或数据库之间的中间层。

详细介绍:

  1. Servlet 是JavaEE规范之一 。规范就是接口
  2. Servlet 就JavaWeb三大组件之一。
    三大组件分别是: Servlet 程序、Filter 过滤器、Listener 监听器。
  3. Servlet 是运行在服务器上的一个java小程序,
    它可以接收客户端发送过来的请求,并响应数据给客户端。

2.为什么使用Servlet

场景1-冗余的JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <%request.setAttribute("name","zhangsanfeng");%>

    <%=request.getAttribute("name")%>
  </body>
</html>

结果 : 123

场景2-Servlet改造JSP:

创建Servlet

(1)servlet(包名)/HelloWorldServlet(servlet名)
src下创建个servlet(包名)文件夹,然后右击Create New Servlet,
创建一个Servlet = = >HelloWorldServlet
在这里插入图片描述
然后在web.xml 里web-app加
(2)web.xml

<!--访问类 就需要映射-->
<!--servlet标签给Tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签 Servlet程序起一个别名(一般是类名)-->
        <servlet-name>HelloWorldServlet</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
        <servlet-class>servlet.HelloWorldServlet</servlet-class>
</servlet>
<!--下面配置地址  servlet-mapping 标签给Servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>HelloWorldServlet</servlet-name>
<!--url-pattern标签配置访问地址
    /   斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径
   /HelloWorldServlet表示地址为http://ip:port/工程路径/HelloWorldServlet
 -->
        <url-pattern>/HelloWorldServlet</url-pattern>
</servlet-mapping>

==》配置servlet程序的访问地址

两个servlet-name要相同,名字可以任意取。
servlet-class是src下的地址,全路径,包名加类名。

如果有第二个servlet可以在中间创建这两个,
也可以直接在下面写,但servlet-mapping一定在servlet下面。

主要思路是:

浏览器的资源路径去web.xml配置文件 的找对应的地址
这个地址给谁用的,找到对应的name,然后找到最上面的name
然后就找到了对应的的工程地址,然后就到对应的类。

然后在HelloWorldServlet里面写:
==》编写一个类去实现Servlet接口

没有配tomcat需要导包tomcat 的 jsp-api.jar 和 servlet-api.jar
service等价于doPost和doGet

service方法是专门用来处理请求和响应的。

(3)HelloWorldServlet.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;

public class HelloWorld2Servlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//request绑定数据
request.setAttribute("name","asdfg");
//转发
request.getRequestDispatcher("index.jsp").forward(request,response);
   }
}

快捷键自动补全:
alt + 回车 == 》introduce local variable
创建相应类型的变量

(4)index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        ${name}
</body>
</html>

通过后台(Servlet)调用jsp
http://localhost:8080/HelloWorldServlet
==》
http://表示http协议
localhost是服务器ip
8080 是服务器端口号
/ 是工程路径
(就是8080和HelloWorldServlet中间的,配置tomcat时已 省略)
/HelloWorldServlet资源路径

结果 :asdfg

相对于之前的代码,省略了html和java混合使用。

3.Servlet的优势

专人专职:JSP负责显示,Servlet负责控制

4.创建Servlet的两种方式:

第一种方式 implements Servlet
(不用这种,用第二种,第一种了解就行)

核心要点:

Servlet生命周期:

如果一个Servlet没有被部署在分布式的环境中,
一般web.xml中声明的一个Servlet只对应一个实例。(相当于单例模式)
而如果一个Servlet实现了SingleThreadModel接口,
就会被初始化多个实例。

(1)加载和实例化
(2)初始化:init() 【执行一次】
第一二步,是第一次访问的时候创建Servlet程序会调用。
(3)服务:service() 【反复执行】
第三步,每次访问都会调用
(4)销毁:destory() 【执行一次】
在web工程停止的时候调用

快捷键:alt + 回车 接口实现方法

步骤1:WorldServlet

如果没效果,把下面换成英文

public class WorldServlet  implements Servlet {
	//自定义
	public WorldServlet(){
        System.out.println("实例化。。。");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化...");
    }

    @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() {
        System.out.println("销毁...");
    }
}

步骤2:web.xml

<servlet>
        <servlet-name>WorldServlet</servlet-name>
        <servlet-class>servlet.WorldServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>WorldServlet</servlet-name>
        <url-pattern>/WorldServlet</url-pattern>
</servlet-mapping>

结果:
1实例化。。。
2初始化…
3(服务)处理请求和生成响应…
(每刷新一次页面就会出现一次)
3(服务)处理请求和生成响应…
3(服务)处理请求和生成响应…
点击stop
4销毁…

第二种方式 extends HttpServlet(企业专用)

最上面的案例

5.总结

JSP本质上是一个Servlet,JSP适合表示层开发,Servlet适合封装控制逻辑

题外话:

web中/斜杠的不同意义
在web中/斜杠是一种绝对路径。
/斜杠如果被浏览器解析,得到的地址是: htp://ip:port/

<a href="/">斜杠</a>

/斜杠如果被服务器解析,得到的地址是: htp//ip:port/工程路径
1、<url -pattern>/servlet1</url-pattern>
2、servletContext.getRealPath("/");
3、request.getRequestDispatcher(/");

特殊情况: response.sendRediect("/");
把斜杠发送给浏览器解析。得到http://ip:port/

----2021.10.16

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐