JavaWeb中Servlet解析

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

创建一个Servlet

  1. 创建一个类,继承HttpServlet接口

    public class MyServlet implements HttpServlet{}
  2. web.xml文件中配置Servlet

    <!-- 配置和映射 Servlet -->
    <servlet>
    <!-- 注册的 Servlet 名字 -->
    <servlet-name>MyServlet</servlet-name>
    <!-- Servlet 的全类名 -->
    <servlet-class>com.javaweb.MyServlet</servlet-class>
    </servlet>
    

    Servlet默认在第一次请求调用时被创建,但可以在配置Servlet时通过load-on-startup指定Servlet被创建的时机。若为负数或未指定, 则在第一次请求时被创建。若为 0 或正数, 则在当前 WEB 应用被Serlvet容器加载时创建实例, 且数值越小越早被创建(代表的是优先级,而非启动延迟时间)。

    <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.javaweb.MyServlet</servlet-class>
       <load-on-startup>2</load-on-startup>
    </servlet>
  3. web.xml中映射Servlet

    <servlet-mapping>
    <!-- 配置的Servlet名 -->
    <servlet-name>MyServlet</servlet-name>
    <!-- 映射的访问路径: / 代表当前 WEB 应用的根目录 -->
    <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>

    同一个Servlet可以绑定到多个URL上,可通过多个映射绑定同一个Servlet,或者在映射中使用*通配符。使用*通配符时,只有两种固定的格式:一种是.扩展名,另一种是以/开头并以/*结尾。通配符匹配原则

    • 相似度越高,匹配度越高
    • *.后缀名的优先级最低
  4. 配置Servlet也可以通过注解的方式

    @WebServlet(description = "MyServlet", urlPatterns = { "/*" })
    public class MyServlet implements HttpServlet{}
  5. 例如

    com.javaweb.MyServlet.java

    package com.javaweb;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyServlet extends HttpServlet {
    public MyServlet() {
        super();
        System.out.println("myservlet create...");
    }
    public void init() {
        System.out.println("init...");
    }
    public void service(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("service...");
    }
    public void destroy() {
        System.out.println("destroy...");
    }
    
    }

    web.xml

    <servlet>
       <servlet-name>MyServlet</servlet-name>
       <servlet-class>com.javaweb.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
       <servlet-name>MyServlet</servlet-name>
       <url-pattern>/*</url-pattern>
    </servlet-mapping>

Servlet生命周期

  1. 构造器方法

    第一次请求Servlet时调用

  2. init()

    创建好实例后立即被调用

  3. serivice()

    每次请求都会调用 service 方法. 实际用于响应请求

  4. destroy()

    当前 Servlet 所在的 WEB 应用被卸载前调用。用于释放当前 Servlet 所占用的资源.

  5. 由JVM的垃圾回收器回收

上面的例子在控制台的输出过程为:

myservlet create...
init...
service...
destroy...

初始化参数

在配置Servlet时可以设置一些初始化参数,例如:

<init-param>
    <!-- 参数名 -->
    <param-name>user</param-name>
    <!-- 参数值 -->
    <param-value>username</param-value>
</init-param>

Servlet中可以通过ServletConfig的两个方法获取到初始化参数

  1. getInitParameter(String name):获取指定参数名的初始化参数
  2. getInitParameterNames():获取参数名组成的Enumeration对象

例如:

ServletConfig servletConfig = this.getServletConfig();
String user = servletConfig.getInitParameter("user");
System.out.println("user : " + user);

Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
    String name = names.nextElement();
    String value = servletConfig.getInitParameter(name);
    System.out.println(name + " : " + value);
}

Servlet内置缺省对象

Servlet中有两个重要的对象:ServletConfigServletContextServletContextServlet的上下文,代表当前web应用,ServletConfig封装了Serlvet的配置信息,并且可以获取ServletContext对象。

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

ServletContext对象的作用:

  1. 获取当前Web应用的初始化参数

    ServletConfig servletConfig = this.getServletConfig();
    ServletContext context = this.getServletContext();   
  2. 获取当前 WEB 应用的某一个文件在服务器上的绝对路径

    String realPath = servletContext.getRealPath("/note.txt");
  3. 获取当前 WEB 应用的名称

    String contextPath = servletContext.getContextPath();
  4. 获取当前 WEB 应用的某一个文件对应的输入流

    InputStream is = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
  5. 设置和获取属性

    servletContext.setAttribute("id","123");
    String id = servletContext.getAttribute("id");

Servlet中获取请求和响应信息

Servlet中的service()方法用于应答请求,该方法接收两个参数,分别是该请求的requestresponse

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

request参数

封装了请求的信息,从中可以获取到任何的请求信息

与请求参数相关的方法 描述
String getParameter(String name) 根据请求参数的名字, 返回参数值。
若请求参数有多个值,只能获取到第一个提交的值
String[] getParameterValues(String name) 根据请求参数的名字,返回请求参数对应的字符串数组
Enumeration getParameterNames() 返回参数名对应的Enumeration对象
Map getParameterMap() 返回请求参数的键值对:<String key, String[] value>
其他方法 描述
String getRequestURI() 获取请求的URI路径
String getMethod() 获取请求的方法
tring getQueryString() 获取请求的字符串
String getServletPath() 获取Servlet的映射路径

response参数

方法 描述
PrintWriter getWriter() 返回PrintWriter对象,调用该对象的print方法,将把print中的参数直接打印到浏览器上
void setContentType(String contentType) 设置响应的内容类型
void sendRedirect(String location) 请求重定向,重定向的/根路径为域名下的根路径

猜你喜欢

转载自blog.csdn.net/qimingweikun/article/details/80530016