1.如何开发一个Servlet
1.1步骤:
1)编写Java类,继承HttpServlet类
2)重新doGet和doPost方法
3)Servlet程序交给tomcat服务器运行
<1>Servlet程序的class码拷贝到WEB-INF/classes目录
<2>在web.xml文件中进行配置
<!-- 配置servlet -->
<servlet>
<!-- servlet的内部名称,自定义,尽量有意义 -->
<servlet-name>LoginServlet</servlet-name>
<!-- servlet的类全名:包名+简单类名 -->
<servlet-class>cn.et.servlet.lesson01.LoginServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<!-- servlet的内部名称,一定要和上面的内部名称保持一致 -->
<servlet-name>LoginServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/sl</url-pattern>
</servlet-mapping>
注意:
访问时的URL:http://localhost:8080/sl/index.html。
启动Tomcat服务器时,首先加载webapps中的每个web应用的web.xml配置文件
http:// 是http协议
localhost 是本地的hosts文件中查找是否存在该域名对应的IP地址(127.0.0.1)
8080 找到Tomcat服务器
/sl 资源名称:
1)在web.xml中查找是否有匹配的url-pattern的内容 (/sl)
2)找到后,用当前servlet-name的名称到web.xml文件中查询是否相同名
的servlet配置
3)如果有,则取出对应servlet配置中的servlet-class内容:cn.et.servlet.lesson01.LoginServlet
通过反射:
a)构造LoginServlet的对象
b)调用LoginServlet里的方法
2.Servlet生命周期
2.1 Servlet 的生命周期:servlet类对象什么时候创建,什么时候调用什么方法,什么时候销毁
2.2 Servlet程序的生命周期由Tomcat服务器控制
3.Servlet重要的四个生命周期
3.1 Tomcat容器自动实例化servlet实例:
永远只有一个实例,单实例,第一次访问实例化配置了>=0的任何值,表示启动时实例化,否则第一次访问时实例化
3.2 Tomcat自动调用init()方法进行简单初始化,先构造方法后调init()
3.3 service方法(请求入口方式是service方法,根据请求的类型决定调用doGet和doPost,访问一次调用一次)
3.4 destroy方法(当容器被关闭或项目被重新加载时,自动销毁servlet)
Servlet的多线程并发问题
注意: servlet对象在tomcat服务器是单实例多线程的。因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。 解决办法: 1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步) 2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。 Servlet学习: HttpServletRequest 请求对象:获取请求信息 HttpServletResponse 响应对象: 设置响应对象 ServletConfig对象 servlet配置对象 ServletContext对象 servlet的上下文对象
ServletConfig对象
5.1 作用
ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)
5.2 对象创建和得到
创建时机: 在创建完servlet对象之后,在调用init方法之前创建。
得到对象: 直接从有参数的init方法中得到!!!5.3 servlet的初始化参数配置
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/b.txt</param-value>
</init-param>
</servlet>
6.ServletContext对象(全局对象,每个项目都有自己的ServletContext对象)
功能:
1)Servlet 之间共享数据,(同一项目中).ServletContext对象能够访问初始化参数
2)获取web.xml中配置的参数:getInitParameter(“driverClass”),.ServletContext对象能够访问存储在ServletContext中的对象
<context-param>
<param-name>dirverClass</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
3)读取web资源:getResourceAsStream("/my.txt"),.ServletContext对象能够访问web项目中的资源文件
4)ServletContext对象能够访问日志
7.ServletConfig(局部):
功能:
1)用来配置初始化参数
2)使用config对象获取servlet自身的配置参数