Servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层,使用 它可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页(前提是需要把Tomcat配置完成),准确的说它是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。
Servlet生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
以上的都是类继承自HttpServlet,需要重写的这些方法
init() 方法
init 方法被设计成只调用一次,它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用,因此,它是用于一次性初始化的。
init 方法的定义如下:
public void init() throws ServletException { // 初始化代码... }
service() 方法
service方法是执行实际任务的主要方法,Servlet 容器(即 Web 服务器)调用 service方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端,每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务,service方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
service方法的定义如下:
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ // Servlet 代码 }
service 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法,因此,不用对 service 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可,它们两个是最常用的方法,下面是两个方法的特点:
doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 或 HTML METHOD="get" 的表单,它由 doGet() 方法处理。
doGet方法的定义格式如下:
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException { // Servlet 代码 }
doPost() 方法
POST 请求来自于一个特别指定了 METHOD = "POST" 的 HTML 表单,它由 doPost() 方法处理。
doPost方法的定义如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
destroy() 方法
destroy 方法只会被调用一次,在 Servlet 生命周期结束时被调用,也就是服务器被关掉时调用,destroy 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动,在调用 destroy 方法之后,servlet 对象被标记为垃圾回收。
destroy 方法定义如下所示:
public void destroy() { // 终止化代码... }
使用 Servlet 读取表单数据
Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析(也就是请求,request 的重要方法):
- getParameter("参数名");//可以调用 request.getParameter() 方法来获取表单参数的值。
- getParameterValues("参数名");//如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
- getParameterNames("参数名");//如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。
- setCharacterEncoding("解码的字符集"); //设置请求的字符编码
- getMethod();//返回请求方式 get, post
- getRequestURI(); // 返回当前的请求路径
- getRemoteAddr();//获取访问者的ip地址
post 请求中的汉字会有乱码问题
原因:是因为浏览器解析编码使用的是iso-8859-1编码,会使中文编乱,因此要在getParameter 方法之前,调用setCharacterEncoding("字符编码"),这样可以解决该问题,请求和响应遇到乱码问题都可以通过设置字符编码解决问题。
代码演示
浏览器上显示日期,刷新会变动
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
//自定义路径,浏览器上显示的完整路径是http://localhost:8080/date
@WebServlet(urlPatterns = "/date")
public class MyServlet extends HttpServlet {
@Override
// req 请求 resp 响应
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应的字符编码
resp.setCharacterEncoding("utf-8");
// 告知浏览器,请浏览器用 utf-8 编码来显示
resp.setContentType("text/html;charset=utf-8");
Date date = new Date();
String html = "<html><body><h1>当前时间是:" + date + "</h1></body></html>";
// 将一段 html 作为响应内容,写入输出流,输出在浏览器
resp.getWriter().print(html); // iso-8859-1 英文字符集
}
}
结果
验证码的生成(动态图图片的生成)
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
//自定义的一个路径,在浏览器中打入,http://localhost:8080/servlet2就可以搜到结果,不过你确定服务器打开哟
@WebServlet(urlPatterns = "/servlet2")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 图片验证码
// 1. 创建图片对象, 构造参数分别代表 宽、高、图片格式
BufferedImage image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
// 2. 创建画布对象
Graphics2D g = image.createGraphics();
// 3. 填充画布
g.setColor(Colo