【Spring的基础:Servlet】:新手也能看得懂的Servlet【1】

 

概念

Servlet的生命周期

init()方法

Service()方法

destroy()方法

Servlet的实例

Servlet处理表单数据

表单数据

使用Servlet读取表单数据

将复选框的数据传递到Servlet程序

使用getParameterNames()读取所有表单参数


 

 

概念

Servlet是运行在Web服务器上的如Tomcat上的java程序,用于接受客户端的请求和并且生成动态的网页内容。

它是一个java的类,可以处理Http这样的请求,并且返回如HTML页面和JSON这样的数据给浏览器

可能这样说会有些抽象,我来搞个很具体化的例子

例子:

就好像点菜吧,我们作为顾客,去点菜,就好像浏览器对服务器发送了请求,而服务器就像Web容器(如Tomcat)把请求转发到真正处理请求的人手上,也就是我们的厨师(Servlet),厨师也就是Servlet处理完食材(数据)后把它再利用服务员(Tomcat Web容器)响应回去。

 

Servlet的生命周期

 

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

init()方法

init方法是servlet进行工作前的准备,它不管多少人来访问它都只有一次init操作,在有人来访问url对应的servlet时候才会初始化,当然也可以设置为服务器启动的时候就执行init操作

public void init() throws ServletException {
  // 初始化代码...
}

Service()方法

service方法就是执行实际任务的主要方法,servlet容器即web服务器就是调用service方法来处理来着客户端的请求的,并返回格式化的响应,会按照请求执行doGet、doPost、doPut、doDelete等方法

public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
}

一般来要写处理逻辑只要重载这些方法就好了

 

destroy()方法

当服务器关闭时(注意不是请求结束)会启动来释放资源,关闭线程,关闭数据库连接

调用这个方法后servlet对象会被标记成垃圾回收

  public void destroy() {
    // 终止化代码...
  }

 

//servlet生命周期,的三个方法,1.被创建,执行且只执行一次init方法,2.提供服务,执行service方法,执行多次 3.被销毁,当Servlet服务器正常关闭时,执行destroy方法,只执行一次。
     
     @Override
     public void init() throws ServletException {
         // TODO Auto-generated method stub
         super.init();
     }
     
     @Override
     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         // TODO Auto-generated method stub
         super.service(req, resp);
     }
     
     @Override
     public void destroy() {
         // TODO Auto-generated method stub
         super.destroy();
     }

 

Servlet的实例

servlet是一个接口,可以通过实现它来扩展功能,处理Http请求

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {
 
  private String message;

  public void init() throws ServletException
  {
      // 执行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html");

      // 实际的逻辑是在这里
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }
  
  public void destroy()
  {
      // 什么也不做
  }
}

 

 

 

Servlet处理表单数据

表单数据

表单数据是用户在网页上填写的信息,这些信息通过http请求发给服务器进行处理,如用户名,地址呀这些

 

通常通过POST和GET方式请求发送

俩者发送表单请求的区别

 

当我们用Post请求发送表单数据的时候可以指定表单数据的类型,也就是咱们开发的时候经常用到的

Content-Type

 

现在的开发几乎都是json发送一些小型信息

 

使用Servlet读取表单数据

如何使用Servlet读取表单数据呢?

Servlet获取表单数据有三个api来应对不同的场景

getParameter():当前端是单值字段(如文本框)这种只有单值的情景,就可以调用getParameter来获取这个单值,如果有多个值只获取第一个

getParameterValues():如果参数是类似复选框这种参数出现一次以上的,适合使用这个api获取多值

getParameterNames():如果想获取所有参数的完整的列表就用这个api,会遍历所有参数

 

从GET或者POST的URL获取表单数据

<!DOCTYPE html>
<html>
  <head>
    <title>GET 表单示例</title>
  </head>
  <body>
    <h2>请输入你的信息:</h2>
    <form action="hello" method="get">
      用户名:<input type="text" name="username"><br><br>
      年龄:<input type="text" name="age"><br><br>
      <input type="submit" value="提交">
    </form>
  </body>
</html>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // 设置响应类型
        response.setContentType("text/html;charset=UTF-8");

        // 获取请求中的参数
        String username = request.getParameter("username");
        String ageStr = request.getParameter("age");

        int age = 0;
        if (ageStr != null && !ageStr.isEmpty()) {
            age = Integer.parseInt(ageStr);
        }

        // 输出响应内容
        PrintWriter out = response.getWriter();
        out.println("<h2>你好," + username + "!</h2>");
        out.println("<p>你今年 " + age + " 岁。</p>");
    }
     // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

这是一个Demo,从GET或者POST请求的URL请求中获取表单数据

 

那如果是复选数据呢?

将复选框的数据传递到Servlet程序

<html>
<body>
<form action="CheckBox" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> 数学
<input type="checkbox" name="physics"  /> 物理
<input type="checkbox" name="chemistry" checked="checked" /> 
                                                化学
<input type="submit" value="选择学科" />
</form>
</body>
</html>
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class CheckBox extends HttpServlet {

    // 处理 GET 方法请求的方法
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
    throws ServletException, IOException
    {
        // 设置响应内容类型
        response.setContentType("text/html");

        PrintWriter out = response.getWriter();
        String title = "读取复选框数据";
        String docType =
        "<!doctype html public \"-//w3c//dtd html 4.0 " +       "transitional//en\">\n";
        out.println(docType +
                    "<html>\n" +
                    "<head><title>" + title + "</title></head>\n" +
                    "<body bgcolor=\"#f0f0f0\">\n" +
                    "<h1 align=\"center\">" + title + "</h1>\n" +
                    "<ul>\n" +
                    "  <li><b>数学标识:</b>: "
                    + request.getParameter("maths") + "\n" +
                    "  <li><b>物理标识:</b>: "
                    + request.getParameter("physics") + "\n" +
                    "  <li><b>化学标识:</b>: "
                    + request.getParameter("chemistry") + "\n" +
                    "</ul>\n" +
                    "</body></html>");
    }
    // 处理 POST 方法请求的方法
    public void doPost(HttpServletRequest request,
                       HttpServletResponse response)
    throws ServletException, IOException {
        doGet(request, response);
    }
}

使用getParameterNames()读取所有表单参数

通过使用getParametersNames方法读取所有的可用的表单参数,这个方法会返回一个枚举值,可以遍历

<!DOCTYPE html>
<html>
  <head>
    <title>getParameterNames 示例</title>
  </head>
  <body>
    <h2>请输入你的信息:</h2>
    <form action="print" method="get">
      用户名:<input type="text" name="username"><br><br>
      年龄:<input type="text" name="age"><br><br>
      爱好:
      <input type="checkbox" name="hobby" value="读书">读书
      <input type="checkbox" name="hobby" value="运动">运动
      <input type="checkbox" name="hobby" value="编程">编程
      <br><br>
      <input type="submit" value="提交">
    </form>
  </body>
</html>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PrintParamsServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {

        // 设置响应类型
        response.setContentType("text/html;charset=UTF-8");

        // 获取 PrintWriter 输出流
        PrintWriter out = response.getWriter();

        // 打印 HTML 页面头
        out.println("<h2>你提交的参数如下:</h2>");
        out.println("<ul>");

        // 获取所有参数名
        java.util.Enumeration<String> paramNames = request.getParameterNames();

        while (paramNames.hasMoreElements()) {
            String paramName = paramNames.nextElement();
            String[] paramValues = request.getParameterValues(paramName);

            out.print("<li>" + paramName + " : ");
            if (paramValues.length == 1) {
                out.print(paramValues[0]);
            } else {
                out.print("<ul>");
                for (String value : paramValues) {
                    out.print("<li>" + value + "</li>");
                }
                out.print("</ul>");
            }
            out.println("</li>");
        }

        out.println("</ul>");
        out.println("<a href='index.html'>返回</a>");
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值