Servlet入门教程 - 什么是servlet

本文详细介绍了Servlet的概念、作用及其实现方式,包括实现Servlet接口、继承GenericServlet类和HttpServlet类。探讨了Servlet的生命周期,如何处理表单数据,以及在SpringMVC中的应用。

一、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

Servlet 第一天 一、简述 1、Servlet,服务器端的小程序,它是相对于Applet 而言的,Applet 是客户端小程序。 Servlet,是接受来自网络的请求(form 表单,以及其他的请求),并对不同请求作出不同的响应 Servlet,是基于Http 协议的,是运行在web 服务器中的程序。这里要提出一个容器的概念。 servlet 是运行在web 容器中,在后面会详细地讲解,这个web 容器可以控制Servlet 对象的生命周期,控制请 求由Servlet 对象处理。 2、web 服务器,这里的服务器不是硬件概念,而是软件,常用的web 服务器有Tomcat,Jboss 等,我们所用到的 Tomcat 是一个开源的服务器, Tomcat 是一个用java 语言编写的web 服务器,所以需要有相应的java 运行环境,也就是JVM,还要配置tomcat 的具体路径。 二、Tomcat 的配置 JAVA_HOME=/XXX/XXX/(JDK 路径,bin 的上一层目录) CATALINA_HOME=/XXXX/XXX(tomcat 的绝对路径windows 中X:\xxx\xxx) 在启动Tomcat 时,是运行Tomcat 的bin 目录下的startup.sh(windows 中使用startup.bat) 判断Tomcat 是否启动成功,可以在浏览器的地址栏中使用http://localhost:8080/或http://127.0.0.1:8080/可以访问到 tomcat 的主页就是启动成功了。 要想停止tomcat 服务器要使用shutdown.sh(windows 中使用shutdown.bat),如果直接关闭启动窗口,就会造成 8080 端口占用错误,这时可以在使用shutdown.sh 关闭一下服务器。 startup.sh,shutdown.sh,shutdown.bat,startup.bat 这些文件其实是一些脚本文件用来执行大量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值