Servlet入门笔记

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()方法处理:

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()方法完全可以如下:

// 处理 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获取方法可以查看相关文档,下面是一个实例:

// 处理 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头信息。相应的方法可以查看相关文档,下面是一个实例:

// 处理 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 文档内部自动格式化并发送到客户端的短消息。

一个示例:

//处理 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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值