java -- 简单的Servlet 与 JSP的介绍及应用(Servlet 与 JSP的生命周期、EL表达式、生成动态内容及引入标签库,验证码的生成)

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值