您好,登录后才能下订单哦!
servlet基础是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
Servlet是在服务器上运行的一个小程序,一个servlet就是一个java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的servlet程序。如下图所示:
比如说浏览器去访问部署在tomcat中的项目,既然是访问,总得有一个访问地址,而且访问后要处理的事情处理完了也需要将该返回的东西给到浏览器,那么这个地址是怎么样的呢?或者说这个请求是谁处理的呢?这里就需要使用到servlet的了,也就是servlet是用来接收浏览器的请求并且最后将结果返回的那一道处理程序。
servlet是javaWeb的三大组件之一,另外两个是Filter(拦截器),Listener(监听器)
tomcat的容器分为四个等级,分别是container容器->engine容器->host(也就是主机容器)->servlet容器,等级是从大到小,也就是前面的容器时包含后面的容器,servlet容器管理context容器,一个context(上下文)对应一个web工程
自定义的类,该类有三种实现方式
方式一就是编写一个类之后去实现Servlet接口(必须重写该接口里面所有的抽象方法)
方式二就是编写一个类继承GenericServlet抽象类(重写生命周期的service方法),GenericServlet抽象类实现了Servlet接口,还实现了GenericConfig接口,GenericServlet其实是定义的一个一般的、与协议无关的servlet。
方式三就是编写一个类去继承HttpServlet抽象类(没有抽象方法,根据页面的提交方式重写doGet或者doPost方法),HttpServlet这是基于http协议的,也是使用的最多的。
如果是继承HttpServlet抽象类就需要重写doGet()或者doPost()方法,这里取决于使用哪种方式提交,get请求就重写doGet,post请求就重写doPost(但是需要注意的是并不是只有这两种提交方式,还有put,delele请求)。
这里只是重写doGet或者doPost方法是因为即使重写service方法,但是service方法里面也是调用的doGet或者doPost方法,所以不需要重写service方法
至于为什么不重写doPut或doDelete等方法,是因为最常用的是doPost和doGet,而且使用doPost方法也能实现doDelet和doPut请求的功能,所以也是没有必要。
在web.xml中注册servlet,主要配置的是servlet和servlet-mapping标签
<?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_4_0.xsd" version="4.0"> <!--servlet与servlet-mapping一定是成对出现的,servlet标签是配置servlet处理的类,但是访问规则并没有配置,所以就需要使用servlet-mapping标签来配置--> <servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具体的servlet的类--> <servlet-class>servletPackage.ServletDemo</servlet-class> </servlet> <servlet-mapping> <!--指定与映射的servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--servlet的具体映射路径--> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
后面的url-pattern其实是我们配置的访问路径,比如这里配置的是/hello,那么在访问的时候就需要是http://ip:端口/项目名/hello, 这样就可以对应到这里的url-pattern,然后通过servlet-mapping里面的servlet-name找到与之匹配的servlet标签里面的servlet-name,这样就可以找到servlet标签里面的servlet-class(也就是请求的处理类)。
第一种方式就是直接new一个servlet(这里建立的方式其实是实现HttpServlet抽象类)
第二种则是在创建类的时候实现Servlet接口
如果使用第一种方式建立的servlet显示没有导包或者第二种方式时搜索servlet没有结果则说明是没有添加Servlet-api.jar包。 添加方式有两步:
在eclipse中配置tomcat 在window->perference中添加
第二步就是添加将tomcat添加到运行环境 添加方式是选中项目右键打开Properties->java Bulid path->Libraries->Add Libraries->Server Runtime,选择tomcat服务器即可。
参考文章
主要是三个方法 init->service->destory
当servlet被第一次访问的时候init会被调用,说明servlt的实例默认情况下是第一次访问的时候被创建的。(但是可以自己修改),该实例只会被创建一次。说明servlet的实例是单例的。
service方法是只要有请求就会被调用
当服务器关闭时destory方法会被调用
上面已经说过在默认情况下,servlet实例是在第一次访问的时候被创建的,也就是说即使tomcat服务器已经启动了,但是只要没有请求过来那么servlet实例还是不会被创建,不过这一点是可以自己修改的,可以在web.xml中修改:
<servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具体的servlet的类--> <servlet-class>servletPackage.ServletDemo</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
需要注意的是load-on-startup这个标签的值必须是大于等于0的整数,所有添加了该标签的servlet,都会在tomcat启动时创建,该元素的值是一个序号,tomcat会使用这个序号给多个servlet排序,然后在tomcat启动时会按照这个顺序来创建servlet的实例对象。
load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
它的值必须是一个整数,表示servlet应该被载入的顺序
当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
当值相同时,容器就会自己选择顺序来加载。
在使用HttpServlet时会有两个init方法,其中一个含有ServletConfig参数,ServletConfig主要有四个方法,其中有两个方法是获取初始化参数的:分别是getInitParameter和getInitParameterNames
String getServletName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration<String> getInitParameterNames();
上面讲到ServletConfig中有两个方法是获取初始化参数的,那么什么是初始化参数呢?其实就是在servlet标签中的init-param标签里面配置的值:
<servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具体的servlet的类--> <servlet-class>servletPackage.ServletDemo</servlet-class> <init-param> <param-name>username</param-name> <param-value>1341234</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>helloworldnas</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
上面的配置文件中在servlet标签里面配置了两个init-param,里面配置的就是初始化参数。(这里只是示例,初始化参数一般在框架中使用的比较多)
@Override public void init(ServletConfig config) throws ServletException { String username = config.getInitParameter("username"); String password = config.getInitParameter("password"); System.out.println(username + "," + password); super.init(config); }
上面的代码就是在init方法里面通过servletConfig对象获取配置的参数。
关于url-pattern路径匹配有三种方式:
完全路径匹配 以/开头 比如 /aaa /aaa/bbb
目录匹配 以/开头 比如 /aaa/* /*
扩展名匹配 不能以 /开头 例如 *.do, *.action
优先级:完全路径匹配>目录匹配>扩展名匹配
web容器在启动时,它会为每一个 web容器应用程序创建一个对应的servletContext对象,它代表当前web应用
由于一个web应用中所有的servlet公用一个servletContext对象,因此servlet对象之间可以通过servletContext对象来实现通讯,servletContext对象通常被称为context域对象。
既然servletContext是全局的一个对象,那么就可以配置全局的参数,之前在servlet标签里面配置过init-param,但是那里面的参数只是针对那一个servlet有用,如果想要所有的servlet都可以用,那么就需要配置在servletContext中:
<context-param> <param-name>username</param-name> <param-value>13412432</param-value> </context-param> <!--servlet与servlet-mapping一定是成对出现的,servlet标签是配置servlet处理的类,但是访问规则并没有配置,所以就需要使用servlet-mapping标签来配置--> <servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具体的servlet的类--> <servlet-class>servletPackage.ServletDemo</servlet-class> <init-param> <param-name>username</param-name> <param-value>1341234</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>helloworldnas</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
从上面的配置文件中可以看到在context-param中配置的就是全局的servletContext中的值,然后在ServletContext对象中获取,该对象可以从ServletConfig中得到,当然也可以从父类的getServletContext方法中直接获取:
public void init(ServletConfig config) throws ServletException { ServletContext servletContext = config.getServletContext(); String username = servletContext.getInitParameter("username"); System.out.println(username); super.init(config); }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。