章节目录

概述

Servlet,由 Server 和 applet 组合而来,即:服务器端的小程序。

在 Web 中的作用如下:

alt

由图可见,Servlet 的主要功能是处理发送端请求


应用举例

需求:在 HTML 页面点击超链接,由 Servlet 返回响应内容:Hello Servlet


步骤①:创建 Web 工程并配置 Tomcat -- 不清楚怎么创建的可以点这里

alt

步骤②:在web下新建index.html文件,编写如下代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>
        <a href="/hello">点击跳转</a>
    </h3>
</body>
</html>

启动 Tomcat,即可自动跳转到浏览器,显示如下信息即可

alt

步骤③:在 src 下新建一个com.baidu.HelloServlet.java文件,编写如下代码:

public class helloServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello servlet被执行了");
        PrintWriter writer = resp.getWriter();
        writer.write("Hello Servlet");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

步骤④:配置 web.xml 文件,如下:

alt

步骤⑤:重新启动 Tomcat 服务器,跳转到HTML页面之后,点击链接,出现以下内容,即可完成。

alt

获取请求参数

以提交以下表单数据为例:

alt

在Servlet中进行获取时,采用getParameter("表单name属性的值")进行获取

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String fname = request.getParameter("fname");
        String priceStr = request.getParameter("price");
        Integer price = Integer.parseInt(priceStr);
        String fcountStr = request.getParameter("fcount");
        Integer fcount = Integer.parseInt(fcountStr);
        String remark = request.getParameter("remark");
        
        FruitDAO fruitDAO = new FruitDAOImpl();
        boolean flag = fruitDAO.addFruit(new Fruit(0,fname, price, fcount, remark));
        
        System.out.println(flag ? "添加成功" : "添加失败");
    }

点击提交按钮,即可在控制台看到 "添加成功"

注意:通过 getParameter() 获取的值是 String 类型,如果需要进行其他数据操作,需要使用 parseInt() 将字符串型转换为 int 型。

请求参数设置字符集

如果提交方式是get请求则不需要设置字符编码,若是post方式,则输入:

request.setCharacterEncoding("utf-8");

注意:设置字符集必须放在获取参数之前,否则设置无效。

生命周期

实例化:第一次接收请求时

初始化 init():第一次接收请求时

处理 service():第一次接收请求和之后接收请求时

销毁 destroy():容器关闭时

Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应。

Session会话

由于 HTTP 协议是无状态的,即:服务器无法判断两次请求是同一个客户端发过来的,还是不同的客户端发过来的,所以引入Session会话跟踪技术。

会话跟踪技术


客户端第一次向服务器发送请求时,服务器会创建一个新的sessionID,然后响应给客户端;


下次客户端给服务器发请求时,会把sessionID发送给服务器,那么服务器就能获取到了sessionID,根据两次的ID是否相等判断是否是同一个客户端。

Session保存作用域

与具体的某一个session是对应的。即:

同一个客户端下可以在不同文件中进行设置和访问

设置

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        req.getSession().setAttribute("name", "li");
    }

访问

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object name = req.getSession().getAttribute("name");
    }

session 作用域与具体的session对应,所以不同客户端是不可以访问的。 不同的浏览器 session 也不同

请求转发和重定向

服务器内部转发


语法:

request.getRequestDispatcher("...").forward(request,response);

说明:

客户端发送请求,服务器在内部进行转发,对于客户端而言,内部经过了多少次转发是不知道的,并且客户端的 地址栏没有变化


客户端重定向


语法:

response.sendRedirect("....");

说明:

客户端发送请求,服务器返回重定向地址,客户端向重定向地址发出请求,是两次请求响应的过程。并且客户端的 地址栏会发生变化