【Jsp】第二课 Servlet入门学习(二)

本次课程内容是即【Jsp】第二课 Servlet入门学习(一) 文章之后编写。

url-pattern详解

} 1.完全匹配  必须以"/"开始 
例如:/hello    /a/b/c
} 2.目录匹配  必须以"/"开始  以"*"结束 
例如:/a/*    /*
} 3.后缀名匹配  以"*"开始      以字符结尾      
例如:*.jsp   *.do   *.action

优先级:完全匹配>目录匹配>后缀名匹配  

完全匹配

什么叫完全匹配?

我们使用之前的OneServlet做分析,在web.xml文件中注册了该Servlet的信息。

 那么,我们将该项目运行在tomcat服务器上访问一下看一下效果:

通过运行可以看到效果为,浏览器地址上输入与Servlet注册设置的访问的虚拟地址保持一致时,立即可以访问到OneServlet,那么假设在浏览器地址上改为/abc1访问OneServlet的话,效果如何:

 

通过运行效果可以看出,想要访问OneServlet那么必须要和设置的虚拟地址保持一致,不能多写也不能少些,不然会出现404  的网页错误信息,表示浏览器没有找到该访问地址,因此产生的错误。

这是需要记住,以后只要遇到404错误,那么一定是地址发生了错误或者的传递的参数发生的了错误

 即这里我们把这种设置的访问虚拟地址与浏览器访问的方式称为完全匹配,必须要一致。

目录匹配

设置访问地址的时候,以/开头,以*号结尾的地址称为目录匹配。

那么接下来看一下目录匹配的用法,这里我们还是使用OneServlet的注册信息,我们把/abc改一下,通过浏览器访问,查看访问效果:

通过运行的效果可以发现,我们把OneServlet的访问地址改为了/abc/*,但通过浏览器访问的时候,只输入了/abc,既然一样能访问OneServlet将信息打印出来,甚至是输入/abc/123,一样能访问该Servlet:

 

通过多种尝试访问,得出结论:这里的*代表0个或者若干个任意字符进行匹配。

后缀名匹配

什么叫后缀名匹配?设置的访问地址为以*开头,以某种后缀名结尾的格式称为后缀名匹配。

那么这里还是以修改OneServlet的虚拟地址来做演示:

 通过以上运行效果可以发现,只要浏览器上输入的地址与设置的虚拟地址的后缀名是一致的,无论后缀名之前输入任何字符都能被该虚拟地址进行匹配。这就是后缀名匹配的效果。

那么学习到这里,大家都有个疑问?

讲了这么多,设置这么多不同的访问虚拟地址有什么作用,何必搞这么复杂。

其实通过三种地址的访问设置,可以发现,使用浏览器访问OneServlet的时候可以让非法用户无法知道服务器的真实Servlet的类,以及无法判断当前该访问地址是准备执行服务器项目的什么操作,什么功能,这其实大大增加了服务器的安全性,减少了被外部非法用户的攻击服务器的可能性。

 接下来给个小练习给大家思考一下:

假设:有三个Servlet,

其中OneServlet类设置的虚拟地址为  /servlet.do

TwoServlet类设置的虚拟地址为 /*

ThreeServlet类设置的虚拟地址为 *.do     

当浏览器地址上输入 http://localhost:8080/Project/servlet.do的时候,那么会访问到哪一个Servlet,大家可以思考一下,同时也可以动手试试,看看效果是怎样的。

下面也给出了更多的练习供大家掌握这三种设置浏览器访问的虚拟地址方式:

} 有如下的一些映射关系:
}  Servlet1 映射到  /abc/*
}   Servlet2 映射到  /*
}   Servlet3 映射到  /abc
}   Servlet4 映射到  *.do
}  当请求URL为"/abc/a.html"时,哪个响应?
}  当请求URL为"/abc"时,哪个响应?
}  当请求URL为"/abc/a.do"时,哪个响应?
}  当请求URL为"/a.do"时,哪个响应?
}   当请求URL为"/xxx/yyy/a.do"时,哪个响应?

load-on-startup

定义:该标签是servlet标签中一个子标签  

作用:用来修改servlet的创建时机

在任何Servlet被定义后,默认都是在浏览器第一次访问该Servlet的时候才会创建对象并初始化数据,最后等待浏览器的继续访问,但可能在某种需求下,我们需要在浏览器访问Servlet之前就要提前将数据准备好,给用户更好的体验,那么就需要现在讲的这个知识点了。

取值:

1.它的值必须是一个整数,表示servlet被加载的先后顺序

2.如果值为正整数或者0时,表示在应用启动时就加载并初始化servlet

值越小,加载的优先级越高,就越先被加载,值相同时,容器就会自己选择加载顺序

那么我们开始操作代码,来演示一下这个标签的用法,这里我们在TwoServlet的注册上加上这个标签,看看效果:

即可发现,不需要浏览器通过虚拟地址去访问它,在控制台中已经打印了该Servlet的构造方法被执行之后的信息。这也就达到了我们想要的效果,如果需要多个Servlet都在项目运行的时候就创建,那么可以多个Servlet都定义该标签。这里就布置演示,初学者可以自行尝试,操作,观察其打印输出的信息并做出分析和总结,以便于达到掌握和学习这个知识点。

快速创建基于HttpServlet的用法

那么其实在最新的Servlet技术中,不会再手动的创建HttpServlet类,不再手动的配置Servlet的注册信息,那么我们来一起看看怎么操作:

选中包右键--》new---》Servlet进行创建

 

创建完成后,会发现与我们之前手动创建的ThreeServlet没有什么区别。

但仔细观察,会发现区别在于这里:

 

在创建的FourServlet这个类上面出现了一个Java注解的定义方式,那么这个就是用来简化替代Servlet在 Web.xml文件中注册的代码。这也大大降低了我们开发者在学习和使用Servlet的时间。

接着我们使用这个Servlet完成一个模拟QQ空间统计在线访问人数的功能。

那么我们在该类中定义一个全局变量,用于统计,在浏览器访问该Servlet的时候,是默认采用get请求的方式,因此我们在Servlet的doGet方法中对全局变量进行自增,并将自增后的次数显示在浏览器的页面上。其代码如下:

package com.servlet;

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

/**
 * Servlet implementation class FourServlet
 */
@WebServlet("/FourServlet")
public class FourServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
      //定义全局变量,用于统计访问次数
	int count=0;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FourServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		count++;
		response.getWriter().append("Count: "+count);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

接下来可以运行项目,根据虚拟地址来访问该Servlet,即可以打开不同的浏览器同时访问该Servlet,可以看到统计访问人数的效果。这里就不再演示,初学者可以自行创建代码,进行运行演示查看效果。

本次文章就分享到这里。

猜你喜欢

转载自blog.csdn.net/u010321564/article/details/120339335