Java 最开始是没有做网络应用程序的功能,为了适应网络应用程序的时代发展,sun公司就开发出了一套API来支持web开发。这个API就是Servlet,Servlet本质就是一个java类,通常通过HTTP接收和响应来自Web客户端请求。
做web开发,实现一个Servlet有三种方式:
- 实现Servlet接口;
- 继承GenericServlet;类
- 继承HttpServlet类;
通常用1,3种,废话不多说,写起来:
- 另外这三个之间本身也有继承关系:
通过实现Servlet接口实现Servlet:三步走
- 创建web project:
- 创建servlet类:HelloServlet.java
-
package cn.yjqj.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class HelloServlet implements Servlet{ //servlet生命周期~~,实例化-init-service-destroy @Override public void destroy() { System.out.print("销毁,在web容器中取出此servlet,在service退出后被调用一次"); } @Override public ServletConfig getServletConfig() { System.out.print("返回servlet初始化和启动参数"); return null; } @Override public String getServletInfo() { System.out.print("返回servlet相关信息,版本之类"); return null; } @Override public void init(ServletConfig arg0) throws ServletException { System.out.print("初始化,servlet被容器实例化后,被调用一次"); } //servlet创建成功后,默认执行的处理请求方法. @Override //ServletRequest arg0, ServletResponse arg1由容器(Tomcat)创建,请求与响应 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.print("init方法成功之后,有请求时被调用。也可以通过配置在web容器启动时就调用"); arg1.getOutputStream().print("yjqj welcome you."); } }
-
- 在web.xml中部署servlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- servlet的配置,class:完整包路径和实现的servlet类,name:任意但唯一,标识此<servlet> -->
<servlet>
<servlet-name>yjqjServlet</servlet-name>
<servlet-class>cn.yjqj.servlet.HelloServlet</servlet-class>
<!-- 若配置,则容器启动时就会实例化此servlet,数值越大优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 映射,url:任意但必须有/,name:指定此url映射到的servlet -->
<servlet-mapping>
<servlet-name>yjqjServlet</servlet-name>
<url-pattern>/suibian</url-pattern>
</servlet-mapping>
</web-app>
将专案部署到Tomcat中:
打开浏览器输入:http://localhost:8080/Helloservlet/suibian :结果:
Servlet的处理流程:
上面两张图可以说是简单易懂,我再语言解释一下:当浏览器发送请求,web服务器(Tomcat)接收请求。内部解析专案web.xml部署文件:通过<servlet-mapping>找到对应的<servlet>(如果没找到返回404给web服务器),在容器中创建此Servlet类对象(通过反射机制。若配置了<load-on-startup>此servlet在容器启动时就已经被创建。),再执行其中相应的处理方法(不一定是service),将处理结果返回web服务器。web服务器再将结果以http协议返回给浏览器。
补充:Servlet生命周期
当有第一个客户端浏览器访问这个servlet时,Tomcat启动:conf 解析 server.xml 和 webapps下的项目部署文件 web.xml Connector 中读取端口号 创建ServerSocket (new一个)服务端 while(true)- - 接收客户端 读到http的数据包 封装到HttpServletRequest HttpServletResponse中 利用http中得到的url和web.xml解析结果,通过java反射机制(Class.forName(…);),实例化(newInstance())servlet产生对象 放入一个MAP集合中 调用servlet的init()方法初始化,启动一个线程,线程内调用service(…)方法 在容器关闭前,调用destroy()方法,销毁servlet对象。
如果在销毁这个对象之前,在有一个客户端浏览器来访问这个servlet,那么容器不会再次实例化这个servlet了。而是直接在新的线程中调用这个servlet的service方法。
通过继承HttpServlet类实现Servlet:
说到这不得不先提一下HTTP协议:
- 单向性:只有发送请求了,才会有相应产生。
- 无状态:协议本身并没有状态的记录,当客户端多次访问服务端时,服务端并不会知道 你曾经访问过他。
- 发送请求方式:DOGET,DOPOST
- get与post区别:
- get方式提交表单,表单中的数据会在地址栏中显示。而post方法则不会。
- get方式提交表单,会在http数据包中的第一行出现,而post在空一行的body中出现
http数据包
get:
Post:
- 创建web project:
- 创建servlet类:TestHttpServlet.java
-
package cn.yjqj.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* 1)你的servlet必须要继承HttpServlet。在你的servlet中添加doGet或者是doPost。 2)doGet或者是doPost方法中都会含有两个入参: HttpServletRequest HttpServletResponse 3) 该方法需要抛出两个异常: IOException ServletException 4)通过HttpServletResponse对象获取向客户端输出的字符流对象 PrintWriter pw = response.getWriter(); 5)通过调用PrintWriter中的print方法完成内容的输出。 */ public class TestHttpServlet extends HttpServlet{ //响应客户端发送的Get请求,HttpServletRequest HttpServletResponse,由容器创建,需要抛出异常 public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException , ServletException{ PrintWriter pw = response.getWriter(); pw.print("yjqj welcome you again"); } //响应客户端发送的Post请求,HttpServletRequest HttpServletResponse,由容器创建,需要抛出异常 public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException , ServletException{ } }
-
- 在web.xml中部署servlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- servlet的配置,class:完整包路径和实现的servlet类,name:任意但唯一,标识此class -->
<servlet>
<servlet-name>yjqjServlet</servlet-name>
<servlet-class>cn.yjqj.servlet.HelloServlet</servlet-class>
<!-- 若配置,则容器启动时就会实例化此servlet,数值越大优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 映射,url:任意但必须有/,name:指定此url映射到的servlet -->
<servlet-mapping>
<servlet-name>yjqjServlet</servlet-name>
<url-pattern>/suibian</url-pattern>
</servlet-mapping>
<!-- 继承HttpServlet方式实现servlet -->
<servlet>
<servlet-name>yjqjServlet2</servlet-name>
<servlet-class>cn.yjqj.servlet.TestHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>yjqjServlet2</servlet-name>
<url-pattern>/suibian2</url-pattern>
</servlet-mapping>
</web-app>
同样,打开浏览器输入:http://localhost:8080/Helloservlet/suibian2 :结果:
仅为个人理解,如有不足,请指教。 https://blog.csdn.net/weixin_35811044