Servlet

Servlet

Servlet API

Servlet API 中有4个Java包:
1. javax.servlet:定义Servlet和Servlet容易之间契约的类和接口。
2. javax.servelt.http:定义Http Servlet和Servlet容易之间契约的类和接口。
3. javax.servlet.annotation:包含对Servelt、Filter和Listener进行标注的注解。以及为标注元件指定元数据。
4. javax.servlet.descriptor:包含为Web应用程序的配置信息提供编程式访问的类型。

Servlet技术的核心是Servlet接口。

Servlet接口定义了Servlet与Servlet容器之间的一个契约。把Servlet类加载到内存中,并在Servlet实例中调用特定的方法。(在一个应用程序中,每个Servlet类型只能有一个实例)

用户的请求引发Servlet调用一个Servlet的service方法,并给这个方法传入一个ServletRequest实例和一个ServletResponse实例。


ServletRequest:封装当前的Http请求,以便开发者不需要解析和操作原始的HTTP数据。

ServletResponse:封装当前用户的HTTP响应,使得将响应回传给用户更容易。

Servlet容易为每个应用程序创建一个ServletContext实例。ServletContext封装context的环境细节。每个context只有一个ServletContext。每个Servlet实例还有一个封装Servlet配置信息的ServletConfig。


Servlet接口

Servlet接口定义了5个方法:

void init(ServletConfig config)throws ServletException;

void service(ServletRequest request,ServletResponse response)throws ServletEception,java.io.IOException

void destroy();

java.lang.String getServletInfo();

ServletConfig getServletConfig();

void init(ServletConfig var1) throws ServletException;

ServletConfig getServletConfig();

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

String getServletInfo();

void destroy();

init、service和destroy方法属于Servlet生命周期方法。

getServletInfo和getServletConfig为非生命周期方法:

  1. getServletInfo:该方法返回Servlet的描述。可以返回可能有用的任意字符串。甚至是null。
  2. getServletConfig:该方法放回由Servlet容器传给init方法的ServletConfig。

Servlet线程安全性

所有用户公用一个Servlet实例,因此不建议使用类级变量(全局变量),除非它们是只读的,或者是java.util.concurrent.atomic包中的成员。

基础Servlet应用程序的编写

@WebServlet(name = "MyServlet", urlPatterns = {"/my"})

用WebServlet注解类型来声明一个Servlet。在声明Servlet的同时,还可以告诉容器是哪个URL调用这个Servlet。

URL模式必须以一条正斜线开头。

Servlet的init方法调用一次,并将private transient变量servletconfig设置成传给该方法的ServletConfig对象。

private transient ServletConfig servletConfig;

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

transient关键字:

Q:transient关键字能实现什么?

A:当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。例如,当反序列化对象——数据流(例如,文件)可能不存在时,原因是你的对象中存在类型为java.io.InputStream的变量,序列化时这些变量引用的输入流无法被打开。

应用程序的目录结构

WEB-INF:

  1. classes
  2. lib:Servlet应用程序所需的jar文件。Servlet API jar 文件则不需要部署在这里,Servlet容器中已经包含了这些Servlet API。

JSP页面、HTML文件、图像文件以及其他资源都应该放在应用程序子目录下(用户可以访问)。如果希望某个资源可以被Servlet访问,但是不能被用户访问,那么应该把它放在WEB-INF目录下面。

部署

可以将应用程序目录直接放到Tomcat安装目录下方的webapps目录下。也可以通过Tomcat的conf目录下编辑server.xml文件来部署应用程序;或者为了不用编辑server.xml,单独部署一个XMl文件到conf\Catalina\localhost目录下。

建议打包为war包然后复制war文件到webapps目录下。

ServletRequest接口

对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将它传给Servlet的serice方法。ServletRequest封装有关请求的信息。

    //返回请求主体中的字节数。如果不知道字节的长度,该方法返回-1
    int getContentLength();

    //返回请求主体中的MIME类型,如果不知道则返回null
    String getContentType();

    //返回指定请求参数的值
    String getParameter(String var1);

    //返回这个HTTP请求的协议名称和版本号
    String getProtocol();

getParameter是ServletRequest中最常用的方法。该方法常用来返回一个HTML表单域的值。
getParameter也可以用来获取查询字符串的值。

eg:下面这个URI调用一个Servlet:

http://domain/context/servletName?id=123

可以在Servlet中利用下面的语句来获取id的值:

String id = request.getParameter("id");

如果参数不存在则返回null。

除了getParameter之外,还可以利用getParameterNames、getParameterMap和getParameterValues来获取表单域的名称和值,以及查询字符串。

ServletResponse接口

javax.servlet.ServletResponse接口表示一个Servlet响应。在调用一个Servlet的service方法之前,Servlet容器会先创建一个ServletResponse,并将它作为第二个参数传给service方法。隐藏了将响应发给浏览器的复杂性。

ServletResponse中定义的其中一个方法是getWriter方法,它返回可以将文本传给客户端的java.io.PrintWriter。默认情况下,PrintWriter对象采用ISO-8859-1编码。

还有一个方法可以用来将输出传给浏览器:getOutputStream。但是,这个方法用于传输二进制数据。大多数情况下,还是使用getWriter。

在发送任何HTML标签之前,应该先调用setContextType方法设置响应的内容类型,比如,将text/html作为参数传递,这是在告诉浏览器内容类型为HTML。若没有设置内容类型,有些浏览器将标签显示为普通文本。

ServletConfig接口

Servlet容器初始化Servlet时,Servlet容器将ServletConfig传给init()。ServletConfig通过@WebServlet或者部署描述符传给一个Servlet的配置信息(初始参数)。

初始参数有两个组成部分:键和值

为了从一个Servlet内部获取某个初始参数的值,应该在由Servlet容器传给Servlet的init()的ServletConfig中调用getInitParameter方法。

String getInitParameter(String name)

getInitparameterNames方法则是返回所有出事参数名称的一个Enumeration:

Enumeration<String> getInitParameterNames()

eg:要获取contactName参数值:

String contactName = servletConfig.getInitParameter("contactName");

ServletContext接口

ServletContext表示Servlet应用程序。每个Web应用程序只有一个context。在分布式环境中,一个应用程序同时部署到多个容器中,且每台Java虚拟机都有一个ServletContext对象

在ServletConfig中调用getServletContext方法可以获得ServletContext。

ServletContext可以共享应用程序所有的资源访问信息,促进Web对象的动态注册。

处理属性的方法:

Object getAttribute(String var1);

Enumeration<String> getAttributeNames();

void setAttribute(String var1, Object var2);

void removeAttribute(String var1);

GengericServlet抽象类

实现了Servlet和ServletConfig

将init方法中的ServletConfig赋给一个类级变量,使它可以通过代用getServletConfig来获取

为Servlet接口中的所有方法提供默认实现

提供方法来包装ServletConfig中的方法

GenericServlet通过在init方法中将ServletConfig对象赋给一个类级变量servletConfig,实现对ServletConfig的保存。

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

如果类中覆盖了这个方法,则调用Servlet中的init方法,并且必须调用super.init(servletConfig)来保存ServletConfig。为了避免这么做,GenericServlet又另外提供了一个不带参数的init方法。当把ServletConfig赋给servletConfig之后,这个方法就会被第一个init方法调用:

    public void init(ServletConfig servletConfig)throws ServletException{
        this.servletConfig = servletConfig;
        this.init();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值