JAVA 之【web编程基础】 ------------ Servlet

Java 最开始是没有做网络应用程序的功能,为了适应网络应用程序的时代发展,sun公司就开发出了一套API来支持web开发。这个API就是Servlet,Servlet本质就是一个java类,通常通过HTTP接收和响应来自Web客户端请求。

做web开发,实现一个Servlet有三种方式:

  1. 实现Servlet接口;
  2. 继承GenericServlet;类
  3. 继承HttpServlet类;

通常用1,3种,废话不多说,写起来:

  • 另外这三个之间本身也有继承关系:

通过实现Servlet接口实现Servlet:三步走

  1. 创建web project:
  2. 创建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.");
      	}
      }
  3. 在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 \rightarrow 解析 server.xml 和 webapps下的项目部署文件 web.xml \rightarrow Connector 中读取端口号 \rightarrow 创建ServerSocket (new一个)服务端 \rightarrow while(true)- - 接收客户端 \rightarrow读到http的数据包 \rightarrow 封装到HttpServletRequest HttpServletResponse中 \rightarrow 利用http中得到的url和web.xml解析结果,通过java反射机制(Class.forName(…);),实例化(newInstance())servlet产生对象 \rightarrow 放入一个MAP集合中 \rightarrow 调用servlet的init()方法初始化,启动一个线程,线程内调用service(…)方法 \rightarrow 在容器关闭前,调用destroy()方法,销毁servlet对象。

如果在销毁这个对象之前,在有一个客户端浏览器来访问这个servlet,那么容器不会再次实例化这个servlet了。而是直接在新的线程中调用这个servlet的service方法。

 

 

通过继承HttpServlet类实现Servlet:

说到这不得不先提一下HTTP协议:

  • 单向性:只有发送请求了,才会有相应产生。
  • 无状态:协议本身并没有状态的记录,当客户端多次访问服务端时,服务端并不会知道 你曾经访问过他。
  • 发送请求方式:DOGET,DOPOST
  • get与post区别:
    1. get方式提交表单,表单中的数据会在地址栏中显示。而post方法则不会。
    2. get方式提交表单,会在http数据包中的第一行出现,而post在空一行的body中出现

http数据包

get

Post: 

 

  1. 创建web project:
  2. 创建servlet类:TestHttpServlet.java
    1. 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{
      		
      	}
      }
  3. 在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值