1.实现Servllet的方式 (由我们自己来写)
三种方式
- 实现javax.servlet.Servlet接口
- 继承javax.servlet.GenericServlet类
- 继承 javax.servlet.http.HttpServlet类
通常继承HttpServlet类来完成我们Servlet。
特点:单例、线程不安全、效率高
自己编写,服务器实例化,调用方法
实现五大方法。。。
//实现Servlet接口,,需要实现五个方法
public class Aservlet implements Servlet{
//一开始就被加载
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init run...");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig run...");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service run...");
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo run...");
return null;
}
//服务器关闭时自动执行方法
@Override
public void destroy() {
System.out.println("destroy run...");
}
}
2.一般的servlet都是继承HttpServlet类
(重写doGet和doPost方法)
servlet的线程安全:一个类型 的servlet只有一个实例对象,servlet工作效率很高,但是它不是线程安全的。
为了避免非线程安全问题。
- 不要在servlet中创建成员,创建局部变量即可!
- 可以创建无状态成员。
- 可以创建有状态的成员,但状态必须为只读的!(可以get,决不能set)
3.servlet的web.xml配置
Tomcat:(原理:)使用dom4j解析xml,得到servlet类名字符串,反射得到类,执行类中的方法
<servlet>
<servlet-name>Cservlet</servlet-name><servlet-class>com.test.myservlet.CServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Cservlet</servlet-name><url-pattern>/Cservlet</url-pattern>
</servlet-mapping>
4.ServletContext (重要)
一个项目只有一个ServletContext对象! 可以在n多个Servlet中获取这个唯一的对象,,使用它可以给多个Servlet传递数据!
与天地同寿!!! 这个对象在Tomcat启动时创建,Tomcat关闭时销毁!!
ServletConfig . getServletContext();获取对象(唯一)
- ServletConfig#getServletContext();
- GenericServlet#getServletContext();
- HTTPSession#getServletContext();
- ServletContextEvent#getServletContext();
JavaWeb四大域对象之一。
所有域对象都有存取数据的功能,域对象内部有一个Map,用来储存数据,下面是ServletContext对象用来操作数据的方法:
- void setAttribute(String name ,Object value); 用来储存一个对象,也可以称为储存一个域属性。name相同时会覆盖之前的。同Map 。
- Object getAttribute(String name); 获取名为name的域属性。 String value=(String)servletContext.getAttribute(“name”); 注意返回值类型是Object,必要时强转一下类型。
- void removeAttribute(String name); 移除
- Enumeration getAttributeNames(); 获取所有域属性的名称(相当于Map中的key)
5.ServletContext获取资源
.getRealPath(“/index.jsp”);获取真实路径(带有盘符的路径);
InputStream input = this.getServletContext().getResouceAsStream(“/index.jsp”); 获取资源路径再创建输入流对象。。
Set <String> paths = this.getServletContext. getResourcePaths(“/WEB-INF”); 获取路径下所有资源的路径。