一:Servlet概述
1.什么是Servlet
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收骑请求数据
- 处理请求
- 完成响应
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来填写,每个Servlet必须实现javax.servlet.Servlet接口。
2.实现Servlet的方式
实现Servlet有三种方式:
- 实现javax.servlet.Servlet接口
- 继承javax.servlet.GenericServlet类
- 继承javax.servlet.http.HttpServlet类
通常我们会去继承HttpServle类来完成我们的Servlet
注:HttpServlet类是GenericServlet类的子类,功能更为强大,支持Http协议
3.利用Servlet接口创建Servlet
public class AServlet implements Servlet {
/*
* 它是生命周期方法
* 它会在Servlet对象创建之后马上执行,并只执行一次(出生之后)
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init()");
}
/*
* 可以用来得到Servlet的配置信息
*/
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig()");
return null;
}
/*
* 他是生命周期方法
* 他会被调用多次,每次处理请求都是在调用这个方法
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service()");
}
/*
* 用来得到servlet的信息
*/
@Override
public String getServletInfo() {
System.out.println("getServletInfo()");
return "我是一个快乐的servlet";
}
/*
* 它是生命周期方法
* 当服务器关闭时,Servlet会被销毁
* 它会在Servlet被销毁之前调用,并且只会被调用一次
* 这个方法并不能销毁servlet,而是用来留遗言的方法
*/
@Override
public void destroy() {
System.out.println("destroy()");
}
}
给servlet配置url路径:
- Servlet中的方法大多数不由我们来调用,而是由Tomcat来调用.并且Servlet的对象也不由我们来创建,而是由Tomcat来创建!
4.Servlet总结
生命周期方法:
- void init(ServletConfig):出生之后(1次)
- void service(ServletRequest request,ServletResponse response):每次处理请求时都会被调用
- void destroy():临死之前(1次),用来释放资源
特性:
- 单例,一个类只能有一个对象,但可能存在多个类
- 线程是不安全的,所以它的效率是高的
Servlet类由我们来写,但对象由服务器来创建,并由服务器调用响应的方法
servletcontext介绍:
二:理解Servlet
1.GenericServlet
一个抽象类,其中有一个服务器提供的init()方法,还有一个无参init()方法用来回调,当服务器自动调用init()方法时,无参构造方法也会被调用.
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
应用:继承GenerivServlet实现Servlet时可以实现多态
public class Bservlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("我出生了");
}
}
只要重写父类中空的方法即可.
2.HttpServlet
HTTPServlet的原理:
HTTPServlet的时序图:
3.Servlet细节
- Servlet与线程安全:
因为一个类型的的Servlet只有一个实例对象,那么久有可能会同时出现一个Servlet同时处理多个请求。所以Servlet不是线程安全的,这也说明Servlet的工作效率很高,但也存在线程安全问题!
解决办法:- 不要在Servlet中创建成员!创建局部变量即可!
- 可以创建无状态成员!
- 可以创建有状态的成员,但状态必须是只读的!
- 默认情况下,服务器会在某个Servlet第一次收到请求时创建它,也可以在web.xml中对Servlet进行配置,是服务器启动时就创建Servlet
<url-pattern>
<url-pattern>
是<servlet-mapping>
的子元素,用来指定Servlet的访问路径,即URL。它必须是以“/”开头
- 可以在
<servlet-mapping>
中给出多个<url-pattern>
这样就可以使多个路径指向一个Servlet - url也可以使用通配符
三:ServletContext
一个项目只有一个Servlet对象!
我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!
与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!
1.ServletContext概述
服务器会为每个应用创建一个ServletContext对象
- ServletContext对象的创建是在服务器启动时完成的
- ServletContext对象的销毁是在服务器关闭时完成的
2.获取SerlvetContext
- ServletConfig#getServletContext()
- GenericServlet#getServletContext()
- HttpSession#getServletContext()
- ServletContextEvent#getSetvletContext()
3.域对象的功能
域对象就是用来在多个Servlet中传递数据!!域对象必须有存储数据功能,与队形必须要有取数据功能
ServletContext是JavaWeb四大域对象之一:
- PageContext
- ServletRequest
- HttpSession
- ServletContext
4.获取应用初始化参数
- Servlet也可以获取初始化参数,但它是局部的参数,也就是说一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备
- 而ServletContext可以配置公共的初始化参数,为所有的Servlet而用!这需要使用ServletContext才能使用!
5.ServletContext获取资源相关方法
- 获取资源的真实路径:
//获取真实的资源路径
ServletContext application=this.getServletContext();
String path=application.getRealPath("web.xml");
System.out.println(path);
- 获取资源流:
//获取资源流
InputStream in=new FileInputStream(path);
InputStream in1=this.getServletContext().getResourceAsStream("web.xml");//得到资源路径后再创建输入流对象
- 获取指定文件夹下所有资源的路径:
//获取当前资源下的所有资源的路径
Set<String> paths=this.getServletContext().getResourcePaths("/WEB-INF");
System.out.println(paths);
6.网站访问量统计小案例
一个项目中所有的资源被访问都要对访问量进行累加!
创建一个int类型的变量,用来保存访问量,然后把它保存到ServletContext的域中,这样可以保证所有的Servlet都可以访问到!
- 最初时,ServletContext中没有保存访问量相关的属性;
- 当本站第一次被访问时,创建一个变量,设置其值为1;保存到ServletContext中
- 当以后的访问时,就可以从ServletContext中获取这个变量,然后在其基础之上加1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 1.获取ServletContext对象
* 2.从ServletContext对象中获取名为count的属性
* 3.如果存在:给访问量加1,然后保存回去;
* 如果不存在说明是第一次访问,向ServletContext中保存名为count的属性,值为1
*/
//设置编码方式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
ServletContext application=this.getServletContext();
Object obj=application.getAttribute("count");
if(obj==null) {
application.setAttribute("count", 1);
}else {
int num=(int) obj;
num++;
application.setAttribute("count", num);
}
response.getWriter().write("本页面已经被访问了"+application.getAttribute("count")+"次");
}
7.获取类路径下的资源
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取类路径下的资源
ClassLoader cl=this.getClass().getClassLoader();
InputStream in=cl.getResourceAsStream("a.txt");
String s=IOUtils.toString(in);
System.out.println(s);
}
转载:https://blog.csdn.net/qq_44867340/article/details/105880596
查看评论