前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet入门笔记

Servlet入门笔记

作者头像
SuperHeroes
发布2019-03-12 14:47:32
5700
发布2019-03-12 14:47:32
举报
文章被收录于专栏:云霄雨霁云霄雨霁

Servlet架构:

Servlet用途:

读取客户端(浏览器)发送的数据,接收数据并处理过后将数据返回给客户端(浏览器),即用于实现服务端业务逻辑。

Servlet生命周期:

Servlet主要提供5个方法,而通常需要我们实现的方法只有两个:doGet()和doPost()方法。

init()方法:

只能被调用一次。在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。

一般Servlet在用户第一次调用对应于该Servlet的URL时创建,但也可以指定Servlet在服务器第一次启动的时候加载。

多个用户请求同一个URL时,不会创建多个Servlet,每一用户的请求都会创建一个新的线程,适当的时候移交给doGet()和doPost()方法。

service()方法:

service()方法是执行实际任务的主要方法。Servlet容器(Web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

service()方法不需要程序员来写,它由容器调用,并在适当的时候调用doGet()、doPost()、doPut()、doDelete()等方法。程序员只需要写doGet()和doPost()方法即可。

注意:Servlet采用多线程来处理多个请求的访问,默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间。

destroy()方法:

destroy()方法同样只会被调用一次,在Servlet生命周期结束时调用。可以在destroy()中处理关闭数据库连接、停止后台线程、把数据写入磁盘等操作。destroy()之后Servlet对象将被垃圾回收机制回收。

doGet()和doPost()方法:

用来处理客户端请求,根据客户端请求类型的不同调用不同的方法。详细情况如下。

Servlet处理表单:

doGet()方法:

例如有一个URL请求:http://localhost:8080/TomcatTest/HelloServlet?key1=value1&key2=velue2

这时Servlet会调用doGet()方法处理:

代码语言:javascript
复制
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 设置响应内容类型
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    // 处理中文
    String value1 =new String(request.getParameter("key1").getBytes("ISO8859-1"),"UTF-8");
    out.println("<!DOCTYPE html> \n" +
        "<html>\n" +
        "<body>\n" +
        "<ul>\n" +
        "  <li><b>key1</b>:" + value1 + "\n" +
        "  <li><b>key2</b>:" + request.getParameter("key2") + "\n" +
        "</ul>\n" +
        "</body></html>");
}

doPost()方法:

如果上面的请求指定的提交方式为POST(URL中不再拼接key-value对),那么Servlet会调用doPost()方法来处理。当然,业务逻辑一摸一样,所以doPost()方法完全可以如下:

代码语言:javascript
复制
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
    doGet(request, response);
}

注意:Servlet提供了三个方法来获取数据:

  • getParameter():获取表单参数的值。
  • getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
  • getParameterNames():返回当前请求中的所有参数的完整列表。

Servlet与HTTP:

HTTP请求:

HTTP请求中一些信息保存在http请求头中。这些信息不能直接被读取,需要通过HttpServletRequest 对象的特定方法来获取。

具体的HTTP头信息和HttpServletRequest获取方法可以查看相关文档,下面是一个实例:

代码语言:javascript
复制
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    // 设置响应内容类型
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE html> \n"+
    "<html>\n" +"<body>\n" +"<table>\n");
    Enumeration headerNames = request.getHeaderNames();
    while(headerNames.hasMoreElements()) {
        String paramName = (String)headerNames.nextElement();
        out.print("<tr><td>" + paramName + "</td>\n");
        String paramValue = request.getHeader(paramName);
        out.println("<td> " + paramValue + "</td></tr>\n");
    }
    out.println("</table>\n</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

HTTP响应:

通过 HttpServletResponse 对象相关方法可以设置返回时的HTTP头信息。相应的方法可以查看相关文档,下面是一个实例:

代码语言:javascript
复制
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException, IOException{
          // 设置刷新自动加载时间
          response.setIntHeader("Refresh", 5);
          // 设置响应内容类型
          response.setContentType("text/html;charset=UTF-8");
          //获得一个日历  
          Calendar cale = Calendar.getInstance();  
          //将Calendar类型转换成Date类型  
          Date tasktime=cale.getTime();  
          //设置日期输出的格式  
          SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
          //格式化输出  
          String nowTime = df.format(tasktime);
          PrintWriter out = response.getWriter();
          out.println("<!DOCTYPE html>\n" +
            "<html>\n" +"<body\n" +
            "<p>当前时间是:" + nowTime + "</p>\n"+"</body></html>");
 }
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
         doGet(request, response);
}

HTTP状态码:

HTTP有几十个状态码,如常见的400和404。Servlet可以设置状态码。通过HttpServletResponse 对象提供的一些方法来实现。

  • public void setStatus ( int statusCode ):该方法设置一个任意的状态码。
  • public void sendRedirect(String url):该方法生成一个 302 响应,连同一个带有新文档 URL 的 Location 头。
  • public void sendError(int code, String message):该方法发送一个状态码(通常为 404),连同一个在 HTML 文档内部自动格式化并发送到客户端的短消息。

一个示例:

代码语言:javascript
复制
//处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException{
      // 设置错误代码和原因
      response.sendError(407, "需要认证!" );
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
     doGet(request, response);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/06/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Servlet架构:
  • Servlet用途:
  • Servlet生命周期:
    • init()方法:
      • service()方法:
        • destroy()方法:
          • doGet()和doPost()方法:
          • Servlet处理表单:
            • doGet()方法:
              • doPost()方法:
              • Servlet与HTTP:
                • HTTP请求:
                  • HTTP响应:
                    • HTTP状态码:
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档