【Lehr】Servlet基本知识学习笔记
Servlet是什么
Servlet就是应用服务器(比如tomcat)上运行的一个小程序(Server applet),主要用来响应Http请求。广义上讲,就是个实现了Servlet接口的Java类,可以处理Http请求。
如何注册Servlet
注册Servlet其实就是配置Servlet的映射路径,以便在访问的时候可以直接让服务器找到这个Servlet。
配置文档注册
打开web.xml
写下这些:
<servlet>
<servlet-name>ShowServlet</servlet-name> //起个名字,下面好对应
<servlet-class>Servlet.ShowServlet</servlet-class> //它所在的具体的类,包名类名写完
</servlet>
配置映射路径:
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name> //名字要和上面一样
<url-pattern>/Servlet/ShowServlet</url-pattern> //配置的这个Servlet访问的路径
</servlet-mapping> //现在直接输入ShowServlet这个名字就会按照路径去找了
可以在一行<servlet></servlet>
里写多个,也可以用多个<servlet></servlet>
每个里面写一个,这样可以更方便地配置其他属性(比如优先加载)
注释注册
JavaEE6(Tomcat7,Servlet3.0)以后开始,在对应的Servlet文件顶上写点东西就可以实现注册了。
/**
* Servlet implementation class ShowAllServlet
*/ (这一团可以不用写,重点是下面那句)
@WebServlet("/ShowAllServlet")
Servlet的生命周期与运行流程
借用imooc上的一张图:
Servlet的生命周期分为以下几步:
加载->实例化->初始化->服务->销毁
加载->实例化->初始化
刚开始的时候,判断servlet实例是否存在,如果不存在,就装载servlet类并创建实例(调用构造方法),这里会调用init()方法。init()方法只会调用这一次!!!
服务
客户端向服务器发送一个请求,服务器去寻找对应的Servlet方法。如果这个Servlet已经存在,服务器调用这个Servlet,直接调用service方法(不存在的话就去加载)。服务器会给service方法自动传入一个request和一个response对象,这个是由tomcat服务器提供的封装好的),然后生成响应内容并传给服务器再回传给客户端。
service方法就是POST和GET这两种方法,具体看请求要的是哪种方法。
Get方式请求Servlet------>用超链接。
例如
<a href="HelloServlet">
先按照这个超链接去<servlet-mapping>
里找到这个对应的url,然后再通过对应的名字去上面的<servlet>
里面找到同样的名字,就可以通过类(servlet-class)去定位到目标
然后根据这个请求方式 get方式 执行相应的get方法(不过一般都默认get方法又调用post方法了)
编写Servlet的doPost方法时,需要抛出ServletExcpetion和IOException异常,不会抛出HttpServletException异常
销毁
如果服务器关闭,就调用destroy()方法。(看起来只有在服务器关闭的时候才能调用destroy方法)
自动重载
Servlet容器启动时自动装载Servlet:
在web.xml的文件中的
<servlet></servlet>
之间加入<loadon-startup>1</loadon-startup>
数字越高表示优先级越高
其实是应该给每一个servlet写一个<><>
然后在里面放名字,类,还有这个自动装载设置。
客户端首次向某个Servlet发送请求的时候
也会自动加载
当servlet被修改的时候页会重新加载,因为servlet在实例了之后会保存在内存里,所以做出修改需要重新加载
例:Tomcat装载servlet的三种情况
构造方法会被执行-------------------->然后再执行init方法
(执行构造方法就是所谓的实例化)
Destroy的是你点服务器的stop server的时候就会调用
一打开服务器就能看到System.out.println();
运行实例化编译好的class是放在WEB-INF的classes目录下的,这是被实例化的,所以你如果修改了servlet之后要把这里的文件重新编译(实例化)
你修改之后一点保存就重新修改了
Servlet和Jsp内置对象之间的关系
JSP | 怎么在servlet里得到 |
---|---|
out | response.getWriter (但是严格意义上他们的类型是不匹配的) |
request | service方法传进来的(在函数接口那里就是这个传进来的request)request的方法,比如request.getSession |
response | 同理 |
session | request.geSession(); |
apllication | getServletContext(); ServletContext application=this.getServletContext(); |
exception | Throwable |
page | this |
pageContext | PageContext |
Config | getServletConfig函数 |
如何向响应页面输出?
拿到前端画笔
PrintWriter out = response.getWriter();
开始写 这样可以直接画出一个页面 不用跳转
out.println("<h1>Hi Lehr!</h1>");
你这样输出,<h1>
也会输出的,是因为没用指定输出文本类型
response.setContentType(“text/html;charset=utf-8”);
上面这个过程可以理解成响应的时候会直接输出文本返回去在网页这个白纸上写,但是<h1>
这种是html的语言,所以你不告诉的话它就直接当字符串输出去了。
但是你这里如果是用System.out.println();这个是在后台输出的,也就是你编译器的结果框里而不是网页