Servlet入门教程 - 什么是servlet

一、Servlet
背景:以前一直不知道什么servlet,面试的时候也是模糊的回答是java程序。刚入门什么都不懂,有时间学习看了教程,别人的博客,能清楚servlet干嘛用的,先总结记录下来笔记,免得日后忘了,还需要重来。

1.什么是servlet
        Java Servlet 是运行在 Web 服务器或应用服务器上的程序。通常我们也把实现了servlet接口的java程序,称之为Servlet。

Servlet是sun公司提供的一门用于 开发动态web资源的技术。
  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),
需要完成以下2个步骤:
  1、编写一个Java类,实现servlet接口。
  2、把开发好的Java类部署到web服务器中。
  
2.servlet好处

  • 可以收集来自网页表单的用户输入;呈现来自数据库或者其他源的记录;还可以动态创建网页。

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。

  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。

  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF
    图像)、Excel 等。

  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies
    和缓存参数,以及其他类似的任务。

3.代码创建servlet
          Servlet 可以使用 javax.servlet 和 javax.servlet.http 包 创建
三种方式:
1、实现 Servlet 接口

/*
 * 1.实例化(使用构造方法创建对象)
 * 2.初始化  执行init方法
 * 3.服务     执行service方法
 * 4.销毁    执行destroy方法
 */
public class ServletDemo1 implements Servlet {

    //public ServletDemo1(){}

     //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
    public void init(ServletConfig arg0) throws ServletException {
                System.out.println("=======init=========");
        }

    //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("hehe");

    }

    //生命周期方法:当Servlet被销毁时执行该方法
    public void destroy() {
        System.out.println("******destroy**********");
    }
   //当停止tomcat时也就销毁的servlet。
    public ServletConfig getServletConfig() {
        return null;
    }

    public String getServletInfo() {
        return null;
    }
}

2、继承 GenericServlet 类

public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("heihei");

    }
}

3、继承 HttpServlet 方法(常用)

package com.lixu.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet{

	/**
	 * 标识 ID
	 */
	private static final long serialVersionUID = 1L;
    
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException{

	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException{
		
		doGet(request, response);
	}
	
}

web.xml中配置:

<servlet>
     <servlet-name>ServletDemo1</servlet-name>
     <servlet-class>com.lixu.servlet.ServletDemo1</servlet-class> <!-- 实现的servlet所在包的地址 -->
  </servlet>

  <servlet-mapping>
     <servlet-name>ServletDemo1</servlet-name> 
     <url-pattern>/servlet/ServletDemo1</url-pattern>  <!-- 请求路径,servlet被外界访问,需要的映射访问地址 -->
     <init-param> <!-- 初始化参数,可不写 -->
         <param-name>myparam</param-name>
         <param-value>xiaoming</param-value>
     </init-param>
  </servlet-mapping>

一个Servlet只会有一个对象,服务所有的请求
        HttpServlet 中对原始的 Servlet 中的方法都进行了默认的操作,不需要显式的销毁初始化以及 service(),在 HttpServlet 中,自定义了一个新的 service() 方法,其中通过 getMethod() 方法判断请求的类型,从而调用 doGet() 或者 doPost() 处理 get,post 请求,使用者只需要继承 HttpServlet,然后重写 doPost() 或者 doGet() 方法处理请求即可。

二、servlet 生命周期

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

        注:destory 方法被调用后,servlet 被销毁,但是并没有立即被回收,再次请求时,并没有重新初始化。

三、Servlet 表单数据
Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:

  • getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
  • getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
  • getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。

示例
get方式:

jsp测试页面:

<form action="getForm" method="GET">
	                用户名: <input type="text" name="name" value="张三" />
	                网址:<input type="text" name="url" />
	             <input type="submit" value="get方式提交">
     </form>

自定义一个servlet处理请求:

package com.lixu.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 处理get数据请求
 */
@WebServlet("/getForm")
public class myservlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");

        String title = "使用 GET 方法读取表单数据";
        
        /*
         * getParameter()获取 表单 参数的值。
         */
        String name = request.getParameter("name");
        String url = request.getParameter("url");
        
        //参考教程时,get请求需要编码,但是我加上下面的代码,运行时反而乱码(显示:???)(我也不清楚为什么)
        //name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;
       
        //打印信息
        PrintWriter out = response.getWriter();
        String docType = "<!DOCTYPE html> \n";
        out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "  <li><b>站点名</b>:"
            + name + "\n" +
            "  <li><b>网址</b>:"
            + url + "\n" +
            "</ul>\n" +
            "</body></html>");
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 我这里代码放开,报格式错误,我就不校验了 -->
<!-- <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> -->
<web-app>  
  <servlet>
     <servlet-name>myservlet</servlet-name>
     <servlet-class>com.lixu.servlet.myservlet</servlet-class> <!-- 实现的servlet所在包的地址 -->
  </servlet>
  
  <servlet-mapping>
     <servlet-name>myservlet</servlet-name> 
     <url-pattern>/servlet/myservlet</url-pattern>  <!-- 请求路径,servlet被外界访问,需要的映射访问地址 -->
     <init-param> <!-- 初始化参数,可不写 -->
         <param-name>myparam</param-name>
         <param-value>xiaoming</param-value>
     </init-param>
  </servlet-mapping>
</web-app>

效果:
在这里插入图片描述
post请求:

package com.lixu.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 处理get数据请求
 */
@WebServlet("/postForm")
public class myservlet1 extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");

        String title = "使用 POST 方法读取表单数据";
        
        //getParameter();
        String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
        
        String url = request.getParameter("url");
        url = new String(url.getBytes("ISO8859-1"),"UTF-8");
     
        //打印信息
        PrintWriter out = response.getWriter();
        String docType = "<!DOCTYPE html> \n";
        out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "  <li><b>站点名</b>:"
            + name + "\n" +
            "  <li><b>网址</b>:"
            + url + "\n" +
            "</ul>\n" +
            "</body></html>");
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

jsp,web.xml 需要重写,配置(差不多,偷懒帖了)

四、springMVC 中的servlet应用
        在springMVC中,或我们SSM项目中:一般并不需要我们自己定义servlet,大多用是SpringMVC提供的DispatcherServlet (核心分发器)。
DispatcherServlet 是最终继承HttpServlet的,也就是说它是框架中通用的Servlet。Controller层HttpServletRequest获取请求数据。
web.xml 配置:

<servlet>
  <servlet-name>dispatcher</servlet-name>  
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- tomcat启动时自动创建servlet,数字越小优先级越高(>0) -->  
  <load-on-startup>1</load-on-startup> 
</servlet>

<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>  
  <!--  "/" 拦截所有请求 -->
  <url-pattern>/</url-pattern>  
</servlet-mapping>

参考:https://www.runoob.com/servlet/servlet-form-data.html
          https://www.cnblogs.com/xdp-gacl/p/3760336.html

发布了16 篇原创文章 · 获赞 3 · 访问量 534

猜你喜欢

转载自blog.csdn.net/outdata/article/details/102543784
今日推荐