Servlet
含义
由java编写的,线程安全(一个对象的属性,只提供给其他的线程get方法不提供set方法)的web组件;在MVC模式中起到控制层的作用;主要功能在于交互式地浏览和修改数据,生成动态Web内容;
功能
1、CGI:通用网关接口;
通用网关接口:以注入的方式从web容器中拿到和传递内置对象
注入:调用方法就传递数据,提高效率;config、request、response
依赖查找:依赖对象给数据;out、session、application
2、拿到请求参数,对请求参数的格式做验证,创建表单bean,收集表单数据;
3、对请求进行分析,通过分析,把请求分发给业务层;
4、根据业务层的转向信息转到视图层;
Servlet架构
流程
启动tomcat, servlet就 创建了
1 tomcat启动以后,用户发请求[例如,查找姓名为Tom的学生的信息,这个请求通过浏览器,通过表单发出去],这个请求发送到http协议上,首先给tomcat服务器,
2 tomcat服 务器接收这个请求,为这个请求创建request, response内 置对象; request内置 对象存放请求字符串,请求参数,IP地址和cookie;
3 tomcat通 过配置[必须配置]把请求转给控制层servlet组件,同时把request内置对象,response内置对象注入给servlet;
4 servlet调 用相应的方法后,创建表单bean,从request中 拿到请求参数封装到表单bean; servlet拿到请求参数, 对请求参数进行分析,把请求分发给业务层[给业务层request, response, 表单bean] ;
5 业务组件如果需要到数据库里查找信息,业务层又把请求交给了持久层,调用持久层对象的方法[业务层已经把表单bean传给了持久层,持久层拿到了表单bean,就拿到了用户的请求参数]
6 持久层通过sql语句访问数据库,最后会拿到结果[Tom的姓名,年龄等一些信息],持久层拿到了用户Tom的一些信息,持久层创建结果bean,然后把结果信息封装到结果bean里面,紧接着持久层把结果bean返回给业务层;
7 业务层会把这个结果bean设到request内置对象,然后业务层又向控制层返回一个转向信息;
8 控制层对转向信息进行分析,转向了相应的视图组件jsp[视图组件不一定是jsp];
8 视图组件从request内置对象当中拿到了结果信息,用el表达式或者标签进行处理「这个过程叫渲染];
9 最后渲染的结果通过response放到HTTP协议返回给浏览器
语法
包声明:字节码文件要放到 WEB-INF/classes/以包对应的目录结构下;
包导入:
import java.io.* ;
// HttpServlet属于javax.servlet.http包下
// ServletException属于javax.servlet包下
import javax.servlet.* ;
// HttpServletRequest、HttpServletResponse存放在javax.servlet.http包下
import javax.servlet.http.* ;
要继承HttpServlet;
至少复写四个方法:
doGet方法:
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
接收和处理get请求,当地址栏或超链接向服务器发送get请求时,通过配置tomcat会调用servlet的doGet方法,同时把request和response对象(对象的地址)注入进来,方法的形参用子接口类型的变量来接收,还要抛出IOException和ServletException;
doPost方法:
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
处理post请求;
init方法:
public void init(ServletConfig config) throws ServletException
一创建servlet对象就会立马调用该方法,并把config对象注入进来,获取初始化信息;
destory方法:
tomcat关闭就会调用该方法销毁servlet,做善后工作,最后servlet的“尸体”被GC掉;
部署和配置
方法一:servlet的jar包(tomcat/common/lib下)要放在jdk/jre/lib/ext下;
方法二:通过classpath指定,在classpath中加入此开发包的路径;
tomcat一启动就会读取web.xml文件的<servlet>标签,看到配置了<load-on-startup>标签,就按<servlet-class>的指示到 WEB-INF/classes下找包对应的类----SimpleServlet,并调用无参的构造方法创建出SimpleServlet对象,
只有配置了<load-on-startup>才会在tomcat一启动就创建servlet对象,如果没有配置该标签,只有用户第一次访问servlet组件的时候才会创建servlet对象
推荐:配置<load-on-startup>,servlet创建越早越好;0-9代表创建servlet对象的优先级,数字越小优先级越高;
配置代码:
<servlet>
<servlet-name>simple</servlet-name>
<servlet-class>cn.zte.pxb.servlet.SimpleServlet</servlet-class> //找到SimpleServlet对象
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
Servlet的访问
先找真实项目名,读取项目下的web-xml,找到相应的servlet对象(或创建servlet对象)
test虚项目名-->config下的servlet.xml-->真实项目名
组件demo映射名-->当前真实项目的web.xml-->找到对应的servlet
找到url=demo的<servlet-mapping>中的<servlet-name>,再找到对应的servlet对象(如果没有配load,就此时才创建)
调用servlet对象对应的get或者post方法
通过response内置对象拿到out内置对象,不是创建。
servlet拿到out,servlet发送静态代码给浏览器,谁拿谁发
Servlet生命周期
1. Tomcat启动,创建servlet对象,或在用户第一次访问servlet组件时创建servlet对象;
2. Servlet对象一创建调用init()方法,把config对象注入, 获取初始化参数;
3.用户通过get发送请求,tomcat通过配置调用servlet对象的doGet()方法,同时把request,response对象注入进来;
4.在doGet()方法中, 创建表单bean, 封装表单bean数据, 对请求进行分析,分发给业务层;
5.业务层获得持久层的结果bean后, 向servlet的doGet()方法发送转向信息, servlet对转向信息进行分析,把请求分发视图组件
6.视图组件从request中拿到结果信息,对结果数据进行渲染,把最后的结果信息通过response回传给浏览器;