5-创建Servlet程序

基本概念

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

我们把实现了Servlet接口的java程序,叫Servlet

开发一个Servlet程序,一般有两步,1、编写类,实现Servlet接口;2、把这个类部署到Web服务器上

第一个Servlet

1、建立一个普通的maven项目,删掉src目录,之后在这个项目内可以添加多个mavenweb moudle。这样会形成maven父子工程。父子工程的好处在于,当你在父工程POM中添加依赖,子工程也可以使用。

建立子mavenweb moudle
在这里插入图片描述
我这里直接建立servlet01子moudle,添加java和resources目录,并设置成source root和resources root,将maven结构添加完整。(可见上一篇博客)

在这里插入图片描述

此时在父工程pom中自动会出现

    <modules>
        <module>servlet01</module>
    </modules>

在子工程pom中出现,没有的就加上

  <parent>
    <groupId>org.example</groupId>
    <artifactId>javaweb-01-servlet</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

出现这两个,才说明父子工程建立完成。之后父项目中的依赖子项目也可以使用

2、修改web.xml为最新。这个可以从你的Tomcat webapp下获取,删除里面一些不必要的东西

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">

</web-app>

3、在父工程pom中导入我们需要的依赖,其他子项目也都可以用

    <dependencies>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>

3、在java目录下,编写servlet程序(即编写类实现Servlet接口),我们一般继承它的实现类HttpServlet

请添加图片描述

在Servlet中,service是重点
在这里插入图片描述

在HttpServlet中,覆写了service,并且根据判断去调用其他方法,比如doGet、doPost等,因此我们核心是要调用doGet、doPost这些方法,而doGet、doPost是我们最常用的,用来接收请求,并进行响应。此外由于这俩只是请求实现方式不同,业务逻辑相似,可以相互调用
在这里插入图片描述

4、在java下,编写HelloServlet类,在页面上输出“成功输出”。req代表浏览器发来的请求,resp代表要做的响应,可以配置一些东西。doPost调用doGet

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应的内容格式
        resp.setContentType("text/html");
        //设置响应的编码方式,使得浏览器可以显示中文
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();
        writer.println("<h1>成功</h1>");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

5、编写Servlet映射
由于我们是java程序,我们需要浏览器访问它,就要把它当作是一个项目资源,因此我们需要映射,给它一个虚拟路径

在web.xml中配置,servlet-name随便起,代表注册的servlet名字,servlet-class对应java程序路径,url-pattern代表网页虚拟路径。当然一个Servlet程序可以对应多个虚拟路径

再加上整个项目代表的虚拟路径,就得到我们最后访问此java程序的路径

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.yuan.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

整个项目代表的虚拟路径
在这里插入图片描述
最终java程序对应的虚拟路径是http://localhost:8080/servlet01_war/hello

6、配置Tomcat,可以参考上一篇博客,且一定要添加打包方式
在这里插入图片描述

7、启动Tomcat,此时会进入默认页面,webapp下的index.jsp
路径显示http://localhost:8080/servlet01_war/
其实是http://localhost:8080/servlet01_war/index.jsp
输入http://localhost:8080/servlet01_war/hello,即可进入我们的Servlet程序

Servlet原理

参考
https://www.cnblogs.com/xdp-gacl/p/3760336.html#!comments
https://blog.csdn.net/fg881218/article/details/89716366

如何处理一个HTTP Servlet请求?
1、Web 服务器接收 HTTP 请求。
2、Web 服务器将请求转发到 Servlet 容器。
3、如果对应的 Servlet 不在容器中,那么将被动态检索并加载到容器的地址空间中。
4、容器调用 init() 方法进行初始化。创建Servlet对象(仅在第一次加载 Servlet 时调用一次)
5、容器调用 Servlet 的 service() 方法来处理 HTTP 请求,即读取请求中的数据并构建响应。此时,service()一般会去调用doGet或者doPost方法等。Servlet对象将暂时保留在容器的地址空间中,可以继续处理其它 HTTP 请求。
6、Web 服务器将动态生成的结果返回到浏览器/客户端。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

请添加图片描述

mapping虚拟映射

1、一对一,一个Servlet程序对应一个虚拟路径
2、一对多,一个Servlet程序对应多个虚拟路径

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.yuan.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello2</url-pattern>
  </servlet-mapping>

3、指定通用映射路径

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.yuan.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>

4、设置成默认请求路径 /*

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.yuan.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

5、指定后缀,注意 * 前不能加项目路径/

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.yuan.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.yqb</url-pattern>
  </servlet-mapping>

6、虚拟地址会有优先级,比如像默认的虚拟路径,优先级会很低

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值