1.Servlet
服务器端小应用程序
它运行在Servlet容器中,它是由服务器直接解析运行。
2.怎样创建一个Servlet
1.通过查看示例,发现Servlet在创建时它会继承一个HttpServlet类。
2.重写doGet,doPost等方法。
-------------------------------------------------
3.创建一个servlet步骤:
1.创建一个类,去继承HttpServlet(实现Servlet接口 或继承 GenericServlet)
2.重写方法 doPost doGet (接口中需要将所有方法重写,但是service方法是处理请求)
3.在web.xml文件中配置
4.servlet生命周期
1.创建servlet,并调用init方法
2.通过service方法来处理请求。
3.通过destroy来销毁servlet。
当我们创建一个servlet时,第一次访问,会创建servlet对象,并调用init方法,init方法只调用一次。
开启一个线程来调用service方法。
当下一次在访问时,又开启一个线程来调用service方法。
servlet对象,一般情况只创建一次,它常驻内存。
当服务停止,或servlet对象销毁时会调用destroy方法。
注意:如果在servlet中创建了成员变量,就可以出现线程安全问题
在开发中,尽量避免在servlet中创建成员变量。
如果创建了,就需要同步。
5.关于Servlet接口中service方法与HttpServlet中的doPost,doGet什么关系?
一个servlet被访问时,它默认处理请求的是service方法,这个方法是在Servlet接口中定义的。
根据请求的url,在web.xml文件中查找到具体的servlet,
会默认调用service方法。
对于我们来说,它在HttpServlet中对service方法进行了重写,执行其内容
在HttpServlet的service方法中,会根据请求方式的不同,分别调用不同的方法。
根据java中的多态,在调用doPost,doGet时,会调用的是我们自己的servlet中的方法。
这里面涉及到一个java模式:模板方法模式
---------------------------------------------------------
5.模板方法模式:
---------------------------------------------------------
-------------------------------------------------------------------
myeclipse安装
注意:将myeclipse10目录放置在d盘根目录下,破解后就可以使用.
myeclipse与tomcat整合
关于myeclipse下的web project部署到tomcat的目录结构(重点)
----------------------------------------------------------------------
6.关于servlet自动加载.
我们可以通过设置让servlet跟随服务器启动而创建.
只需要在servlet配置中<servlet>这个标签中加上 <load-on-startup>2</load-on-startup>
问题1:servlet跟随tomcat启动有什么作用?
就是用来加载资源。
问题2:load-on-startup它的值可以取什么?
优先级有10个,是从1-10,1已经被占用了,我们在使用时,一般情况下是从2开始。
数值越小优先级越高。
优先级相同情况下根据配置的顺序加载。
----------------------------------------------------------------------
7.关于servlet配置中的url-pattern问题
问题1:一个servlet是否可以被映射到多个路径?
可以的,一个servlet允许被不同的路径映射.
问题2:url-pattern它的写法是什么样的?
1.完全匹配 要求必须以 /开始。
以下两种可以使用通配符. *
2.目录匹配 必须以/开始,以*结束。
3.扩展名匹配 不能以/开始,以*.xxx结束.
最经典错误 /*.do
以上三种配置有优先级: 完全匹配>目录匹配>扩展名匹配
----------------------------------------------------------------------
复习:
1.servlet是什么,它的作用.
2.怎样创建Servlet(三步)
3.Servlet体系
4.关于servlet生命周期
5.关于servlet配置.
----------------------------------------------------------------------------
8.web开发中的路径问题
问题是:浏览器访问服务器有几种访问方式?
1.直接在浏览器地址栏上输入url
2.超链接.
3.表单
4.javascript
请求的方式最常用的是post get
除了表单可以post请求,其它的都是get请求。
访问servlet路径问题
1.绝对路径
1.带协议
<a href="http://localhost:8080/day7_2/demo1">demo1Servlet</a>
这种方式在开发不常用,如果使用这种方式,一般是用于访问站外资源。
2.不带协议
在浏览器端写一个"/"相当于是服务器的根路径.
<a href="/day7_2/demo1">demo1Servlet</a>
对于"/"它相当于是 http://localhost:8080也就是说,我们直接在"/"后面加上我们的工程名,在加上我们的资源名称就可以。
这种方式在开发中应用比较多,因为它一般用于访问站内资源。
2.相对路径
http://localhost:8080/day7_2/demo1 servlet路径
http://localhost:8080/day7_2/admin.html html路径
通过它们的路径,我们发现它们是一个级别,那么我们在访问时,就可以写成以下效果.
<a href="./demo1">demo1Servlet</a>
这个路径可以简化成
<a href="demo1">demo1Servlet</a>
在WebRoot下创建一个jsps目录,将admin.html放置到其中。那么在访问时,绝对路径不会出问题。
相对路径失效。怎样修改它?
http://localhost:8080/day7_2/demo1
http://localhost:8080/day7_2/jsps/admin.html
路径: <a href="../demo1">demo1Servlet</a>
-----------------------------------------------------------------
结论:在开发中,推荐使用不带协议绝对路径。
写法: /工程名/servlet的url-pattern的值.
------------------------------------------------------------------------------------------
9.关于Servlet接口中的init方法
问题1:在Servlet接口中定义的init方法是有参数的,它的参数类型是ServletConfig,而我们重写的init方法没有参数,为什么?
原因:父类中已经将init(ServletConfig config)这个方法进行了重写,而我们在自己的Servlet中就不需要在重写了,
我们重写的init()它不是接口中定义的,而是在父类中定义的。
细节:在GenericServlet中对Servlet接口中的init(ServletConfig config)进行了重写,并且调用了自己定义的一个
init()方法。那么我们在自己的Servlet类中重写了init()方法,根据多态就会调用我们自己的init()方法。
问题2:ServletConfig是什么?它有什么作用?
在GenricServlet中将ServletConfig对象保存到了GenericServlet中。
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
ServletConfig对象,代表的是Servlet的配置对象。
当去访问一个servlet时,就会实例化这个servlet对象,并且会创建一个servletConfig对象,将这个对象通过init方法传递到servlet中。
那么我们就可以在自己的servlet中获取Servlet的配置信息.
获取ServletConfig对象: this.getServletConfig();
----------------------------------------------------------------
10. ServletConfig对象
功能:
1.可以获取Servlet的name。
2.可以获取初始化参数
是我们可以在Servlet的配置中通过<init-param>来进行配置,
对于这些配置,我们可以通过ServletConfig来获取.
通过初始化参数,我们可以进行预定义信息的加载,这种操作一般情况是在框架中应用。
3.可以获取ServletContext对象
常用API总结:
public String getServletName();
用于获取Servlet名称
public String getInitParameter(String name);
用于获取init-param中指定名称的value值.
public Enumeration getInitParameterNames();
用于获取所有的init-param中的name名称.
public ServletContext getServletContext();
用于获取一个ServletContext对象。
ServletConfig要求掌握内容:
1.它是由服务器创建,通过init方法传递到我们的Servlet中。
我们在Servlet中通过 this.getServletConfig()获取ServletConfig对象.
2.ServletConfig对象是用于获取当前Servlet的配置信息.
1.Servlet的名称
2.Servlet的初始化参数。
每一个Servlet都具有自己的ServletConfig对象。它们之间是不能共享的。
-------------------------------------------------------------------------------------
11.关于ServletContext对象.
ServletContext它代表的是一个web应用。
怎样获取一个ServletContext对象?
可以通过ServletConfig对象获取.
ServletConfig.getServletContext();
作用:
1.它可以获取全局初始化参数
String getInitParameter(String name)
Enumeration getInitParameterNames()
在web.xml文件中可以配置我们的全局初始化参数
<!-- 配置全局初始化参数 -->
<context-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</context-param>
它的配置是针对于整个web应用.
2.它可以帮助我们让servlet实现信息共享.
ServletContext是一个域对象,提到域对象想到两件事,一个是它相当于是一个Map,另一个它有作用域,对于
ServletContext它的作用域是整个web应用。
示例:统计站点访问次数
问题:怎样判断是第一次访问
setAttribute(String name,Object value);
getAttribute(String name);
removeAttribute(String name);
3.可以获取路径(资源)***********************
在web开发中,如果要想获取资源,必须使用绝对的磁盘路径。
怎样可以得到在服务器上的文件的绝对磁盘路径?
1.String getRealPath(String s);
ServletContext.getRealPath("/"); 得到当前工程在磁盘上的绝对路径。
2.URL gerResource(String s);
得到一个URL路径,它也是指向我们的web工程下的资源。
3.InputStream getResourceAsStream(String s);
得到一个指向资源的输入流.
扩展:对于classes目录下的文件,它有其它的方式可以获取到.
Class.getResource("/").getPath(); 获取的就是class文件所有的目录的绝对磁盘路径。
对于存在于classes目录下的文件,我们可以通过classpath的方式去获取其绝对磁盘路径。
4.其它功能(了解)
1.获取MIME类型
String getMimeType(String file) 文件下载时会用到.
2.分发请求
RequestDispatcher getRequestDispatcher(String path)
在开发中不常使用,如果使用通过request对象来操作。
3.日志
log方法是用来处理日志.
--------------------------------------------------------------
自己做:
1.将笔记中所有的问题全都看一遍
2.手动创建servlet,并描述servlet生命周期.
3.关于url-pattern配置
4.关于ServletContext功能描述。
5.关于路径问题总结.
关于servlet的一些总结
最新推荐文章于 2020-07-05 20:41:36 发布