Servlets(1)

Servlet API 有以下4个Java包

1、javax.servlet 定义Servlet和Servlet容器之间契约的类和接口。

2、javax.servlet.http 定义HTTPServlet 与 Servlet 容器之间契约的类和接口

3、javax.servlet.annotation 包含标注Servlet Fileter Listener的标注。还为被标注元件定义元数据。

4、javax.servlet.descriptor 包含提供程序化登录web应用程序的配置信息的类型。

Servlet 接口中定义的5个方法:

文件 Servlet.class

public interface Servlet {
void init(ServletConfig var1) throws ServletException;

//当该 Servlet 第一次被请求时调用,在后续请求时不再调用

//用于初始化工作,当调用此方法时,Servlet容器会传入一个ServletConfig.

//可以将ServletConfig赋给一个类级变量,因此这个对象可通过Servlet类中的其他点来使用

ServletConfig getServletConfig();

//返回由Servlet容器传给init方法的ServletConfig。

//为了让此方法返回一个非null值,必须将传给init方法的ServletConfig赋给一个类级变量。

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

//每当请求Servlet时,就会调用此方法

String getServletInfo();
//返回Servlet的描述,可以返回null或有用的任意字符串


void destroy();

//销毁Servlet时,调用此方法

//当卸载应用程序,或者关闭Servlet容器时,就会发生

//一般在此编写清除代码
}
 

按照惯例,Servlet类的名称要以Servlet作为后缀。

一个Servlet类
 

package cn.tzsk;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;

import java.io.IOException;
@WebServlet(name="DemoServlet",urlPatterns = {"/DemoServlet"})
/*WebServlet 标注类型用来声明一个Servlet

name 属性可选,一般为Servlet类名称

urlPatterns 可选,但一般都有,用于调用Servlet路径 也可以直接写@WebServlet(“/DemoServlet”); URL样式必须用一个正斜杠开头

*/



public class DemoServlet implements Servlet {
private transient ServletConfig servletConfig;

/* 定义非序列化对象
为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信 息对应的变量就可以加上transient关键字。
换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
*/



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

ServletRequest 接口中的方法:

int getContentLength();

//返回请求主体的字节数。如果不知道字节长度,返回 -1

String getContentType();

//返回请求主体的MIME类型。如果不知道类型,返回 null

/*

媒体类型(通常称为 Multipurpose Internet Mail Extensions  MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式

浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理URL,因此Web服务器在响应头中添加正确的MIME类型非常重要。如果配置不正确,浏览器可能会曲解文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。

MIME的组成结构非常简单;由类型与子类型两个字符串中间用'/'分隔而组成。不允许空格存在。

组成结构type/subtype

type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。大小写不敏感

text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript

String getParameter(String var1);

//返回指定请求参数的值,如参数不存在返回null

String getProtocol();

//返回这个Http 请求的协议名称和版本

ServletResponse 接口

表示一个Servlet响应。在调用Servlet的Service方法前,Servlet首先创建一个ServletResponse,并将它作为第二个参数传给Service方法。

在发送任何HTML标签前,应该先调用setContentType方法,设置响应的内容类型,并将

“text/html” 作为一个参数传入。

例:servletResponse.setContentType("text/html");

ServletConfig

当Servlet 容器初始化Servlet时,Servlet容器会给Servlet的init方法传入一个ServletConfig.

传入的每一条参数都有 Key及Value两个元件

其中方法:

String getServletName();

ServletContext getServletContext();

String getInitParameter(String var1); //获取参数值

Enumeration<String> getInitParameterNames(); //获取所有参数名称

示例:
 

package cn.tzsk;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;

import java.io.IOException;
import java.io.PrintWriter;

//在WebServlet中定义初始参数
@WebServlet(name="DemoServlet",urlPatterns = {"/DemoServlet"},
initParams = {
@WebInitParam(name="admin",value="Harry Taciak"),
@WebInitParam(name="email",value = "admin@example.com")
}
)

public class DemoServlet implements Servlet {
private transient ServletConfig servletConfig;

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


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

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

writer.println("<br/>长度: "+servletRequest.getContentLength());
writer.println("<br/>MIME类型 : "+servletRequest.getContentType());
writer.println("<br/>协议名称与版本 : "+servletRequest.getProtocol());
writer.println("<br/>参数值 : "+servletRequest.getParameter("ID"));
}

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

@Override
public void destroy() {

}
}

上一篇:PMD - 用 XPath 开发代码规则


下一篇:Java-自动修复PMD错误.可能吗?