A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 随性 初级黑马   /  2019-9-6 16:30  /  1172 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Servlet
servlet API概述

该API中一共包括四个包:

javax.servlet、javax.http、javax.servlet.annotation、javax.servlet.descriptor

用户的请求会引发servlet容器调用一个servlet的service方法,并给这个方法传入一个servletRequest实例和servletResponse实例,request封装http请求,response封装http响应

servlet容器会为每一个应用创建一个servletContext实例,这个对象用于封装应用程序的环境(配置文件什么的)

同时,servlet容器会为每个servlet创建一个ServletConfig实例,该实例封装的是servlet的配置信息

注意区分ServletContext和ServletConfig,一个是应用程序,一个是servlet,前者的作用范围明显要大于后者

servlet有以下五个主要方法
生命周期方法有三个:

init(servletconfig config)
service
destory
另外两个为:
getServletInfo
返回该servlet的描述
getServletConfig
返回由servlet容器传递给init方法的servletconfig对象
线程安全:
一个应用程序中的所有用户共享一个servlet实例,因此不建议使用类级变量(就是全局变量,static修饰的那种)
编写servlet应用
需要注意的一点是:xml文件并不是必须的,可以使用@WebServlet的形式代替web.xml,如下所示,不过要知道的是,在tomcat7才有javax.servlet.annotation这个API
package app01a;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

@WebServlet(name = "ServletConfigDemoServlet",
    urlPatterns = { "/servletConfigDemo" },
    initParams = {
        @WebInitParam(name="admin", value="Harry Taciak"),
        @WebInitParam(name="email", value="admin@example.com")
    }
)
public class ServletConfigDemoServlet implements Servlet {
    private transient ServletConfig servletConfig;

    @Override
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    @Override
    public void init(ServletConfig servletConfig)
            throws ServletException {
        this.servletConfig = servletConfig;
    }

    @Override
    public void service(ServletRequest request,
            ServletResponse response)
            throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        String admin = servletConfig.getInitParameter("admin");
        String email = servletConfig.getInitParameter("email");
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.print("<html><head></head><body>" +
                "Admin:" + admin +
                "<br/>Email:" + email +
                "</body></html>");
    }

    @Override
    public String getServletInfo() {
        return "ServletConfig demo";
    }
   
    @Override
    public void destroy() {
    }   
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
这样也是可以正常运行的:



稍微解释以下@WebServlet的用法
name = "ServletConfigDemoServlet",
urlPatterns = { "/servletConfigDemo" },
1
2
声明了当url为/servletConfigDemo时,应该调用这个servlet,这个其实和xml形式的声明是差不多的

<servlet>
                <servlet-name>Ch3 Beer</servlet-name>
                <servlet-class>
                        com.example.web.BeerSelect
                </servlet-class>

        <servlet-mapping>
                <servlet-name>Ch3 Beer</servlet-name>
                <url-pattern>/SelectBeer.do</url-pattern>
        </servlet-mapping>
</servlet>
1
2
3
4
5
6
7
8
9
10
11
这个xml意思是当url为/SelectBeer.do时,调用com.example.web.BeerSelect

可以看到,使用注解的方式更加地简洁

上面有一个关键字transient,这里有必要稍微解释一下:
https://blog.csdn.net/include_heqile/article/details/90453547

保存在servletContext中的对象称为属性,servletContext提供了下面四个方法来用于处理属性:

getAttribute
getAttributeNames
setAttribute
removeAttribute
servletContext的作用域比较大,我们可以使用该对象的这一特性,来在web应用的不同servlet中共享信息

在上面我们编写的类是直接继承的Servlet,但是这样做我们需要实他的5个方法,而且还有维护一个servletConfig对象,这样会显得很麻烦,还好我们有GenericServlet,GenericServlet是一个抽象类,它实现了Servlet和ServletConfig,并对Servlet接口中的所有方法提供了默认实现,并提供了用来包装ServletConfig的方法

package app01a;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;package app01a;
import java.io.IOException;

@WebServlet(name = "GenericServletDemoServlet",
    urlPatterns = { "/generic" },
    initParams = {
        @WebInitParam(name="admin", value="Harry Taciak"),
        @WebInitParam(name="email", value="admin@example.com")
    }
)
public class ServletConfigDemoServlet extends GenericServlet {
   
    private static final long serialVersionUID = 62500890L;

    @Override
    public void service(ServletRequest request,
            ServletResponse response)
            throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        String admin = servletConfig.getInitParameter("admin");
        String email = servletConfig.getInitParameter("email");
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.print("<html><head></head><body>" +
                "Admin:" + admin +
                "<br/>Email:" + email +
                "</body></html>");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
使用额GenericServlet类的代码要比上面的直接实现Servlet接口的代码要干净很多

我们不需要自己保存ServletConfig对象,因为GenericServlet帮我们做了,我们也不需要实现所有的生命周期方法

我们需要做的仅仅是在service方法中编写我们的实现即可

现在我们来谈一谈Servlet API中的第二个包,javax.servlet.http
javabean
javabean属性
simple
get
set
就是普通成员变量的set和get方法

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马