Servlet 是用Java编写的服务端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
Servlet也需要帮助。请求到来时,必须有人实例化Servlet,或者至少要建立一个新的线程处理这个请求,必须有人调用Servlet的doPost()或doGet()方法,这些方法还有些重要参数——HTTP 请求和响应对象,所以还必须有人把这两个参数交给servlet。还得有人管理Servlet的生与死。而这“人”就是Web容器。
1 HTTP协议
HTTP是TCP/IP的上层协议。
TCP 负责确保从一个网络节点向另一个网络节点发送的文件能作为一个完整的文件到达目的地。尽管在具体传送过程中这个文件可能会分解为小块传输。
IP是一个底层协议,负责把数据块(数据包)沿路移动到目的地。
HTTP会话的结构是一个简单的请求/响应序列:浏览器发出请求,服务器做出响应。
2 Web容器
Servlet没有main方法,它们受控于另一个Java应用,这个Java应用被称为容器。
图 客户端与服务器的servlet请求与响应
客户端向服务器发起一个指向servlet请求,此时服务器不是把请求交给servlet本身,而是交给部署该servlet的容器,再由容器向servlet提供HTTP请求和响应对象,并且要由容器调用servlet的方法,如doPost()或doGet()。
2.1 容器的作用
通信支持 | 利用容器提供的方法,能轻松地让servlet与web服务器对话。无需自己建立ServerSocket、监听端口、创建流等。 |
生命周期管理 | 控制servlet的生命周期。会负责加载类、实例化和初始化servlet、调用servlet方法,并使servlet实例能够被垃圾回收。 |
多线程支持 | 容器会自动地为它接收地每个servlet请求创建一个新的Java线程。 |
声明方式实现安全 | 利用容器,可以使用XML部署描述文件来配置安全性。 |
JSP支持 | 容器负责把JSP代码翻译成真正的Java。 |
表 Web容器的作用
有了容器,开发者可以更专注于自己的业务逻辑,而不用考虑为线程管理、安全性和网络通信编写底层代码。
2.2 容器如何查找Servlet
作为客户请求的一部分,URL会以某种方式映射到服务器上的一个特定servlet。
图 web.xml中servlet的映射
3 MVC实战
Model(模型)—View(视图)—Controller(控制器)。
模型是值业务数据和处理该数据的方法的组合。servlet表示控制器。
需求:开发一个自动回复网址,当用户输入一段文字时,返回字符串数量及随机回复字符串。
图 部署环境的文件结构
public class AutoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String content = req.getParameter("content");
AutoService autoService = new AutoService();
String reply = autoService.autoReply(content);
req.setAttribute("reply",reply);
RequestDispatcher dispatcher = req.getRequestDispatcher("result.jsp");
dispatcher.forward(req,resp);
}
}
public class AutoService {
public String autoReply(String content) {
int num = 0;
if (content != null) {
num = content.length();
}
return "您输入的文字数量是:" + num;
}
}
模型层及控制层
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自动回复</title>
</head>
<body>
<form action="autoReply.do" method="POST">
<input name="content" placeholder="请输入内容"/>
</form>
</body>
</html>
form.html
<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %>
<html>
<head>
<title>返回结果</title>
</head>
<body>
<%-- JSP Comment --%>
<h1>Hello World!</h1>
<p>
<span style="color:red">
<%= request.getAttribute("reply") %>
</span>
</p>
</body>
</html>
result.jsp
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>autoServlet</servlet-name>
<servlet-class>com.study.controller.AutoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>autoServlet</servlet-name>
<url-pattern>/autoReply</url-pattern>
</servlet-mapping>
</web-app>
web.xml