Servlet入门

Servlet 入门

HTTP 协议

是一种客户端请求和响应的标准协议

浏览器与服务器交互流程

  • 客户端发送 HTTP 请求,服务器接收后解析请求,处理业务逻辑并返回 HTTP 响应。
  • 可通过浏览器 F12 的 Network 面板查看
  • http请求
    • 请求行(第一行,包含请求方法,请求路径,请求协议版本)
    • 消息头-请求头(键值对)传递请求附加信息,如 Referer(标识请求来源)
    • 请求正文(get请求没有请求体(数据),参数跟在地址后面)
  • http响应
    • 相应行(协议/版本/状态码)成功状态码:200
    • 消息头-响应头(键值对)传递响应附加信息,如 Location(重定向地址[更换域名])、Refresh(自动跳转,单位秒)
    • 响应正文(结果)

书写格式与协议特点

  • 浏览器请求格式:httP://host[:port](域名)/项目路径/资源?参数
  • 特点:
    • 支持客户 / 服务器模式
    • 简单快速(GET/POST 等请求方法)
    • 灵活(传输任意类型数据)
    • 无连接(每次连接只处理一个请求,HTTP1.1 支持可持续连接)
    • 无状态(对事物的处理没有记忆能力)

Tomcat 服务器

​ 服务器统一接收客户端的请求,再分发给各种资源,处理结果再由服务器返回给客户端

特点

  • 轻量级 Web 容器,开源免费,兼容性强、稳定可靠

关键操作

  • 目录结构:
    • bin(启动 / 关闭脚本)
    • conf(配置文件,如 server.xml 配置端口、web.xml 配置 Web 应用)
    • webapps(存放 Web 项目)
    • work(JSP 编译后的文件)
  • 启动与关闭:双击 bin 目录的 startup.bat 启动,shutdown.bat 关闭;启动后通过http://localhost:8080访问

IDEA配置Tomcat

  • File——>settings——>选择 “Appliction Servers”,点击右侧的 “+” 号,选择 “TomcatServer”
  • ——>设置 Tomcat 的安装目录——>点击Apply

pZCNqat.png

IDEA中创建Web项目

  • File——>New——>Project——>Jakarta EE——>Template选择Web application——>选择部署的Tomcat Server——>Next

pZCNjG8.png

  • JDK1.8选择的是Java EE8——>Specification选择web Profile——>Create

pZCUSMQ.png

  • 设置站点名

pZCa6tx.png

Servlet的实现

  • 客户端发起请求

  • 服务器解析请求并匹配 Servlet

  • Servlet 实例化与初始化(首次请求)

  • 处理请求(service)

  • 生成响应返回客户端

  • Servlet 销毁(服务器关闭时)

继承 HttpServlet 抽象类

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

public class MyHttpServlet extends HttpServlet {
    //重写doGet/doPost/service方法
    @Override
     public void service(ServletRequest request, ServletResponse response) 
         throws ServletException, IOException {
     response.setContentType("text/html;charset=UTF-8");
     response.getWriter().write("<h1>Hello, GenericServlet!</h1>");
    }
    
    // 处理 GET 请求(如浏览器直接访问、链接点击)
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("<h1>处理 GET 请求</h1>");
    }

    // 处理 POST 请求(如表单提交)
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("<h1>处理 POST 请求</h1>");
    }
}
继承 GenericServlet 抽象类
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class MyGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("<h1>Hello, GenericServlet!</h1>");
    }
}

实现 Servlet 接口

import javax.servlet.*;
import java.io.IOException;

public class MyFirstServlet implements Servlet {
    // 1. 初始化:Servlet 实例创建后调用,仅执行一次
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("Servlet 初始化...");
    }

    // 2. 获取配置信息(如初始化参数)
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    // 3. 核心:处理请求并生成响应(每次请求都会调用)
    @Override
    public void service(ServletRequest request, ServletResponse response) 
            throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        // 向客户端输出内容
        response.getWriter().write("<h1>Hello, Servlet!</h1>");
    }

    // 4. 获取 Servlet 信息(如版本、作者等)
    @Override
    public String getServletInfo() {
        return "MyFirstServlet v1.0";
    }

    // 5. 销毁:Servlet 被移除时调用(如服务器关闭),释放资源
    @Override
    public void destroy() {
        System.out.println("Servlet 销毁...");
    }
}

注解配置

//@WebServlet("/hello") 注意“/”
//多路径映射
//@WebServlet(name="Servlet01",urlPatterns={"/ser01",'/ser001'})
//@WebServlet(name="Servlet01",value="/ser01")

HttpServletRequest 对象

接收请求

  • 常用方法:

    • getMethod()(获取请求方式Get/Post)
    • getRequestURL()(获取请求 的完整URL)
    • getRequestURI()(获取请求 URI,部分名称)
    • getQueryString()(获取请求的参数[字符串])
    • getProtocol()(获取HTTP版本号)
    • getContextPath()(获取webapp站点)
  • 获取请求参数:

    • 单个参数:String getParameter(name)

    • 多个同 name 参数:String[] getParameterValues(String name)

请求乱码问题

  • GET 请求:Tomcat8 及以上默认已处理,若仍有乱码可修改服务器编码;Tomcat7 及以下需对获取的参数进行new String(param.getBytes("ISO-8859-1"), "UTF-8")转码
  • POST 请求:在获取参数前设置request.setCharacterEncoding("UTF-8")

请求转发

request.getRequestDispatcher("目标资源路径").forward(request, response),一种服务器行为,属于服务器内部跳转,地址栏不变化,一次请求,可共享 request 作用域数据

request 作用域

数据仅在一次请求的转发链中有效,即服务器跳转有效

设置域对象内容

setAttribute(String name, Object value)

获取域对象内容

``getAttribute(String name)`

删除域对象内容

removeAttribute(String name)

HttpServletResponse 对象

响应数据

  • 响应文本:PrintWriter getWriter()获取字符输出流,用于响应字符串、HTML 等文本内容
  • 响应二进制数据:ServletOutputStream getOutputStream()获取字节输出流,用于响应一切数据

注意:二者不可同时使用,因为response对象只有一个

// 字符输出流
PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h2>Hello</h2>");

// 字节输出流
ServletOutputStream out =
response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h2>Hello</h2>".getBytes());

// 设置响应MIME类型
response.setHeader("content-type","text/html");

响应乱码问题:

  • 字符数据乱码:response.setContentType("text/html;charset=UTF-8")(同时设置响应内容类型和两端的编码,推荐),或分开设置response.setCharacterEncoding("UTF-8")response.setHeader("Content-Type", "text/html;charset=UTF-8")

重定向

​ 响应码:302,response.sendRedirect("目标资源路径"),属于客户端跳转,地址栏会变化,两次请求,不可共享 request 作用域数据

对比项请求转发(服务端行为)重定向(客户端行为)
跳转次数1 次2 次
地址栏不变变化
共享数据可共享 request 作用域不可共享 request 作用域
跳转范围仅能在当前服务器内部可跳转到任意资源(同服务器、其他服务器)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值