初识Servlet生命周期及核心API

Servlet概述
首先得知道,Servlet=Server+Applet,Servlet主要用于处理各种业务逻辑,它比JSP更具有业务逻辑层的意义。
最初的JSP开发模式为:JSP+JavaBean,慢慢演变为:JSP+JavaBean+Servlet。
Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序,除了Java Servlet API,它还可以用于扩展和添加API的Java类软件包。


Servlet功能
Servlet通过创建一个框架扩展服务器的能力,以在web上提供请求和响应服务,当客户端发送请求至服务器时,服务器可以将请求信息发送给Servlet,并让其建立服务器返回给客户端的响应。当启动web服务器和客户端第一次请求服务时,可以自动装入Servlet,之后Servlet继续运行直至其他客户端发生请求。
这里写图片描述

Servlet的主要功能:

  • 创建并返回一个基于客户请求性质的动态内容的完整HTML页面。
  • 创建可嵌入到现在HTML页面中的部分HTML页面(HTML片段)。
  • 与其他服务器资源(包括数据库和基于Java的应用程序)通信。
  • 用多个客户端处理连接,接收多个客户端的输入,并将结果传递到多个客户端,例如:Servlet可以是多参与者的游戏服务器。
  • 当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至Applet的新连接,并将该连接保持打开状态;当允许客户端和服务器简单且高效的执行会话的情况下,Applet也可以启动客户浏览器和服务器之间的连接,可以通过定制协议来通信。
  • 将定制的处理提供给所有服务器的标准程序,如Servlet可以修改如何认证用户。
  • -

Servlet特点
Servlet技术最大的优势就是可以处理客户端传来的HTTP请求,并返回一个响应。

  • 高效:在服务器上仅有一个Java虚拟机在运行,其优势在于当多个来自客户端的请求访问时,Servlet为每个请求分配一个线程,而不是进程。
  • 方便:Servlet提供了大量的使用工具例程,如:处理很难完成的HTML表单数据、读取和设置HTTP头,以及处理Cookie和跟踪会话。
  • 跨平台:Servlet用Java编写。
  • 功能强大:Servlet可以直接与web服务器交互,还能再各个程序间共享数据,使得数据库连接池之类的功能很容易实现。
  • 灵活性和可扩展性
  • 共享数据
  • 安全

Servlet的生命周期
Servlet部署在容器里,生命周期由容器管理。
1)当用户请求Servlet服务时或启动web服务器时,容器环境加载一个Java Servlet类。
2)容器环境将根据用户请求创建一个或者多个Servlet对象实例,并将这些实例加入到Servlet实例池中。
3)容器环境调用Servlet的初始化方法HttpServlet.init(ServletConfig config)完成初始化,这是需要传递参数,其中包含初始化参数和容器环境的信息,并负责向Servlet传递数据。如果传递失败,则会抛出ServletException异常,Servlet将不能正常工作。
4)容器环境利用一个HttpServletRequest和HttpServletResponse对象封装从Web容器接收到的HTTP请求和有Servlet生成的响应。
5)环境容量把HttpServletRequest和HttpServletResponse对象传递给HttpServlet.service()方法,service()可被多次调用,各调用过程在不同的线程,互不干扰。
6)定制的Java Servlet从HttpServletRequest对象读取HTTP请求数据,访问来自HTTPSession或Cookie对象的状态信息,执行特定应用的处理并且用HttpServletResponse对象生成HTTP响应数据。
7)当web服务器和容器关闭时会自动调用HttpServlet.destroy()方法关闭所有打开的资源。


Servlet核心API

  • Servlet接口
//Servlet在处理客户端的请求时调用此方法
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
//当Servlet容器移除Servlet对象时调用此方法,以释放资源
    public void destroy()   
//用于获取Servlet对象的配置信息,返回ServletConfig对象
    public ServletConfig getServletConfig()    
//返回有关Servlet的信息,是纯文本格式的字符串
    public String getServletInfo()     
  • HttpServlet类
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException  //处理请求类型为GET的Http请求的处理方法
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException //处理请求类型为Post的Http请求的处理方法
  protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException //处理请求类型为Put的Http请求的处理方法
  • HttpServletRequest接口
//常用方法
 public Cookie[] getCookies()    //返回所有Cookie对象
 public String getMethod()       //返回HTTP请求类型
 public String getContextPath()  //返回上下文路径
 public String getQueryString()  //返回请求的查询字符串
 public String getRequestURI()   //返回主机名到请求参数之间的部分字符串
 public HttpSession getSession() //返回与主机关联的HttpSession对象
  • HttpServletResponse接口
 //常用方法
 public void addCookie(Cookie cookie)   //向客户端发送Cookie信息
 public void sendError(int i) throws IOException  //发送一个错误状态码为i的错误响应到客户端
 public void sendError(int i, String s) throws IOException  //发送一个错误状态码为i的错误响应到客户端
 public void sendRedirect(String s) throws IOException   //将客户端请求重定向到新的URL

Servlet的配置
Servlet的配置有两种方法,一种是在web.xml文件中配置,另一种是采用注解配置

在web.xml文件中配置:

   <!--注册servlet-->
    <servlet>
        <!--servlet的名称-->
        <servlet-name>helloServlet</servlet-name>
        <!--servlet的完整类名-->
        <servlet-class>com.java.model.helloServlet</servlet-class>
    </servlet>
    <!--servlet映射-->
    <servlet-mapping>
        <!--servlet的名称-->
        <servlet-name>helloServlet</servlet-name>
        <!--访问URL地址-->
        <url-pattern>/hello123</url-pattern>
    </servlet-mapping>

采用注解配置:

@WebServlet("/hello123")
public class helloServlet extends HttpServlet {
........
}

Servlet处理表单数据

下面就用一个小例子来说明,主要功能为:helloServlet类处理login.jsp表单中的信息

helloServlet类:

package com.java.model;

import javax.servlet.*;
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.io.PrintWriter;

/**
 * Created with IntelliJ IDEA.
 * Created by YEN on 2016/7/10 and 13:13.
 */

//采用注解配置
@WebServlet("/hello123")
public class helloServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("................init(ServletConfig config)........");
    }

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("................init()............................");
    }

    //Servlet在处理客户端的请求时调用此方法
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//        super.service(req, res);
        PrintWriter pw=res.getWriter();
        pw.print("hello service !");
        pw.close();
        System.out.println("................service............................");
        System.out.println(req.getParameter("username")+"........service");
        System.out.println(req.getParameter("password")+"........service");
    }
    //当Servlet容器移除Servlet对象时调用此方法,以释放资源
    @Override
    public void destroy() {
        super.destroy();
        System.out.println("................destroy............................");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        //获取username password参数
        String name=req.getParameter("username");
        String pass=req.getParameter("password");
        //从response中获取PrintWriter对象
        PrintWriter printWriter=resp.getWriter();
        printWriter.write(name+"..................."+pass);
        printWriter.flush();//刷新printWriter
        printWriter.close();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println(req.getParameter("password")+"........doPost");
    }

}

login.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: YEN
  Date: 2016/7/9
  Time: 16:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script>
        function checkForm() {
            if(document.getElementById("username").value==null || document.getElementById("username").value==""){
                  alert("用户名不能为空!");
                  return false;
              }
            if(document.getElementById("password").value==null || document.getElementById("password").value==""){
                alert("密码不能为空!");
                return false;
            }
            return true;
        }
    </script>
</head>
<body>
<form name="form1" action="<%=request.getContextPath()%>/hello123" method="get" onsubmit="return checkForm()">
    username:<input type="text" name="username" id="username">   <br>
    password:<input type="password" name="password" id="password">   <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

运行结果如下:
一:在login.jsp中输入登陆信息
这里写图片描述
二:点击登陆按钮后
这里写图片描述
三:查看IntelliJ IDEA中的运行结果
这里写图片描述

至此,一个Servlet的应用就完成了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值