解释一下什么是servlet?
可以从两个方面看servlet
1.API:有一个接口Servlet,它是Servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。
2.组件:服务器端用来处理客户端请求的组件,需要在web.xml中配置。
一般来说,写一个servlet,有三种实现方式:
1、实现Servlet接口。
2、继承GenericServlet。
3、继承HttpServlet。
第三种方式是现在比较常用的。
第一种:
- package com.tsinghua;
- //这是我的第一个servlet,使用实现servlet接口的方式来开发。
- import javax.servlet.*;
- import java.io.*;
- public class Hello implements Servlet{
- /**
- * 销毁servlet实例,释放内存
- * 3种情况:
- * 1.reload 该servlet(所在的webapps)
- * 2.关闭tomcat
- * 3.关机
- */
- @Override
- public void destroy() {
- // TODO Auto-generated method stub
- System.out.println("destroy it");
- }
- @Override
- public ServletConfig getServletConfig() {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public String getServletInfo() {
- // TODO Auto-generated method stub
- return "";
- }
- /**
- * 初始化该servlet,类似于构造函数。
- * 该函数只会被调用一次。当用户第一次访问该servlet时被调用。
- */
- @Override
- public void init(ServletConfig arg0) throws ServletException {
- // TODO Auto-generated method stub
- System.out.println("init it");
- }
- /**
- * 这个函数用于处理业务逻辑
- * 程序员应该把业务逻辑代码写在这里
- * 这个函数会被调用多次,当用户每访问该servlet时都会被调用。
- * req:用来获得客户端的信息
- * res:用来对客户端返回信息
- */
- @Override
- public void service(ServletRequest req, ServletResponse res)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- System.out.println("service it");
- //从res中得到PrintWriter
- PrintWriter pw=res.getWriter();
- pw.println("hello,world");
- }
- }
第二种:
- package com.tsinghua;
- //这是我的第二个servlet,通过继承GenericServlet来开发
- import javax.servlet.GenericServlet;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.*;
- import java.io.*;
- public class HelloGen extends GenericServlet{
- /**
- * 重写service方法即可。
- */
- @Override
- public void service(ServletRequest req, ServletResponse res)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- //返回HelloWorld!generic
- PrintWriter pw=res.getWriter();
- pw.println("HelloWorld!generic");
- }
- }
第三种:
- package com.tsinghua;
- //这是我的第3个servlet,通过继承HttpServlet来开发
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.*;
- public class HelloHttp extends HttpServlet{
- /**
- * 处理get请求
- * req:客户端的请求信息
- * resp:客户端的返回信息
- */
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- {
- //业务逻辑在这里写。
- try {
- PrintWriter pw=resp.getWriter();
- pw.println("Hello,Http");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * 处理post请求
- * req:客户端的请求信息
- * resp:客户端的返回信息
- */
- public void doPost(HttpServletRequest req, HttpServletResponse resp)
- {
- //post和get请求一样
- this.doGet(req, resp);
- }
- }
web.xml中配置servlet
- <?xml version="1.0" ?>
- <!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
- <web-app xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
- <display-name>Welcome to Tomcat</display-name>
- <description>
- Welcome to Tomcat
- </description>
- <!-- servlet的配置 -->
- <servlet>
- <servlet-name>hello</servlet-name><!-- servlet的名字,任意的 -->
- <servlet-class>com.tsinghua.Hello</servlet-class><!-- 指明servlet的包名+类名 -->
- </servlet>
- <!-- 映射关系配置 -->
- <servlet-mapping>
- <servlet-name>hello</servlet-name><!-- servlet的名字,和上面一样 -->
- <url-pattern>/hello</url-pattern><!-- 这是在浏览器中输入的访问该servlet的url -->
- </servlet-mapping>
- <!-- servlet的配置 -->
- <servlet>
- <servlet-name>helloGen</servlet-name><!-- servlet的名字,任意的 -->
- <servlet-class>com.tsinghua.HelloGen</servlet-class><!-- 指明servlet的包名+类名 -->
- </servlet>
- <!-- 映射关系配置 -->
- <servlet-mapping>
- <servlet-name>helloGen</servlet-name><!-- servlet的名字,和上面一样 -->
- <url-pattern>/helloGen</url-pattern><!-- 这是在浏览器中输入的访问该servlet的url -->
- </servlet-mapping>
- <!-- servlet的配置 -->
- <servlet>
- <servlet-name>helloHttp</servlet-name><!-- servlet的名字,任意的 -->
- <servlet-class>com.tsinghua.HelloHttp</servlet-class><!-- 指明servlet的包名+类名 -->
- </servlet>
- <!-- 映射关系配置 -->
- <servlet-mapping>
- <servlet-name>helloHttp</servlet-name><!-- servlet的名字,和上面一样 -->
- <url-pattern>/helloHttp</url-pattern><!-- 这是在浏览器中输入的访问该servlet的url -->
- </servlet-mapping>
- </web-app>
说一声Servlet的生命周期
Servlet的生命周期分为五个阶段:
0)。加载 容器通过类加载器使用Servlet类对应的文件来加载Servlet
1)。创建 通过调用Servlet的构造函数来创建一个Servlet实例
2)。初始化阶段 调用init()方法
3)。响应客户请求阶段 调用service()方法-->doGet/doPost()
4)。终止阶段 调用destroy()方法
如果某个Servlet配置了 <load-on-startup >1 </load-on-startup >,该Servlet也是在Tomcat(Servlet容器)启动时初始化。
如果Servlet没有配置<load-on-startup >1 </load-on-startup >,该Servlet不会在Tomcat启动时初始化,而是在请求到来时初始化。
配置这个参数,有两个好处:1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;2、配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应web请求。(例如可判断网络是否通畅)
servlet和filter的区别:
servlet是一种运行在服务器端的Java应用程序,独立于平台和协议,可以动态的生成web页面,它工作于客户端请求和服务器的中间层
filter是一个可以复用的代码片段,可以用来转换请求,响应以及头信息,filter不能产生请求和响应,他只能在请求到达servlet之前对请求进行修改,或者在请求返回客户端之前对响应进行处理
servlet的流程比较短,url来了之后就对其进行处理,处理完就返回数据或者转向另一个页面
filter的流程比较长,在一个filter处理之后还可以转向另一个filter进行处理,然后再交给servlet,但是servlet处理之后不能向下传递了。
filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等
Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处 理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给 Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。