JSP本质其实就是Servlet,已经编写好的JSP部署到Web容器之后,Web容器会把JSP编译成Servlet。
直接使用Servlet的缺点:Servlet开发效率非常低,特别是当使用Servlet生成表现层页面时,页面中所有的HTML标签,都需要采用Servlet的输出流来输出。而且Servlet的标准的Java类,必须由程序猿开发、修改,美工人员难以参与Servlet页面的开发;所以Servlet很难再展现层使用。
从MVC流行之后,Servlet的责任就开始明确,只是作为一个控制器来使用。不在需要生成页面标签,也不作为视图层角色使用;
Servlet是一个服务器端小程序,也是一个特殊的Java类,这个Java类必须继承HttpServlet,每个Servlet可以响应客户端的请求。
doGet:响应客户端GET请求、doPost:响应客户端POST请求、doPut:响应客户端PUT请求、doDelete:响应客户端DELETE请求
事实上,客户端请求通常只有 GET 和 POST 两种,Servlet为了响应这两种请求,必须重写doGet()和doPost();大部分时候,Servlet对所有的请求响应是完全一样的,所以,可以只重写一个方法,重写 service()方法。
HttpServlet 还包含两个方法:
init():创建Servlet实例时,调用该方法的初始化Servlet资源。
destroy():销毁Servlet实例时,自动调用该方法的回收资源。
通常无须重写 init()和 destroy()方法,除非是初始化某些资源初始化方法,回收某些资源初始化方法,例如:关闭数据库连接池;
JSP/Servlet 的生命周期
由Web容器控制,创建 Servlet 实例有两个时机,
客户端第一次请求某个 Servlet 时,系统创建该 Servlet 的实例;大部分 Servlet 都是这种 Servlet ;
Web应用启动时立即创建 Servlet 实例,即 load-on-startup Servlet
1.创建 Servlet 实例
2.Web容器调用 Servlet 的 init 方法,对 Servlet 进行初始化
3.Servlet初始化后,将一直存在于容器中,用于响应客户端请求。如果客户端发送GET请求,容器调用 Servlet 的 doGet 方法处理并响应请求;如果客户端发送POST请求,容器调用 Servlet 的 doPost 方法处理并响应请求;或者统一使用service()方法处理来响应用户请求
4.Web容器决定销毁 Servlet 时,先调用 Servlet 的 destroy 方法,通常在关闭 Web 应用之时销毁 Servlet
load-on-startup 的 Servlet
应用启动时就创建Servlet,通常是用于 某些后台服务的Servlet,或者需要拦截很多请求的Servlet,这种Servlet通常作为基础Servlet使用,提供重要的后台服务
配置load-on-startup Servlet的方法:
1> 在web.xml 文件中通过<servlet .../>元素的 <load-on-startup .../> 子元素进行配置
2> 通过@WebServlet Annotation 的 loadOnStartUp 属性决定
<load-on-startup> 元素 和 loadOnServletStartUp 属性都只接受一个整型值,这个整型值越小,Servlet就优先实例化
举个简单的实例:
@WebServlet(loadOnServletStartUp)
public class TimerServlet extends HttpServlet{
public void init( ServletConfig config ) throws ServletException{
super.init(config);
Timer t = new Timer( 1000,new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println(new Date());
}
} );
t.start();
}
}
这个Servlet没有提供service()方法,表明不能响应用户请求,所以无需配置URL映射;由于不接受用户请求,所以只能在应用启动时实例化;
在 web.xml中配置
<span style="white-space:pre"> </span><servlet>
<servlet-name> timerServlet </servlet-name> //名字
<servlet-class> lee.TimerServlet </servlet-class> //实现类
<load-on-startup> 1 </load-on-startup><span style="white-space:pre"> </span>//相当于@WebServlet的 loadOnStartUp 属性
</servlet>
配置 Servlet 的时候,还可以额外的配置参数:
例如:
@WebServl(name ="testServlet")
,urlPatterns = { “ /testServlet ” }
,initParams={
@WebInitParam( name=" driver ", value = " com.mysql.jdbc.Driver " ),
@WebInitParam( name=" url", value = " jdbc:mysql://localhost:3306/javaee " ),
@WebInitParam( name=" user ", value = " root " ),
@WebInitParam( name=" password", value = " 123456 " ) } )
调用的方法为:
String driver = config.getInitParameter( "driver" );
在 web.xml 中配置,这个就比较常见了!
<span style="white-space:pre"></span>
<servlet>
<servlet-name> timerServlet </servlet-name> //名字
<servlet-class> lee.TimerServlet </servlet-class> //实现类
<load-on-startup> 1 </load-on-startup> //相当于@WebServlet的 loadOnStartUp 属性
</servlet>
<init-param>
<param-name> driver </param-name>
<param-value> com.mysql.jdbc.Driver </param-value>
</init-param>
<init-param>
<param-name> url</param-name>
<param-value> jdbc:mysql://localhost:3306/javaee </param-value>
</init-param>
<init-param>
<param-name> user</param-name>
<param-value> root </param-value>
</init-param>
<init-param>
<param-name> password </param-name>
<param-value> 123456 </param-value>
</init-param>
使用 Servlet 作为控制器:
Servlet 充当控制器,,作用类似于调度员,所有用户请求都发送给 Servlet ,Servlet 调用 Model 来处理用户请求,然后由 JSP 来呈现处理结果;
Model一般由 JavaBean 充当,所有的业务逻辑、数据访问逻辑都在 Model 中实现;实际上隐藏在 Model 下面的有很多丰富的组件,例如:DAO、领域对象等;
Servlet 负责接收客户端请求,既不直接对客户端输出响应,也不处理用户请求;
Servlet 中写入一些验证登录,跳转返回的信息;
DAO 中定义一些链接数据库的接口,以及插入、删除、新增等操作;
JSP 负责页面展示的过程