章节目录
概述
Servlet,由 Server 和 applet 组合而来,即:服务器端的小程序。
在 Web 中的作用如下:
由图可见,Servlet 的主要功能是处理发送端请求
应用举例
需求:在 HTML 页面点击超链接,由 Servlet 返回响应内容:Hello Servlet
步骤①:创建 Web 工程并配置 Tomcat -- 不清楚怎么创建的可以点这里
步骤②:在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,即可自动跳转到浏览器,显示如下信息即可
步骤③:在 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 文件,如下:
步骤⑤:重新启动 Tomcat 服务器,跳转到HTML页面之后,点击链接,出现以下内容,即可完成。
获取请求参数
以提交以下表单数据为例:
在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("....");
说明:
客户端发送请求,服务器返回重定向地址,客户端向重定向地址发出请求,是两次请求响应的过程。并且客户端的
地址栏会发生变化
。