Java:Servlet详解

目录

一、什么是Servlet

二、Servlet原理

Servlet的生命周期

[三、 Servlet注释](#三、 Servlet注释)

@WebServlet


一、什么是Servlet

Servlet是JavaWeb开发的一种技术,Servlet程序需要部署在Servlet容器(服务端)中才能运行,常见的Servlet容器有Tomcat,Jetty等。

其主要功能在于交互式地浏览和修改数据,生成动态Web内容。这个过程包括以下4个阶段。

(1)、Client向Server发送请求。

(2)、Server将请求信息发送至Servlet。

(3)、Servlet根据请求信息生成响应内容(包括静态或动态内容)并将其传给Server。

(4)、Server将响应返回给Client。

二、Servlet原理

从UML类图中我们可以看出Servlet是一个接口,定义了init初始化、service响应服务、destroy销毁等方法,而GennericServlet作为抽象类实现了Servlet接口,而HttpServlet抽象类继承了GennericServlet类,同时定义了doGet方法,doPost方法来完成相应的Http处理。

其中还可以发现HttpServletRequest和HttpServletResponse是接口,其具体的实现类是web服务器tomcat的两个类。也就是说Servlet必须运行在Servlet容器里

Servlet的生命周期

1.初始化init(),仅在第一次加载Servlet时被调用。

2.执行服务,调用service()方法响应客户请求。

3.销毁调用destory()杀掉Servlet对象。

三、 Servlet注释

我们平时使用部署描述符(web.xml文件)将应用程序部署到Web服务器中。tomcat7以上版本、Servlet API 3.0引入了一个名为javax.servlet.annotation的新程序包。它提供了可用于对Servlet类进行注释的注释类型。如果使用批注,则不需要部署描述符(web.xml)。

@WebServlet

|-------------|----------------------|
| 属性 | 用处 |
| String name | Servlet的名称 |
| urlPatterms | 过滤器的URL格式数组(支持使用通配符) |
| value | URL格式数组 |

使用valueurlPatterns属性中必须声明至少一个URL模式 ,但不能两者都声明(两者不能同时存在)。

实例:

编写了一个带有注释的servlet,url格式为:/Login,它会匹配的请求路径为/Time/Login,其中Time为Web项目名。

java 复制代码
package com.example.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 javax.servlet.http.HttpSession;

import com.example.utils.JDBCUtils;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@WebServlet(name = "LoginServlet",urlPatterns = "/Login")
public class LoginServlet extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //处理客户端的post请求  
    response.setContentType("text/html;charset=utf-8");   
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    //解决乱码问题!设置内容都为utf-8格式
    PrintWriter out = response.getWriter();
    String username = request.getParameter("name");
    String password = request.getParameter("secret");
    HttpSession session=request.getSession();
    //创建一个会话对象!
    
    JDBCUtils.registerDriver();
    Connection connection=JDBCUtils.getConnection();
    PreparedStatement pStatement=null;
    try {
      ResultSet resultSet=JDBCUtils.checkExit(username, pStatement, connection);
      if(resultSet.next()){
        if(!password.equals(resultSet.getString("password"))){
          out.write("<script language='javascript'>alert('密码错误,请重新输入!');window.location.href='/Todoproject/login.html'</script>");
        }else{
          session.setAttribute("username", username);
          out.write("<script language='javascript'>alert('登录成功!');window.location.href='/Todoproject/menu.html'</script>");
        }
      }else{
        //如果没有找到!
        out.write("<script language='javascript'>alert('该用户不存在!');window.location.href='/Todoproject/login.html'</script>");
      }
    } catch (SQLException e) {
      e.printStackTrace();
      out.write("<script language='javascript'>alert('系统发生错误!');window.location.href='/Todoproject/login.html'</script>");
    }finally{
      JDBCUtils.closeConnection(connection);
    }
  }
}

以下为表单发起的请求

html 复制代码
<form method="post" action="/Time/Login"  id="Login" onsubmit="return checklogin()">
    用户名:<input  type="text" placeholder=" 账号" name="name" id="name"><br><br>
    密码:&emsp;<input  type="password" placeholder=" 密码" name="secret" id="secret">
    <button id="submit" type="submit" >登录</button>
    <button id="register" type="button" onclick="window.open('register.html') " >注册     </button>
</form>
相关推荐
南斯拉夫的铁托3 分钟前
labelimg安装及使用指南(yolo)
开发语言·python·yolo
六bring个六27 分钟前
文件系统交互实现
开发语言·c++·qt·交互
Unity官方开发者社区31 分钟前
《Cryptical Path》开发诀窍:像玩游戏一样开发一款类Rogue游戏
java·游戏·玩游戏
jingyu飞鸟32 分钟前
Centos7系统(最小化安装)安装zabbix7版本详细文章、nginx源代码配置、php源代码、mysql-yum安装
开发语言·php
_星辰大海乀34 分钟前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
dhxhsgrx42 分钟前
PYTHON训练营DAY27
开发语言·python
小山菌42 分钟前
mac中加载C++动态库文件
开发语言·c++·macos
IT成长史43 分钟前
deepseek梳理java高级开发工程师微服务面试题-进阶版
java·spring cloud·微服务
zkmall1 小时前
Java + 鸿蒙双引擎:ZKmall开源商城如何定义下一代B2C商城技术标准?
java·开源·harmonyos
陌路物是人非1 小时前
uniapp取消浏览自动填充
java·服务器·uni-app