Servlet是Server Applet的简称,翻译过来就是服务程序。是由sun公司提供的一门用于开发动态Web资源的技术。
简单地讲,Servlet就是运行在服务器上的一个小程序,用来处理服务器接收到的请求。
比如一般的网页程序,是由我们通过浏览器来访问实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收到请求,并对浏览器的请求做出相应的处理。而Servlet就是对请求做出处理的组件,运行于支持java的应用服务器中。
简单来说,就是从servlet出现到消亡(销毁)的全过程。
服务器启动时或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init,该servlet对象去处理所有客户端请求,在service方法中执行,最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。
①通过配置文件web.xml进行实例化
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>testServletservlet-name>
<servlet-class>org.softeem.controller.ActionServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>testServletservlet-name>
<url-pattern>/friend_demo/actionurl-pattern>
servlet-mapping>
web-app>
② 通过注解进行实例化
@WebServlet("/friend_demo/action")
public class ActionServlet extends HttpServlet {
//1、构造器
public ActionServlet(){
System.out.println("servlet对象实例化中.....");
}
}
Servlet 初始化阶段分为 2 步:
servlet实例化后就会调用init方法,被设计为只能调用一次,且是在进行第一次实例化servlet对象时调用。当用户在调用servlet时,就会创建一个servlet实例,每一次在客户端发送的请求servlet就会产生一个新的线程,从而调用对应的doGet 或 doPost 方法。init方法的作用在于初始化一些配置参数(比如编码设置),这些参数将被贯穿整个servlet生命周期。
调用service()方法是执行实际任务的主要方法,Web服务器将调用service方法处理客户端(浏览器)的请求,然后将格式化的数据响应给浏览器客户端。
service方法将会检测客户端发送给服务端的HTTP请求协议的类型,从而调用service方法中的 doGet、doPost、doPut、doDelete 等方法进行实际任务的逻辑处理。当发送对应的servlet请求时,会调用service()方法,此时不会重新创建servlet实例,也不会调用init()方法。
servlet生命周期结束时将会调用destroy()方法,并且只会调用一次。destroy方法可以让我们的servlet关闭数据库连接,把后台线程关闭,清楚Cookie数据等。当调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除
通过继承HttpServlet事件servlet接口最为方便
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
1.被创建:执行init方法,只执行一次。一般用于申请资源
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
2.提供服务:执行service方法,执行多次(可以业务逻辑代码)
每次访问Servlet时,Service方法都会被调用一次。
3.被销毁:执行destroy方法,只执行一次。一般用于释放资源
Servlet被销毁时执行。服务器关闭时,Servlet被销毁
只有服务器正常关闭时,才会执行destroy方法。
destroy方法在Servlet被销毁之前执行,一般用于释放资源
@WebServlet("/demo")
public class ServletDemo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp){
//方法体是Get请求方式的处理
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp){
//方法体是Post请求方式的处理
}
}
Servlet获取get和post参数的方式,主要有三种:
doGet()
与doPost()
方法,这两个方法是对Get和Post操作的处理逻辑HttpServlet与Http进行了绑定,因此如果我们要使用它就需要重写doGet、doPost等方法
在实际的网站开发中,页面的跳转是最常见的。Servlet中的页面跳转可以通过转发或者重定向来实现。转发使用RequestDispatcher,重定向使用HttpServletResponse。
public interface RequestDispatcher {
void forward(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}
public interface HttpServletResponse extends ServletResponse {
void sendRedirect(String var1) throws IOException;
}
二者区别:
1.请求次数
重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
2.地址栏不同
重定向地址栏会发生变化,转发地址栏不会发生变化;
3.共享数据
重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
4.跳转限制
重定向可以跳转到任意URL,转发只能跳转本站点资源;
5.发生行为不同
重定向是客户端行为,转发是服务器端行为;
例如:http://localhost:8080/user
“/user/*” 表示user目录之下
“*.do”表示后缀名do结尾
在Servlet中使用绝对路径进行转发和重定向,他们的路径起算点是不相同的,转发时以项目名称作为起算点,重定向时以端口号作为起算点。而如果使用相对路径进行重定向或转发,他们都是以当前所在路径作为起算点
jsp+jdbc+servlet实现,基于mvc设计模式
登陆页面
登陆成功页面
登陆失败页面
本次案例,主要是根据MVC开发模式,做了一个简单的登录案例,里面还有很多缺陷,并没有做到完全的面向对象开发,开发过程主要使用了jsp的一些知识,主要设计jsp的九大内置对象的使用,还有部分servlet的使用。