Servlet编程基础
来源:互联网 发布:联想超级相机软件 编辑:程序博客网 时间:2024/06/15 00:22
一、Servlet的调用过程
二、Servlet在tomcat服务器中的映射路径和缺省
三、Servlet的生命周期及自动加载
四、ServletConfig对象
五、ServletContext对象
Servlet(Java Servlet)是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
这里我们用tomcat搭建了支持servlet服务器,用eclipse来开发Servlet。
一、Servlet的调用过程
- Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
- ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
二、Servlet在tomcat服务器中的映射路径和缺省
(一)映射路径
Servlet如何想被外界访问就必须在web.xml文件中进行注册。 <servlet>
元素用于注册Servlet,它包含有两个主要元素:<servlet-name> <servlet-class>
<servlet-mapping>
元素用于映射已经注册的Servlet的一个对外访问路径,它包含:<servlet-name><url-pattern>
例如,配置一个ServletDemo服务端。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>webDemo1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>ServletDemo</servlet-name> <!--完整的类名,包名+类名--> <servlet-class>com/ServletDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了--> <url-pattern>/firstPage</url-pattern> </servlet-mapping>
在<url-pattern>
元素中,有两种匹配方式。
1、精确匹配
/firstPage url: ../webDemo/firstPage
2、模糊匹配
/* url: ../webDemo/任意路径/ url: ../webDemo/任意路径/com/* url: ../webDemo/com/任意路径*.后缀名 url: ../webDemo/*.后缀名
1、/firstPage/*.(后缀名) 两种的模糊匹配不能同时使用
2、精确匹配比模糊匹配优先级高,以后缀名结尾的模糊匹配优先级最低 。
3、模糊匹配尽量不要写 /和/*,会与缺省造成冲突。
实际上,在Servlet3.0版本以后,对于原来在web.xml定义的servlet,filter,listener,InitParam都可以通过annotation来配置了,而不需要在web.xml中定义。我们也可以在创建动态web工程中勾上以下选项来生成web.xml文件。
(二)缺省
servlet的缺省路径是在tomcat服务器内置的一个路径。该路径对应着一个DefaultServlet(缺省Servlet)。这个缺省Servlet的作用是用于解析web应用的静态资源文件。
在tomcat安装目录中:conf下的web.xml中有这样一个代码:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern></servlet-mapping>//...<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern></servlet-mapping>
当浏览器发送一个请求给tomcat时,tomcat会先在web.xml文件查找是否有对应的url-pattern。假如没有找到,则会交给tomcat的内置额DefaultServlet处理。DefaultServlet程序则会到储存静态文件的中查找对应名称的静态文件。如果找到该文件,则读取该文件内容,返回给浏览器。如果找不到该文件,则会返回404错误页面。
因此,当访问tomcat服务器中的某个静态html文件和图片的时候,实际上是在访问这个缺省的Servlet。
所以,我们在使用模糊匹配的时候,最好不用/和/*模糊匹配,这样会导致访问不到html等静态文件。
三、Servlet的生命周期及自动加载
(一)生命周期
- Servlet生命周期:
- 1、初始化阶段,调用Servlet构造方法和init()方法
2、相应客户端请求阶段,调用service()方法
3、终止阶段,调用destroy()方法
//每个自定义的Servlet都必须实现Servlet的接口,Servlet接口定义了五个方法,其中有三个方法涉及到了Servlet的生命周期。void init(ServletConfig config) throws ServletExceptionvoid service(ServletRequest req, ServletResponse res) throws ServletException, IOExceptionthrows ServletException, IOExceptionvoid destroy()
通过每个方法的调用时间,我们能看到,当客户端第一次访问Servlet的时候,web容器将会创建这个Servlet的实例(再次访问,则不会再创建,直接调用实例的service()方法)。
当整个web应用终止的时候,Servlet容器就会调用Servlet的destroy()方法,释放掉Servlet所有占用的资源。
(二)自动加载
因此,我们也可以看出,当有客户端第一次访问Servlet时,因为Servlet需要调用多个方法,则加载会比较慢。我们可以让Servlet实现自动加载,在运行web容器的时候,就让该Servlet加载好,等待客户端的访问。
在项目的web.xml中,我只要加上<load-on-startup>
标签就能实现让该Servlet自动加载了。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>webDemo1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>ServletDemo</servlet-name> <!--完整的类名,包名+类名--> <servlet-class>com/ServletDemo</servlet-class> <!--servlet对象自动加载,文本内容为整数,整数值越大,优先级越低--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了--> <url-pattern>/firstPage</url-pattern> </servlet-mapping>
(三)init()方法
//1、有参数的init方法:该方法是servlet的生命周期方法,一定会被tomcat服务器调用。//Called by the servlet container to indicate to a servlet that the servlet is being placed into service.public void init(ServletConfig config) throws ServletException//2、无参数的init方法:该方法是专门给覆盖编写初始化代码的方法。//A convenience method which can be overridden so that there's no need to call super.init(config).public void init() throws ServletException
注:servlet对象在tomcat服务器当中,是单实例,多线程的。如果多个线程访问了servlet成员变量,会引发线程安全问题。解决办法是用线程锁锁住访问成员变量的代码块。
四、ServletConfig对象
ServletConfig对象用于,Servlet容器在初始化时传递参数信息给Servlet。ServletConfig封装了Srevlet配置中的参数信息,我们可以通过调用该对象来获取相应的参数信息。
ServletConfig的作用域,从一个Servlet被实例化后,对任何客户端在任何时候访问有效,但不能给另外一个Servelt访问。
在web.xml文件中,我们通过<init-param>
标签来配置相应的参数信息。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>webDemo1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>ServletDemo</servlet-name> <!--完整的类名,包名+类名--> <servlet-class>com/ServletDemo</servlet-class> <!--参数信息,要放在load-on-startup标签上边--> <init-param> <param-name>path1</param-name> <param-value>e:/a.txt</param-value> </init-param> <init-param> <param-name>path2</> <param-value>e:/b.txt</> </init-param> <!--servlet对象自动加载,文本内容为整数,整数值越大,优先级越低--> <load-on-startup>1</load-on-startup></servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了--> <url-pattern>/firstPage</url-pattern> </servlet-mapping>
在Servlet中,主要用以下方法来获取这些参数信息。
//返回指定名字的初始化参数的值的字符串,该参数不存在,则返回nulljava.lang.String getInitParameter(java.lang.String name)//返回所有该Servlet的初始化参数名字的枚举,假如该Servlet没有初始化参数,则返回空的枚举。java.util.Enumeration getInitParameterNames() //返回该Servlet实例的名字java.lang.String getServletName() //例如,获取所有的Servlet初始化参数的部分代码//获取ServletCnfig对象ServletConfig config = this.getServletConfig();//获取所有参数的名字 Enumeration<?> params = config.getInitParameterNames();while(params.hasMoreElements()){ String paramName = (String)params.nextElement(); //获取指定名字的参数的值 String paramValue = config.getInitParameter(paramName); System.out.println(paramName+""+paramValue);}
更多关于SevletConfig…
五、ServletContext对象
ServletContext对象,代表一个当前的web应用环境。ServletContext定义了一系列的方法,用于Servlet与Servlet容器之间的信息交流。一个web应用中,可以存在多个ServletConfig对象(一个servlet对应着一个ServletConfig对象)。但一个web应用只对应着一个ServletContext对象。其作用域从web应用开始到结束。
主要用到的方法(更多方法介绍…):
//得到当前web应用的路径String getContextPath()//返回到web应用的初始化参数,假如该参数不存在,则返回nullString getInitParameter(String name)//返回所有初始化参数的名字的枚举,假如context没有初始化参数,则返回空的枚举Enumeration getParameterNames();//一个指定的属性名字捆绑着一个对象。假如指定的名字已经存在,这个方法会取代之前的属性void setAttribute(String name, Object object)//返回指定名字的servlet容器的属性,假如不存在,则返回nullObject getAttribute(String name)//移去指定名字的context属性void removeAttribute(String name)//转发类(似于重定向)RequestDisptcher getRequestDisptcher(String path)//得到web应用的资源String getRealPath(Strng path)InputStream getResourceAsStream(String path)
(一)获取初始化参数
根据ServletContext的作用域,这里定义的初始化参数,是给所有Servlet共享的。
在web.xml文件中我们可以用<context-param>
标签定义该初始化参数。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>webDemo1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>ServletDemo</servlet-name> <!--完整的类名,包名+类名--> <servlet-class>com/ServletDemo</servlet-class> <!--参数信息,要放在load-on-startup标签上边--> <init-param> <param-name>path1</param-name> <param-value>e:/a.txt</param-value> </init-param> <init-param> <param-name>path2</> <param-value>e:/b.txt</> </init-param> <!--servlet对象自动加载,文本内容为整数,整数值越大,优先级越低--> <load-on-startup>1</load-on-startup></servlet><!--定义context初始化参数--><context-param> <param-name>param1</param-name> <param-value>360</param-value></context-param><context-param> <param-name>param2</param-name> <param-value>qq</param-value></context-param><servlet-mapping> <servlet-name>ServletDemo</servlet-name> <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了--></servlet-mapping>
然后我们就可以根据以下方法来获取了(部分代码)
//获取ServletContext对象ServletContext context = this.getServletContext();//Enumeration params = context.getInitParameterNames();while(params.hasmoreElements){ String param = param.nextElement(); String value = context.getinitParameter(param);}
(二)域对象有关的方法
作用是用于保存数据,获取数据,可以在不同的动态资源之间共享数据。我们可以使用域对象来在各个动态资源中,传递数据。可以共享任何类型。
//Servlet1保存数据ServletContext context = this.getServletContext()context.setAttribute("name","lee");//Servlet2取出数据ServletContext context = this.getServletContext()context.getAttribute(name);
(三)转发
转发和重定向的区别
转发地址栏不会改变,转发不能转发当前web应用以外的资源,可以把数据保存爱request对象当中。
- Servlet编程基础
- Servlet基础编程
- Servlet基础编程
- Servlet编程基础
- servlet编程基础
- web编程——Servlet基础练习
- Servlet编程基础概述-MVC控制层
- 《Servlet和JSP编程基础》学习笔记
- 《Java Servlet编程》笔记(Http servlet基础)
- 《Java Servlet编程》笔记(Http servlet基础)
- 编程经验:三大基础技能JSP/JavaBean/Servlet
- javaweb基础(Http协议、Servlet编程、会话管理)
- Servlet基础----Hello Servlet!!!
- Servlet基础
- Servlet基础
- Servlet基础
- servlet基础
- Servlet 基础
- php csv 导出
- Python中文注释报错和中文输出乱码
- PO条件在交货后更改控制点
- 视图
- Volley 简单封装调用超简单
- Servlet编程基础
- Hbase集群搭建
- [eclipse] tips
- Unity Mecanim动画的实现(七):动画曲线
- Apple Tree
- Avro文件操作示例代码
- error: protocol fault (couldn't read status): Connection reset by peer
- Mac安装MySQL初始密码设置
- 深入理解mybatis原理(十一) Mybatis插件原理之实现细节