Javaweb Servlet 技术

1、什么是 Servlet

1、Servlet 是 JavaEE 规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

2、 手动实现 Servlet 程序

1、编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址(先查找web.xml文件,是否有对应的标签体内容。若有,则在找到对应的全类名)

 给Tomcat 配置 Servlet 程序 
  <servlet>   
  
          配置servlet的名字 
	      <servlet-name></servlet-name>
	      
	      配置servlet的全限定名:包名.类名
	      <servlet-class ></servlet-class >
	      
  </servlet>
  
  给servlet 程序配置访问地址
  <servlet-mapping>
  
  作用:告诉服务器,当前配置的地址给哪个Servlet程序使用
       <servlet-name>xx</servlet-name>
       
url-pattern标签配置访问地址
/ 斜杠在服务器解析时,地址:http://ip:port/工程路径 
/hello 表示地址为:http://ip:port/工程路径/hello
       <url-pattern>/hello</url-pattern>
       
  </servlet-mapping>

案例1:

HelloWorldServlet.java

执行原理:
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法

public class HelloWorldServlet extends HttpServlet {
	
	//创建Servlet的步驟
	     //extends HttpServlet
	     //重写doGet | doPost方法
	     //配置
	          //web.xml
	          //注解
	//GET
	    //浏览器直接输入地址
	    //超链接
	    //<form method="get"
	    //重定向
 
	/**
	 * 用来处理GET请求
	 * @param req
	 *          //代表一次请求
	 *                  //请求行
	 *                  //请求头
	 *                  //请求参数
	 * @param resp
	 *          //代表一次响应
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Date date = new Date();//默认是当前时间对象
		//含义
		    //JDK提供的和时间相关的类
		//2020-7-13 20:31:53
		String currentDate = date.toLocaleString();
		//将字符串响应给浏览器
		PrintWriter printWriter = resp.getWriter();
		printWriter.print(currentDate);
	}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true">

  <servlet>
      <servlet-name>xx</servlet-name>
      <servlet-class>com.neu.servlet.HelloWorldServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
       <servlet-name>xx</servlet-name>
       <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

案例2:

url-pattern的配置模式

  • 精确匹配 /hello /first /second
  • 模糊匹配 /* /字符串/*
  • 模糊匹配 *.do *.action *.jsp *.html
  • 缺省匹配 /
    • tomcat中默认有一个缺省匹配的servlet,用来处理静态资源的。

SecondServlet

public class SecondServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //告诉浏览器响应内容的编码是UTF-8,内容是HTML,浏览器需要使用UTF-8解码工作
		resp.setContentType("text/html;charset=utf-8");
        
		PrintWriter printWriter = resp.getWriter();
		
		printWriter.print("<html>");
		printWriter.print("<head>");
		printWriter.print("</head>");
		printWriter.print("<body>");
		printWriter.print("<div style=\"color:red;\">我是DIV</div>");
		printWriter.print("</body>");
		
		printWriter.print("</html>");
	}
}

web.xml

 <servlet>
     <servlet-name>secondServlet</servlet-name>
     <servlet-class>com.neu.servlet.SecondServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
     <servlet-name>secondServlet</servlet-name>
     <!-- <url-pattern>/*</url-pattern> -->
     <!-- <url-pattern>/second/*</url-pattern> -->
     <url-pattern>*.html</url-pattern>
     <!-- <url-pattern>/</url-pattern>  -->
  </servlet-mapping>
  
  <!-- url-pattern的写法 -->
  <!-- 精确匹配  /字符串  比如:/hello /first-->
  <!-- 模糊匹配 /* /字符串/* -->
  <!-- 模糊匹配 *.do *.html *.jsp -->
  <!-- 缺省 / 如果都找不到对应的资源则会交给该servlet来处理,tomcat的静态资源是由缺省的servlet来处理-->

3、servlet生命周期

含义:指Servlet实例从创建到响应客户请求,直至销毁的过程。

相关的方法
在Servlet容器启动后,客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。在为Servlet配置了自动装入选项(load-on-startup)时,服务器在启动时会自动装入此Servlet。

  • load-on-startup
    含义:用来配置servlet的创建时机,默认值-1,如果设置建议设置>=0,值越小越先创建。

ThirdServlet

public class ThirdServlet extends HttpServlet{
	
	public ThirdServlet() {
		System.out.println("ThirdServlet被创建了...");
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().print("servlet is singlton,it's hascode = "+this.hashCode());
	}
}

web.xml

 <servlet>
      <servlet-name>thirdServlet</servlet-name>
      <servlet-class>com.neu.servlet.ThirdServlet</servlet-class>
      
      <!-- 默认值-1,代表当servlet第一次启动的是才会创建 -->
      <!-- value >=0代表当项目启动成功之后会立马创建servlet对象,值越小越先创建 -->
      <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>thirdServlet</servlet-name>
      <url-pattern>/third</url-pattern>
  </servlet-mapping>

1、被创建:执行init方法,只执行一次
Servlet什么时候被创建?
默认情况下,第一次被访问时,Servlet被创建
可以配置执行Servlet的创建时机。

在<servlet标签下配置
1. 第一次被访问时,创建
<load-on-startup的值为负数
2. 在服务器启动时,创建
<load-on-startup的值为0或正整数

  • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
  • 多个用户同时访问时,可能存在线程安全问题。
    解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值。

2、提供服务
服务器接收到客户端请求,会为该请求创建“请求”对象和“响应”对象,并调用service()方法,service()方法再调用其他方法来处理请求.可多次调用。当多个客户端同时访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。

3、被销毁

  • 执行destroy方法,只执行一次
  • Servlet被销毁时执行。服务器关闭时,Servlet被销毁
  • 只有服务器正常关闭时,才会执行destroy方法。
  • destroy方法在Servlet被销毁之前执行,一般用于释放资源。

Servlet3.0:
好处:支持注解配置。可以不需要web.xml了。
步骤:
1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
2. 定义一个类,实现Servlet接口
3. 复写方法
4. 在类上使用@WebServlet注解,进行配置
@WebServlet(“资源路径”)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值