Servlet基础

 

Tomcat

  • Tomcat是Apache软件基金会旗下一款免费的开放源代码的Web应用服务器
  • Tomcat是运行Servlet(服务器小程序)的容器

Servlet

  • Servlet(Server Applet)服务器小程序,主要功能用于生成动态Web内容
  • Servlet是J2EE最重要的组成部分

Tomcat与Servlet的关系

 

 

 

Tomcat的安装与运行

tomcat.apache.org官网下载Tomcat。

目录结构说明

下方的.md和.txt等文件是一些说明性文件,不参与Tomcat的运行。

bin文件夹

保存了所有启动文件。

conf文件夹

保存了所有配置文件。特别是server.xml文件是核心配置文件。

lib文件夹

保存了Tomcat第三方依赖组件包,Tomcat运行时将其加载。

 

logs文件夹

Tomcat运行中的一些日志数据。如果程序出现问题,方便查看。

temp文件夹

运行中产生的中间临时文件

webapps文件夹

存放自己开发应用程序的目录。

 

works目录

jsb编译后的源代码或者字节码文件。(现在通常为空)

环境配置

环境变量

安装JDK1.8及以上版本,然后环境变量中增加JAVA_HOME的值.然后把PATH环境变量也加入.

启动

双击bin文件夹下的startup.bat文件。
  
出现上图一句话表示启动成功。
启动之后,Tomcat会默认占用8080端口。如图:(localhost:8080)
  
当然,我们也可以修改Tomcat占用端口,在conf文件夹的server.xml文件,找到如下位置。将其8080端口改为自己想要的端口号即可。
 

创建Java Web工程

使用Maven创建Java Web工程。
 

 

Maven工程创建完毕。
然后在main目录下创建webapp目录用于存放网页,css,js等资源。

 

 

相关设置

  1. 让IDEA知道webapp目录的功能。

 

 

 

  1. 设置Web Resource Dictorires和Web应用的映射路径.

 

 

  1. 设置Web应用的启动方式

 

 

 

利用上面目录保存Web应用最终运行目录。

Tomcat绑定

点击AddConfigurations ,然后点击Templete

 

然后找到Deployment(程序部署方式),点击+号。
第二个红框修改为:first/
然后再次点击AddConfigurations,然后点+号找到Tomcat -> Local出现
 
 
回到IDEA。

 

运行Tomcat出现:

 

 

Servlet

创建过程

在java目录下创建FirstServlet文件。
在pom.xml文件中添加:
 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.imooc</groupId>
    <artifactId>servlet-first</artifactId>
    <version>1.0.0-RELEASE</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>aliyun</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>
</project>

  

FirstServlet文件

 

package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class FirstServlet extends HttpServlet {
    public FirstServlet() {
        System.out.println("正在创建FirstServlet");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("正在初始化FirstServlet");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String html = "<h1 style='color:red'>hi," + name + "!</h1><hr/>";
        System.out.println("返回给浏览器的响应内容为:" + html);
        PrintWriter out = resp.getWriter();
        out.println(html);
    }

    @Override
    public void destroy() {
        System.out.println("正在销毁FirstServlet");
    }
}

  

 
然后在web.xml中添加
<?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_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>first</servlet-name>
        <servlet-class>com.imooc.servlet.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>first</servlet-name>
        <url-pattern>/hi</url-pattern>
    </servlet-mapping>
</web-app>

   

<servlet-mapping> 主要是对servlet-name进行url映射。
然后启动Tomcat:
编译生成对应字节码文件。

 

 
但是Tomcat加载的是下面的目录文件:

 

浏览器输入localhost:8080/hi?name=Jackson :

 

图解执行流程

 

 

Java Web 工程标准结构

 

 

 

 

 

Servlet开发步骤

  1. 创建Java类,继承HttpServlet
  2. 重写service方法,处理请求,生成响应
  3. 配置web.xml,绑定访问地址
示例:
package com.imooc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class SampleServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.处理请求中的用户数据
        String name = req.getParameter("name");
        String mobile = req.getParameter("mobile");
        //2.通过响应返回结果(返回响应文本)
        PrintWriter out = resp.getWriter();
        out.println("<h1>name:" + name + "</h1>");
        out.println("<h1>mobile:" + mobile + "</h1>");
    }
}
 
然后web.xml文件绑定servlet:
    <servlet>
        <servlet-name>sample</servlet-name>
        <servlet-class>com.imooc.servlet.SampleServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sample</servlet-name>
        <url-pattern>/sample</url-pattern>
    </servlet-mapping>

  

 

 

Servlet访问方法

格式:http://IP地址:端口号/上下文/Servlet映射地址
示例:http://192.168.31.106:8080/xproject/sample
上下文在开发时已不推荐使用,建议默认使用" / "

请求参数

  • 请求参数是指浏览器通过请求向Tomcat提交的数据
  • 请求参数通常是用户输入的数据,待Servlet进行处理
  • 参数名=值1&参数名2=值2& 参数名3=值3& 参数名n=...

Servlet接收请求参数

  • request.getParameter() - 接收单个参数
  • request.getParameterValues() - 接收多个同名参数
 
示例:
student.html

 

 

package com.imooc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class StudentServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String mobile = request.getParameter("mobile");
        String sex = request.getParameter("sex");
        String[] specs = request.getParameterValues("spec");
        PrintWriter out = response.getWriter();
        out.println("<h1>name:" + name + "</h1>");
        out.println("<h1>mobile:" + mobile + "</h1>");
        out.println("<h1>sex:" + sex + "</h1>");
        for(String spec:specs){
            out.println("<h2>spec:" + spec + "</h2>");
        }
    }
}

  

 
web.xml中增加:
<servlet>
        <servlet-name>student</servlet-name>
        <servlet-class>com.imooc.servlet.StudentServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>student</servlet-name>
        <url-pattern>/student</url-pattern>
    </servlet-mapping>

  

 

 

 

Get和Post请求方法

Get方式是将数据通过URL附加数据显性向服务器发送数据。
  • http://localhost:8080/FirstServlet/sample?name=zhangsan
Post方式会将数据存放在“请求体”隐性向服务器发送数据
  • http://localhost:8080/FirstSevlet/sample
  • 请求体:name=zhangsan

应用场景

Get常用于不包含敏感信息的查询功能
  • 例如:https://www/baidu/com/s?wd=imooc&rsv_spt=1
Post请求用于安全性要求较高的功能或者服务器的“写”操作
  • 用户登陆
  • 用户注册
  • 更新公司账目
示例
Get:
 
Post:

Get与Post处理方式

  • 所有请求 - service()方法
  • Get请求 - doGet()方法
  • Post请求 - doPost()方法
示例:
package com.imooc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class RequestMethodServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        PrintWriter out = response.getWriter();
        out.println("<h1>GET:name:" + name + "</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        PrintWriter out = response.getWriter();
        out.println("<h1>POST:name:" + name + "</h1>");
    }
}

  

 
web.xml中绑定servlet:
<servlet>
        <servlet-name>requestMethod</servlet-name>
        <servlet-class>com.imooc.servlet.RequestMethodServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>requestMethod</servlet-name>
        <url-pattern>/request_method</url-pattern>
    </servlet-mapping>

  

 

Servlet生命周期

  1. 装载 - web.xml
  2. 创建 - 构造方法
  3. 初始化 - init()
  4. 提供服务 - service()
  5. 销毁 - destory()
示例:
package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class FirstServlet extends HttpServlet {
    public FirstServlet() {
        System.out.println("正在创建FirstServlet");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("正在初始化FirstServlet");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String html = "<h1 style='color:red'>hi," + name + "!</h1><hr/>";
        System.out.println("返回给浏览器的响应内容为:" + html);
        PrintWriter out = resp.getWriter();
        out.println(html);
    }

    @Override
    public void destroy() {
        System.out.println("正在销毁FirstServlet");
    }
}

  

启动Tomcat,在第一次访问时才创建FirstServlet对象(单例)

 

关闭Tomcat

 

使用注解配置Servlet

  • Servlet 3.x之后引入了“注解Annotation”特性
  • 注解用于简化Web应用程序的配置过程
  • Servlet核心注解:@WebServlet
示例:
package com.imooc.servlet;

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("/anno")
public class AnnotationServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("I'm annotation servlet!!");
    }
}

  

 
在类上添加注解,就不需要在web.xml绑定servlet的Url.
 
posted @ 2021-08-27 11:18  宋同学shl  阅读(52)  评论(0)    收藏  举报