Servlet + MVC
1. Servlet 基础
1.1 Servlet 简介
Servlet 是 JSP 的前身,它是在服务器上运行的小程序。一个 Servlet 就是一个 Java 类,并且可以通过 “请求-响应” 编程模型来访问的这个驻留在服务器内存例的 Servlet 程序。
1.2 Tomcat 容器等级
1.3 手工编写一个 Servlet
- 继承 HttpServlet
- 重写
doGet()
或者doPost()
方法 - 在 web.xml 中使用映射注册 Servlet,也可以用注解,如下所示
@WebServlet(name = "HelloServlet",urlPatterns = "/demo")
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>第一个Servlet小例子</h1>
<hr>
<a href="com.example.firstDemo/Servlet">Get方式请求Servlet</a>
<form action="com.example.firstDemo/Servlet" method="post">
<input type="submit" value="Post方式请求Servlet"/>
</form>
</body>
</html>
Servlet.java
package com.example.firstDemo;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
//注解形式注册 servlet
@WebServlet(name = "Servlet", value = "/com.example.firstDemo/Servlet")
/*同样可以采用在 web.xml 中注册
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
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-name>Servlet</servlet-name>
<servlet-class>com.example.firstDemo.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/com.example.firstDemo/Servlet</url-pattern>
</servlet-mapping>
</web-app>
*/
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理Get()请求");
PrintWriter out = response.getWriter();
out.println("<strong>Hello Servlet!</strong>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理Post()请求");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<strong>Hello Servlet!</strong><br>");
}
}
1.4 Servlet 执行流程和生命周期
- Servlet 初始化后调用
init ()
方法,一次性初始化。init()
方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
public void init() throws ServletException {
// 初始化代码...
}
- Servlet 调用
service()
方法来处理客户端的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service()
方法由容器调用,service()
方法在适当的时候调用doGet()
、doPost()
、doPut()
、doDelete()
等方法。
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
-
doGet()
方法:GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
-
doPost()
方法 :POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单。
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
- Servlet 销毁前调用
destroy()
方法,它只会被调用一次,在 Servlet 生命周期结束时被调用。destroy()
方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用destroy()
方法之后,servlet 对象被标记为垃圾回收。
public void destroy() {
// 终止化代码...
}
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
1.5 Servlet 与 JSP 内置对象
1.6 Servlet 获取表单数据
很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序。浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法。
- GET 方法 :向页面请求发送已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔。GET 方法是默认的从浏览器向 Web 服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中。如果您要向服务器传递的是密码或其他的敏感信息,请不要使用 GET 方法。GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。
http://www.test.com/hello?key1=value1&key2=value2
- POST 方法: 不是把信息作为 URL 中 ? 字符后的文本字符串进行发送,而是把这些信息作为一个单独的消息。消息以标准输出的形式传到后台程序,您可以解析和使用这些标准输出。Servlet 使用
doPost()
方法处理这种类型的请求。
Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析
- getParameter():调用 request.getParameter() 方法来获取表单参数的值。
- getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
- getParameterNames():得到当前请求中的所有参数的完整列表。
2. MVC
MVC 模型:MVC (Model 、View 、Controller),是软件开发过程中比较流行的设计思想。旨在分离模型、控制、视图。是一种分层思想的体现。
- Model(模型)表示应用程序核心(比如数据库记录列表),是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图)显示数据(数据库记录),是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器)处理输入(写入数据库记录),是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。