[学习笔记] JSP/Servlet技术之Servlet基础

# 学习 # · 2020-09-23

Servlet简介

1、Servlet是一个符合特定规范的Java程序,是一个基于Java技术的Web组件。Servlet运行在服务器端,由Servlet容器所管理,用于处理客户端请求并作出响应。

2、Servlet容器:也称Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务。

3、Servlet的作用:生成动态的内容,可以接受和处理请求,并动态生成HTML内容对客户端进行响应。

4、Servlet与JSP的关系:JSP在运行时会被Web容器翻译为一个Servlet,动态响应内容是通过运行这个Servlet类而产生的。Servlet是JavaWeb动态交互技术的关键组件,也是JSP技术的基础,容器在运行JSP时,需要先将其内容翻译成Servlet语法,再按照Servlet的方式运行。


Servlet API

1、Servlet体系结构:接口(Servlet+ServletConfig) + 实现类(GenericServlet+HttpServlet)。

2、Servlet接口:定义了所有Servlet需要实现的方法。

public abstract void init(ServletConfig config);    //由Servlet容器调用,用于完成Servlet对象在处理客户请求前的初始化工作
public abstract void service(ServletRequest req, ServletResponse res);    //用于处理客户端的请求
public abstract void destroy();    //释放Servlet对象所使用的资源
public abstract ServletConfig getServletConfig();    //返回ServletConfig对象
public abstract String getServletInfo();    //返回有关Servlet的信息

3、GenericServlet抽象类:实现Servlet接口和ServletConfig接口。

public void init(ServkletConfig config);
public String getInitParameter(String name);    //获取web.xml中设置的以name命名的初始化参数值
public ServletContext getServletContext();    //返回ServletContext对象的引用

4、HttpServlet抽象类:处理HTTP协议的请求和响应。

public void service(ServletRequest req, ServletResponse res);
protected void service(HttpServletRequest req, HttpServletResponse res);    //接收HTTP请求,并将他们分发给此类中定义的doXxx()方法
protected void doXxx(HttpServletRequest req, HttpServletResponse res);    //根据请求方式的不同分别定义的处理方法,如doGet()、doPost()等

5、ServletConfig接口:在Servlet初始化期间向其传递配置信息。

public String getInitParameter(String name);    //获取web.xml中设置的以name命名的初始化参数值
public ServletContext getServletContext();    //返回Servlet的上下文对象引用

6、ServletContext接口:一个ServletContext接口的实例表示一个Web应用的上下文,Servlet使用ServletContext接口定义的方法与他的Servlet容器进行通信。

public String getInitParameter(String name);    //获取系统范围的名称为那么多初始化参数值,系统范围的初始化参数可以在部署描述符中使用<context-param>元素定义
public void setAttribute(String name, Object object);    //设置名称为name的属性
public Object getAttribute(String name);    //获取名称为name的属性
public String getRealPath(String path);    //返回参数所代表目录的真实路径
public void log(String message);    //记录一般日志信息

7、ServletRequest接口:获取客户端的请求数据。

public abstract Object getAttribute(String name);    //获取名称为name的属性值
public abstract void setAttribute(String name, Object object);    //在请求中保存名称为name的属性
public abstract void removeAttribute(String name);    //清除请求中名字为name的属性
public abstract String getCharacterEncoding();    //返回请求体所使用的字符编码
public abstract void setCharacterEncoding(String charset);    //设置请求体的字符编码
public abstract String getParameter(String name);    //返回指定请求参数的值
public abstract String[] getParameterValues(String name);    //返回指定请求参数的全部值
public abstract RequestDispatcher getRequestDispatcher(String path);    //返回指定指向路径的请求分发对象

8、HttpServletRequest接口:获取客户端的请求数据和读取请求信息。

public abstract String getContextPath();    //返回请求URI中表示请求上下文的路径,上下文路径是请求URI的开始部分
public abstract Cookie[] getCookies();    //返回客户端在此次请求中发送的所有cookie对象
public abstract HeepSession getSession();    //返回和此次请求相关联的session,如果没有则新建
public abstract String getMethod();    //返回此次请求所使用的HTTP方法的名字,如GET、POST
public abstract String getHeader(String name);    //获取指定的请求头信息

9、ServletResponse接口:发送响应数据。

public abstract PrintWriter getWriter();    //返回PrintWriter对象,用于向客户端发送文本
public abstract String getCharacterEncoding();    //返回在响应中发送的正文所使用的字符编码
public abstract void setCharacterEncoding(String charset);    //设置发送到客户端的响应的字符编码
public abstract void setContentType(String type);    //设置发送到客户端响应的内容类型

10、HttpServletResponse接口:对客户端的请求执行响应。

public abstract void addCookie(Cookie cookie);    //增加一个cookie到响应中
public abstract void addHeader(String name, String value);    //添加一个响应报头到响应中
public abstract void sendRedirect(String location);    //发送一个临时的重定向响应到客户端
public abstract void encodingURL(String url);    //使用sessionID对用于重定向的URL进行编码

Servlet应用

1、创建Servlet:导入Servlet所需要的包,自定义类继承HttpServlet,重写doPost()或doGet()方法。

package  cn.store.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

//自定义HttpServletTest类,继承HttpServlet
public class HttpServletTest extends HttpServlet {
    //重写doGet方法
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uName = request.getParameter("uName");
        //设置响应内容的类型并指定字符集,防止中文内容出现乱码
        response.setContentType("text/html;charset=UTF-8");
        //PrintWriter可以直接调用write()或print()方法,把字符串作为参数写入
        PrintWrite out = response.getWriter();
        out.println("你好," + uName);

        out.flush();    //清空缓冲区的数据流
        out.close();      //关闭读写流
    }

    //重写doPost方法
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //把处理代码写在doGet()中,在doPost()方法中调用doGet()方法
        doGet(request, response);
    }

}

2、部署Servlet:在web.xml文件中配置Servlet。

<!--
servlet节点:把Servlet全类名(包名+类名)映射到一个内部名称
servlet-mapping节点:将某个URL映射到Servlet的内部名称
-->
<servlet>
    <servlet-name>Servlet的名称(唯一性)</servlet-name>
    <servlet-class>Servlet类的完全限定名</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Servlet名称(与上同)</servlet-name>
    <url-pattern>指定Servlet的URL</url-pattern>
</servlet-mapping>

3、访问Servlet:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
    <!--action的地址即为配置中的url-pattern指定的URL-->
    <form action="HttpServletTest" method="post">
        姓名:<input type="text" name="uName" />
        <input type="submit" value="提交" />
    </form>
</html>

Servlet的生命周期

1、Servlet通过调用init ()方法进行初始化。init()方法只调用一次。

2、Servlet调用service()方法来处理客户端的请求。

3、Servlet通过调用destroy()方法终止/结束。destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。

4、在调用 destroy() 方法之后,servlet对象被标记为垃圾回收。最后,Servlet 是由JVM的垃圾回收器进行垃圾回收的。


初始化参数及访问应用上下文

1、定义Servlet初始化参数:

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>demo.servlet.HelloServlet</servlet-class>
    <!--param-name定义初始化参数名称,param-value定义初始化参数值-->
    <init-param>
        <param-name>initParam</param-name>
        <param-value>Hello Servlet</param-value>
    </init-param>
</servlet>

2、获得Servlet初始化参数:

//省略其他代码
public void init() {
    System.out.println("初始化时init()方法被调用");
}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    System.out.println("处理请求时doGet()方法被调用");
    //通过GenericServlet中定义的getInitParameter方法获取初始参数值
    String initParam = getInitParameter("initParam");
    System.out.println("初始化参数:" + initParam);
}

3、定义上下文参数:

<context-param>
    <param-name>参数名称</param-name>
    <param-value>参数值</param-value>
</context-param>

4、获得上下文参数:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    System.out.println("处理请求时doGet()方法被调用");
    String contextParam = this.getServletContext().getInitParameter("contextParamName");
    System.out.println("上下文参数:" + contextParam);
}
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/120/

评论