搞Java开发不可避免要用到Servlet,知其然知其所以然,它是什么呢?可以看我前面写的1-Java的认识扫盲,更详细的就要好好了解Tomcat了,可以看看这位老哥的Tomcat系列之Java技术详解
,很好理解吧,这篇文章会着重在技术上说一说Servlet。
一、如何开发一个Servlet(面试会问到的哦)
- 编写java类,继承HttpServlet类
- 重新doGet和doPost方法
- Servlet程序交给tomcat服务器运行!!
- servlet程序的class码拷贝到WEB-INF/classes目录
- 在web.xml文件中进行配置(虽然现在IDE都很智能化自动化,但了解下还是有必要的)
<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>yxl.com.FirstServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
这个就算配置好了,然后就可以访问了 http://localhost:8080/demo/first ,这个过程是怎么样呢?
- tomcat服务器启动时,首先加载webapps中的每个web应用的web.xml配置文件。
- http://: 就是http协议,通过这个协议对浏览器客户端和服务器端之间数据传输的格式规范;localhost:到本地的hosts文件中查找是否存在该域名对应的IP地址(127.0.0.1);通过8080这个端口找到Tomcat服务器,在Tomcat的webapps目录找到demo的目录;first是资源名称,又会分为下面几步骤
- 1)在demo的web.xml中查找是否有匹配的url-pattern的内容(/first)
- 2)如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否相同名称的servlet配置
- 3)如果找到,则取出对应的servlet配置信息中的servlet-class内容:字符串: yxl.com.FirstServlet
- 4)通过反射:
a)构造FirstServlet的对象
b)然后调用FirstServlet里面的方法
二、理解上面的再看看映射路径就是demo/ 后面的东东
在servlet中会有个映射配置,看注释里面写的很清楚
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
它提供了我们精准和模糊两种匹配
- 精准匹配
可以在<url-pattern></url-pattern>里输入具体的路径,比如
是/first。就在浏览器输入http://localhost:8080/demo/first ;
是/yxl/demo1 ,就可以写http://localhost:8080/yxl/demo1 - 模糊匹配
<url-pattern>/* </url-pattern> 浏览器输入:http://localhost:8080/demo/任意路径
<url-pattern>*.后缀名</url-pattern> 浏览器输入: http://localhost:8080/demo/任意路径.do
- 注意
- 1)url-pattern要么以 / 开头,要么以*开头。 例如, dmeo是非法路径。
- 2)不能同时使用两种模糊匹配,例如 /demo/*.do是非法路径
- 3)当有输入的URL有多个servlet同时被匹配的情况下:
- 3.1 精确匹配优先。(长的最像优先被匹配)
- 3.2 以后缀名结尾的模糊url-pattern优先级最低!!!
还有一个内容就是 servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件;如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处,DefaultServlet程序到应用的根目录下查找是存在一个名称为index.html的静态文件;如果找到该文件,则读取该文件内容,返回给浏览器;如果找不到该文件,则返回404错误页面。
三、Servlet的生命周期
Servlet的生命周期: servlet类对象什么时候创建?什么时候调用什么方法?什么时候销毁?
请先记住这个句话:Servlet程序的生命周期由tomcat服务器控制的!!!!!!!!!!!!!!!!!!!
四大生命周期:
- 构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 调用1次。证明servlet对象在tomcat是单实例的。
- init方法: 创建完servlet对象的时候调用。只调用1次。
- service方法: 每次发出请求时调用。调用n次。
- destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。
这是是不是很烦躁,接下来就是show code time
//Tomtcat内部代码运行:
//通过映射找到到servlet-class的内容,字符串: yxl.com.FirstServlet
//通过反射构造FirstServlet对象
//1 得到字节码对象
Class clazz = class.forName("yxl.com.FirstServlet");
//2 调用无参数的构造方法来构造对象
Object obj = clazz.newInstance(); //---1.servlet的构造方法被调用
//创建ServletConfig对象,通过反射调用init方法
//1 得到方法对象
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
//2 调用方法
m.invoke(obj,config); // --2.servlet的init方法被调用
//创建request,response对象,通过反射调用service方法
//1 得到方法对象
Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
//2 调用方法
m.invoke(obj,request,response); //--3.servlet的service方法被调用
//当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
//1 得到方法对象
Method m = clazz.getDeclareMethod("destroy",null);
//2 调用方法
m.invoke(obj,null); //--4.servlet的destroy方法被调用
四、自动加载
默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。
改变servlet创建对象的时机: 提前到加载web应用的时候!!!
在servlet的配置信息中,加上一个<load-on-startup>即可!!
<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>yxl.com.LifeDemo</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup> //注意: 整数值越大,创建优先级越低!!
</servlet>
五、 有参的init方法和无参的init方法
学习ing,稍带补充
六、Servlet的多线程并发问题
学习ing,稍带补充
七、 ServletConfig对象
学习ing,稍带补充
八、ServletContext对象
学习ing,稍带补充
网友评论