SERVLETJSP Unit02: Servlet工作原理

本文介绍了HTTP协议的基础知识,包括其定义、通信过程及请求响应数据结构,并详细讲解了通过Servlet实现注册案例的过程,以及使用POST请求处理中文乱码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.HTTP协议

1.什么是HTTP协议?

  • 就是W3C制定的一个规范
  • 规定了浏览器和服务器如何通信、通信的数据格式

2.如何通信

  • 建立连接
  • 发送请求
  • 接收响应
  • 关闭连接
    一个请求一次连接,尽量降低服务器的压力

3.请求数据结构

  • 请求行: 请求的基本信息
  • 消息头: 对实体内容的描述
  • 实体内容: 浏览器向服务器发送的业务数据

4.响应数据结构

  • 状态行: 响应的基本信息
  • 消息头: 对实体内容的描述
  • 实体内容: 服务器向浏览器发送的业务数据

5.注意

1)很多事情不需要我们处理

  • 通信的步骤由浏览器和服务器自动实现
  • 请求数据中的请求行,消息头由浏览器自动填写
  • 响应数据中的状态行,消息头通常由服务器自动填写

2.少量事情需要我们处理

  • 请求数据中的实体内容由我们提供
  • 响应数据中的实体内容由我们提供
    通过request处理请求数据,通过response处理响应数据

二.注册案例

![这里写图片描述](https://img-blog.youkuaiyun.com/20170624082435581?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgxMzE2Njg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

reg.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
    <!-- 
        1.完整路径
            http://ip:port/项目名/网名
        2.绝对路径
            格式: /项目名/网名
            举例: /servlet2/reg
        3.相对路径
            当前: /servlet2/reg.html
            目标: /servlet2/reg
            相对路径: reg
     -->
    <form action="reg" method="post">
        <p>
            账号:<input type="text" name="username"/>
        </p>
        <p>
            密码:<input type="password" name="pwd"/>
        </p>
        <p>
            性别:
            <input type="radio" name="sex" value="M"/><input type="radio" name="sex" value="F"/></p>
        <p>
            兴趣:
            <input type="checkbox" name="interest" value="food"/>美食
            <input type="checkbox" name="interest" value="game"/>竞技
            <input type="checkbox" name="interest" value="friend"/>社交
        </p>
        <p>
            <input type="submit" value="注册"/>
        </p>
    </form>
</body>
</html>

RegServlet.java

package web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegServlet extends HttpServlet {

    @Override
    protected void service(
        HttpServletRequest req, 
        HttpServletResponse res) throws ServletException, IOException {
        //采用方案三解决POST请求乱码问题
        req.setCharacterEncoding("utf-8");
        //处理请求的一般流程
        //1.接收参数
        String name = req.getParameter("username");
        String pwd = req.getParameter("pwd");
        String sex = req.getParameter("sex");
        String[] interests = 
            req.getParameterValues("interest");

        //采用方案一解决乱码问题
        //byte[] bs = name.getBytes("iso8859-1");
        //name = new String(bs,"utf-8");

        //2.处理业务
        System.out.println(name);
        System.out.println(pwd);
        System.out.println(sex);
        if(interests != null) {
            for(String interest : interests) {
                System.out.println(interest);
            }
        }
        //3.发送响应
        res.setContentType(
            "text/html;charset=utf-8");
        PrintWriter w = res.getWriter();
        w.println("<p>ok,"+name+"</p>");
        w.close();
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>servlet2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>reg</servlet-name>
    <servlet-class>web.RegServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>reg</servlet-name>
    <url-pattern>/reg</url-pattern>
  </servlet-mapping>

</web-app>

三.请求方式

1.什么是请求方式?

  • 就是浏览器向服务器发送请求时传递数据的方式

2.常用请求方式

  • GET
  • POST

3.GET和POST的区别(面试题)

1)GET

  • 采用路径传参
  • 参数在传递过程中可见,隐私性差
  • 路径大小有限制,所有传递的参数大小受限
    所有的请求默认都是GET请求

2)POST

  • 采用实体内容传参
  • 参数在传递过程中不可见,隐私性好
  • 实体内容专门用来传参,大小不受限制
    在表单上加method=”post”

3)建议

  • 参数需要保密时用POST
  • 参数较多时用POST

四.Servlet运行原理

这里写图片描述

五.乱码解决方案

这里写图片描述

六.查询员工案例

这里写图片描述

这里写图片描述

entity\Emp.java
package entity;

import java.io.Serializable;

public class Emp implements Serializable {

    private Integer empno;
    private String ename;
    private String job;
    private Double sal;

    public Integer getEmpno() {
        return empno;
    }
    public void setEmpno(Integer empno) {
        this.empno = empno;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public Double getSal() {
        return sal;
    }
    public void setSal(Double sal) {
        this.sal = sal;
    }

}
dao\EmpDao.java
package dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import entity.Emp;

public class EmpDao implements Serializable {

    public List<Emp> findAll() {
        //模拟查询所有的员工
        List<Emp> list = new ArrayList<Emp>();

        Emp e1 = new Emp();
        e1.setEmpno(1);
        e1.setEname("唐僧");
        e1.setJob("领导");
        e1.setSal(9000.0);
        list.add(e1);

        Emp e2 = new Emp();
        e2.setEmpno(2);
        e2.setEname("悟空");
        e2.setJob("职员");
        e2.setSal(5000.0);
        list.add(e2);

        Emp e3 = new Emp();
        e3.setEmpno(3);
        e3.setEname("八戒");
        e3.setJob("职员");
        e3.setSal(6000.0);
        list.add(e3);

        return list;
    }

}
web\FindEmpServlet.java
package web;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.EmpDao;
import entity.Emp;

public class FindEmpServlet extends HttpServlet {

    @Override
    protected void service(
        HttpServletRequest req, 
        HttpServletResponse res) throws ServletException, IOException {
        //1.接收参数
        //2.处理业务
        EmpDao dao = new EmpDao();
        List<Emp> list = dao.findAll();
        //3.发送响应
        res.setContentType(
            "text/html;charset=utf-8");
        PrintWriter w = res.getWriter();
        w.println("<table border='1' cellspacing='0' width='30%'>");
        w.println(" <tr>");
        w.println("     <td>编号</td>");
        w.println("     <td>姓名</td>");
        w.println("     <td>职位</td>");
        w.println("     <td>薪资</td>");
        w.println(" </tr>");
        if(list != null) {
            for(Emp e : list) {
                w.println("<tr>");
                w.println(" <td>"+e.getEmpno()+"</td>");
                w.println(" <td>"+e.getEname()+"</td>");
                w.println(" <td>"+e.getJob()+"</td>");
                w.println(" <td>"+e.getSal()+"</td>");
                w.println("</tr>");
            }
        }
        w.println("</table>");
        w.close();
    }   
}
webapp\WEB-INF\web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>EmpManager</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>findEmp</servlet-name>
    <servlet-class>web.FindEmpServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>findEmp</servlet-name>
    <url-pattern>/findEmp</url-pattern>
  </servlet-mapping>

</web-app>
电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值