文章目录
一、介绍
概念:server applet,即:运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
将来我们定义一个类,实现Servlet接口,复写方法,tomcat就可以识别这个类,我们就称它为一个Servlet
作用:
- 获取用户(客户端)发给我的数据
- 调用DAO中的方法完成添加功能
- 在控制台打印添加成功
Servlet用大白话来说,就像是一个在Web服务器上运行的Java小程序,它专门用来处理来自浏览器或其他客户端的请求,并根据这些请求动态生成响应内容。你可以想象一下,每当我们在网页上点击按钮或链接发送请求时,Servlet就在后台接收到这个请求,并进行一系列操作,比如从数据库查询数据、执行业务逻辑或者计算结果。
Servlet并不是直接给用户看的一个静态HTML页面,而是负责生成这些动态页面背后的内容。当Servlet完成工作后,会把生成的结果(可能是HTML页面的一部分、JSON数据、XML数据或者其他格式的数据)返回给客户端,客户端(通常是浏览器)再将这些数据呈现给我们用户。
打个比方,如果你在网上购物,当你点击“查看购物车”按钮时,实际上就是向服务器发送了一个请求。这时,服务器上的Servlet就发挥作用了,它读取你的购物车信息,计算总价等细节,然后生成包含你购物车商品列表的网页并传回给你,这样你就能看到自己挑选的商品了。
总之,Servlet是Java语言提供的一种强大工具,用于开发和扩展Web服务器功能,实现与用户的交互式通信,从而创建动态、功能丰富的Web应用程序。
二、入门案例
在web目录下新建add.html文件
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="add" method="post">
名称:<input type="text" name="fname">
价格:<input type="text" name="price">
库存:<input type="text" name="fcount">
备注:<input type="text" name="remark">
<input type="submit" value="添加">
</form>
</body>
</html>
新建AddServlet类
如果是一个普通类,它是不能够去获取用户发给我的数据的,此时需要让它继承HttpServlet,而这个类并不在JDK包里,而在servlet-api包下。
导入servlet-api的解决办法
-
将servlet-api导入到项目里去
-
在父项目的根目录新建lib文件夹,然后将servlet-api引入。
这种情况是在很多个Module共享的,默认情况下和module是没有关系的。
第一步:右击,将它添加为库
然后从子项目中引用它
加进来后,表示这个module依赖这个Library,但是这个Module里有一个artifact部署包,它是已经生成了。
-
方法一:将artifact删掉,重新建一个
-
方法二:点击Problems,将lib加入进入
-
-
在当前项目的web\WEB-INF下新建lib文件夹,导入servlet-api
缺点:只能是当前module独享。如果有第二个module,我们需要再次重复的新建lib。
优点:启动的时候会自动将lib加进去
-
-
将Tomcat依赖加入进来
找到库(Library)
将tomcat依赖导入进来
查看外部库,可以看见tomcat库已被引入
此时HttpServlet已经可以正常导入了
编写AddServlet类
package com.atguigu.servlets;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class AddServlet extends HttpServlet {
/**
* 这个方法可以帮你去响应post请求,发一个post请求过来,doPost方法就会被调用
* 当客户端给服务端发请求的时候,服务器端就把这个请求封装成一个对象:request
*/
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 请求里去获取参数,获取名字为fname的值
String fname = request.getParameter("fname");
// 通过Http请求发过来的只能是字符串
String priceStr = request.getParameter("price");
// 如果需要用到数字,强转即可。
int price = Integer.parseInt(priceStr);
String fcountStr = request.getParameter("fcount");
String fcount = request.getParameter(fcountStr);
String remark = request.getParameter("remark");
System.out.println("fname = " + fname);
System.out.println("price = " + price);
System.out.println("fcount = " + fcount);
System.out.println("remark = " + remark);
}
}
将servlet的名字和某个类对应上,请求add这个组件可以对应上我们刚刚写的AddServlet
配置web\WEB-INF\web.xml
一个
servlet
允许对应多个servlet-mapping
,无论发给哪个,都是对应一个servlet。这样可以在servlet当中获取我们到底是通过哪个URL请求过来的。根据不同URL发送的请求,可以执行不同的业务逻辑。<servlet> <servlet-name>Demo02Servlet</servlet-name> <servlet-class>com.atguigu.servlets.Demo02Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo02Servlet</servlet-name> <url-pattern>/demo02</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Demo02Servlet</servlet-name> <url-pattern>/demo021</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Demo02Servlet</servlet-name> <url-pattern>/demo022</url-pattern> </servlet-mapping>
但是一个
servlet-mapping
不能对应多个servlet
。
<?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_4_0.xsd"
version="4.0">
<servlet>
<!-- servlet名字可以随便写 -->
<servlet-name>AddServlet</servlet-name>
<!-- 这里需要写上类的全类名 -->
<servlet-class>com.atguigu.servlets.AddServlet</servlet-class>
</servlet>
<!-- 映射 -->
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<!-- 这里/千万不能丢! -->
<url-pattern>/add</url-pattern>
</servlet-mapping>
</web-app>
执行流程:
- 用户发请求:
action=add
- 服务器(tomcat,项目)中,web.xml中找到
servlet-mapping
中的url-pattern = /add
- 找
servlet-name = AddServlet
- 找和
servlet-mapping
中servlet-name
一致的servlet
- 找到
servlet
中的servlet-class
就能通过<servlet>
找到com.atguigu.servlets.AddServlet
类 - tomcat会将字节码文件加载进内存,并且创建其对象
- 用户发送的是post请求(method=post),因此 tomcat 会执行AddServlet中的doPost方法