虽然在大学的jsp专业课里“听说”过Servlet,但当时对Servlet的认识,的的确确停只是留在“听说”的阶段。还记得刚到公司实习那时,报了个Servlet的错,师傅问我Servlet配置对了吗?我来了一句:“什么配置?”,原来前几天在做DRP的过程中,渐渐加深了对Servlet的认识。下面谈一下对Servlet的理解。
(文章中用登陆的业务逻辑来说明。)
起初,java web 开发中,Client与Server的工作方式是客户端向Servlet提交请求(如提交用户名、密码),Servlet处理(如调用业务逻辑),将处理结果拼接成HTML格式返回到客户端:
Client:login.html
<html> <head>Servlet Test</head> <body> <form method="post" action="/servlet/LoginServlet"> <input type="input" name="userName"/> <input type="input" name="password"/> <input type="submit" name="submit"/> </form> </body> </html>
Servlet:LoginServlet.java
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.*; /** * 登陆 * @author Danny */ public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { super.doGet(request, response); response.setContentType("text/html;chartset=utf-8"); String userName=request.getParameter("userName"); String password=request.getParameter("password"); boolean isLoginSuccessful=Manager.Login(userName,password); if(isLoginSuccessful){ response.getWriter().print("登陆成功!"); }else{ response.getWriter().print("登陆失败!"); } } }
Manager代码省略~~
除此之外还要在web.xml中配置Servlet:
<servlet> <servlet-name>LoginServlet</servlet-name> <!--Servlet的名字,可以任意命名--> <servlet-class>com.danny.servlet.LoginServlet</servlet-class> <!--Servlet所在的真实路径--> </servlet> <servlet-mapping> <servlet-name>ClientIdValidateServlet</servlet-name> <!--Servlet名字,必须与上面Servlet的名字一致--> <url-pattern>/servlet/LoginServlet</url-pattern><!--Servlet虚拟路径,可以任意命名,form的action的属性值就是它--> </servlet-mapping>
(web.xml配置文件中每个标签的含义可以看后面的注释)
每个Servlet都是一个java类,都要继承javax.servlet包下的GenerateServlet类。其生命周期如下:
⑴ 客户端发送请求之后,Servlet容器(如Tomcat)读取配置文件,将Servlet加载到内存并实例化(一个Servlet只实例化一次)。
Servlet有两种实例化的方式:
①在Tomcat启动时实例化,在配置文件<servlet></servlet>标签中加入<load-on-startup>1</load-on-startup>。Servlet容器按属性值由小到大进行实例化,也就是<load-on-startup>属性值越小越先被实例化,值为0的Servlet最后被实例化。因为Servlet实例化需要较长的时间,所以这种方法的好处是用户等待时间较少。
②调用Servlet时进行实例化,<load-on-startup>属性值小于0时,Tomcat启动时不对Servlet进行实例化,<load-on-startup>属性值默认小于0。
⑵ 实例化时,调用init()方法(此方法继承自GenerateServlet类)进行初始化。
⑶ 创建HttpResponse、HttpRequest对象,执行Service(HttpServletRequest req,HttpServletResponse res)方法,根据客户端请求的类型(post/get)来判断是接下来是调用doPost()方法还是调用doGet()方法。(HttpServletRequest负责接收页面传过来的数据,HttpServletResponse负责向页面写数据)
⑷ 服务器停止时,调用destory()方法,销毁Servlet实例。