介绍:
Servlet 是 JavaEE 规范之一。规范就是接口Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监器。Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。Tomcat是servlet的容器。spring mvc 基于servlet上面封装的框架。Java与Servlet简介:
Java针对Web提出了Servlet规范,即提供了Java与HTTP协议沟通的接口,这意味着Java可以以直观的面向对象的抽象方式编写HTTP服务端代码;Servlet接受请求对象,检查其中的数据,执行适当的后台逻辑,然后向客户返回响应。 ①提供Java使用HTTP的方法; ②提供了会话机制,解决无状态问题; ③负责包装的请求对象,无须开发人员解析传入的HTTP请求;CGI和Servlet的对比:
Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势: ①性能明显更好。 ②Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。 ③Servlet 是独立于平台的,因为它们是用 Java 编写的。 ④服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。 ⑤Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。CGI:
链接:CGI是什么早期的Web服务器,只能响应浏览器发来的HTTP静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。随着Web技术的发展,逐渐出现了动态技术,但是Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序(CGI程序)之间数据互通,于是出现了CGI(Common Gateway Interface)通用网关接口。简单理解,可以认为CGI是Web服务器和运行其上的应用程序进行“交流”的一种约定。CGI是Web服务器和一个独立的进程之间的协议,它会把HTTP请求Request的Header头设置成进程的环境变量,HTTP请求的Body正文设置成进程的标准输入,进程的标准输出设置为HTTP响应Response,包含Header头和Body正文。 CGI只是一个接口规范或协议,它的实现则与具体的编程语言相关。在2000年以前,CGI通用网关接口盛行,那个时候,Perl是编写CGI的主流语言,以至于一般的CGI程序都是Perl程序。URL地址到Servlet程序的访问:
Servlet 的生命周期:
①执行 Servlet 构造器方法②执行 init 初始化方法第一、二步是在第一次访问的时候创建 Servlet 程序会调用。③执行 service 方法第三步,每次访问都会调用。④执行 destroy 销毁方法第四步在 web 工程停止的时候调用。Servlet 类的继承体系: servlet配置详解:
用来声明一个servlet数据,常用的有以下几个子标签 <servlet-name></servlet-name> servlet名称,与下文提到的 servlet-mapping 标签的 servlet-name 相对应 <servlet-class></servlet-class> servlet类的完整类名 <url-pattern></url-pattern> 映射路径,使用该路径可以访问到想要访问的 servlet,可自行定义 <init-param></init-param> servlet类的初始化参数,有两个子标签 <param-name></param-name> 可以理解为map中的key <param-value></param-value> 可以理解为map中的value <load-on-startup></load-on-startup> 当web应用启动时,用于指定加载servlet的顺序 当值 大于等0 时,web容器会按照值大小 从小到大 顺序加载 当值 为负或未定义 时,web容器会在首次访问该servlet时加载它ServletConfig类简介:
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的ServletConfig 对象。案例: <servlet> <servlet-name>ServletConfigDemo1</servlet-name> <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class> <!--配置ServletConfigDemo1的初始化参数 --> <init-param> <param-name>name</param-name> <param-value>gacl</param-value> </init-param> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </servlet>ServletConfig 类的三大作用:
可以获取 Servlet 程序的别名 servlet-name 的值获取初始化参数init-param获取ServletContext 对象ServletContext 类简介:
ServletContext 是一个接口,它表示 Servlet 上下文对象一个 web 工程,只有一个 ServletContext 对象实例。ServletContext 对象是一个域对象。ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁案例: <!-- 全局配置参数,因为不属于任何一个servlet, 但是所有的servlet都可以通过servletContext读取这个数据 --> <context-param> <param-name>param1</param-name> <param-value>value1</param-value> </context-param> <context-param> <param-name>param2</param-name> <param-value>value2</param-value> </context-param>ServletContext 类的四个作用 :
获取 web.xml 中配置的上下文参数 context-param获取当前的站点根目录 ①返回结果格式:/工程名 ②调用ServletContext.getContextPath()方法 //获得的是当前的项目(工程)名 :/report_emp System.out.println(request.getContextPath()); 获取工程部署后在服务器硬盘上的绝对路径 ①调用ServletContext.getRealPath()方法 ②参数格式:加不加“/”无所谓 //工程下 不加斜杠的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\ System.out.println("工程下 不加斜杠的绝对路径是:" +servletContext.getRealPath("")); //工程下 的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\ System.out.println("工程下 的绝对路径是:" +servletContext.getRealPath("/")); //工程下 css 不加斜杠目录的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\css System.out.println("工程下 css 不加斜杠目录的绝对路径是:" + servletContext.getRealPath("css")); //工程下 css 目录的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\css System.out.println("工程下 css 目录的绝对路径是:" + servletContext.getRealPath("/css")); 像Map 一样存取数据ServletContext与ServletConfig的区别:
定义 ①ServletConfig:Servlet的配置对象,容器在初始化Servlet时通过它传递信息给Servlet。 ②ServletContext:上下文对象,提供了一系列方法供Servlet与Web容器交互。创建时机 ①ServletConfig:在容器初始化Servlet的时候,并为其提供上下文初始化参数的名/值对的引用。 ②ServletContext:容器启动的时候,并为其提供Servlet初始化参数的名/值对的引用。作用范围(可见性) ①ServletContext:每个JVM中每个Web应用一个ServletContext。 ②ServletConfig:每个JVM中每个Web应用的每个Servlet一个ServletConfig。总结:ServletConfig=Servlet初始化参数,ServletContext=上下文初始化参数。HTTP协议:
什么是协议? 协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。HTTP 协议中的数据又叫报文。Get请求: Post请求: 常用请求头的说明:
Accept: 表示客户端可以接收的数据类型Accpet-Languege: 表示客户端可以接收的语言类型User-Agent: 表示客户端浏览器的信息Host: 表示请求时的服务器 ip 和端口号GET 请求有哪些:
form 标签 method=geta 标签link 标签引入 cssScript 标签引入 js 文件img 标签引入图片iframe 引入 html 页面在浏览器地址栏中输入地址后敲回车POST 请求有哪些:
form 标签 method=postPOST 与GET总结:
除了form 标签 method=post是post请求,其他几乎都是get请求。常用的响应码说明 :
200 表示请求成功302 表示请求重定向404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)500 表示服务器已经收到请求,但是服务器内部错误(代码错误)MIME 类型说明:
MIME 是 HTTP 协议中数据类型。MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet邮件扩充服务。MIME 类型的格式是“大类型/小 类型”,并与某一种文件的扩展名相对应。 常见的 MIME 类型:HttpServletRequest类简介:
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过HttpServletRequest 对象,获取到所有请求的信息。HttpServletRequest 类的常用方法:
getRequestURI() 获取请求的资源路径getRequestURL() 获取请求的统一资源定位符(绝对路径)getRemoteHost() 获取客户端的 ip 地址 iv. getHeader() 获取请求头getParameter() 获取请求的参数getParameterValues() 获取请求的参数(多个值的时候使用)getMethod() 获取请求的方式 GET 或 POSTsetAttribute(key, value); 设置域数据getAttribute(key); 获取域数据getRequestDispatcher() 获取请求转发对象请求的转发:
请求转发是指服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。 ①服务器内请求转发也是要经过前端控制器,跟普通请求一样。 ②forward是转发请求,不转发地址。forward不但转发请求内容,还把请求的方式也转发了,所以forward的请求是get还是post取决于启用forward的源请求是post方式还是get方式。 ③例如:a.jsp 以 post 方式调b.jsp,那么b.jsp 以forward的方式访问c.jsp也会以post方式访问。请求转发方式(B->C): ①首先A向B发出请求(第一次),然后B通过请求转发的方式跳转到C,这就不会通过A来跳转,而是B自己直接向C发出请求,具体看下面这张图。 请求转发只有一次请求,且仅仅是服务器的内部跳转,所以地址会不会改变。是否保留一次请求数据: ①pageContext:仅仅是当前页面有效,转发无效。 ②request:一次请求有效,因此转发有效。 ③session:同一次会话有效,因此转发也有效。 ④application:全局变量,整个项目运行期间都有效,因此转发有效。Web中的相对路径和绝对路径:
在 javaWeb 中路径分为相对路径和绝对路径两种: ①相对路径是: <1> . 表示当前目录 <2>.. 表示上一级目录 <3>资源名表示当前目录/资源名 ②绝对路径是: <1>http://ip:port/工程路径/资源路径在实际开发中,路径都使用绝对路径,而不简单的使用相对路径: ①绝对路径 ②base+相对路径base标签的作用:
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。web 中 / 斜杠的不同意义 :
在 web 中 / 斜杠 是一种绝对路径。/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/ ①<a href="/">斜杠/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径 ①<url-pattern>/servlet1</url-pattern> ②servletContext.getRealPath(“/”); ③request.getRequestDispatcher(“/”); ④特殊情况:response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/HttpServletResponse类简介:
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置。两个输出流的说明:
字节流 getOutputStream();:常用于下载(传递二进制数据)字符流 getWriter();:常用于回传字符串(常用)两个流同时只能使用一个,使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。response的常用方法:
告诉浏览器数据类型 setContentType()设置response的编码格式 setCharacterEnconding()返回服务器的预设错误网址并显示错误信息 sendError()重定向页面 sendRedirect()获取通向浏览器的字节流 getOutputStream()获取通向浏览器的字符流 getWriter()回传路径 encodeRedirectURL()setHeader()设置消息头setStatus()设置状态addCookie()添加Cookie请求重定向:
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说:“我给你一些地址,你去新地址访问”。叫请求重定向(因为之前的地址可能已经被废弃)。 ①redirect(重定向)是通过服务端向客户端发送状态码,在客户端跳转url,redirect都是get的方式请求,而且url地址会跳转到目标地址。 重定向方式(B->C):首先A向B发出请求(第一次),然后B通过重定向的方式跳转到C,但不会直接向C发出请求,而是先返回到A,通过A向C发出请求(第二次)。具体看下面这张图:由于两次请求,且第二次请求也是A发的,所以地址栏会改变。是否保留一次请求数据: ①pageContext:仅仅是当前页面有效,重定向无效。 ②request:一次请求有效,两次请求就不是不一样的请求了,因此重定向无效。 ③session:同一次会话有效,因此重定向也有效。 ④application:全局变量,整个项目运行期间都有效,因此重定向也有效。web.xml主要用于配置web项目启动时加载的信息:
总结:web.xml中元素的加载顺序 元素节点的加载顺序与它们在 web.xml 文件中的先后顺序无关,通常是ServletContext -> listener -> filter -> servlet---->------>error-pagecontext-param 用来配置初始参数listener 用来配置监听器filter用来配置过滤器servlet 用来配置servlet实例web-app:xml文件的根标签,用于声明命名空间、schema约束等 ①xmlns="http://java.sun.com/xml/ns/javaee" <1>XML Namespaces,声明了命名空间,用于避免命名冲突,有疑惑的小伙伴可以点击这里 ②xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <1>XML Schema Instance,声明了web.xml所需要遵循的xml规范(xsi只是一个别名,可以自行定义,不过约定俗成使用xsi来表示) ③xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" <1>schemaLocation 是xsi的一个子元素,所以以 xsi:schemaLocation 来命名,它由一个 URI引用对 组成,两个URI之间以 空白符 分隔。第一个URI是 命名空间的名字,第二个URI是 模式文档的位置,模式处理器将从这个位置读取模式文档 <2>声明了 XML Namespace和对应的 XSD(Xml Schema Definition) 文档的位置,实际上就是声明了该命名空间对应的具体模板是哪个 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> </web-app> welcome-file-list: 用来配置欢迎页 ①设置欢迎页,若不设置则会默认访问 WEB-INF 下的 index.html 页面 ②当访问项目时,容器会按顺序依次搜索页面,如果有对应的页面存在,则显示该页面,若都没匹配到,则会报404错误 <welcome-file-list> <welcome-file>index1.html</welcome-file> <welcome-file>index2.html</welcome-file> <welcome-file>index3.html</welcome-file> </welcome-file-list> session-config:设置 session 超时时间,单位为分钟 <session-config> <session-timeout>30</session-timeout> </session-config> error-page:设置错误页,当404或500或指定异常时可以跳转至指定页面,有三个子标签: ①按错误号指定跳转--error-code。 ②按异常类型指定跳转--exception-type。 <error-code></error-code> 错误码,例如 404, 500等 <exception-type></exception-type> 异常类型,例如 java.lang.NullPointerException(空指针异常) <location></location> 用来设置错误页 <error-page> <error-code>404</error-code> <location>/error_404.html</location> </error-page> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/error_null.html</location> </error-page> icon:当使用GUI(Graphic User Interface)工具时,用于指定web应用的图标,拥有两个字子标签,只支持 gif 和 jpg 格式。 <small-icon></small-icon> 小图标为 16*16像素 <large-icon></small-icon> 大图标为 32*32像素 <icon> <small-icon>/images/xxx.jpg</small-icon> <large-icon>/images/xxx.jpg</large-icon> </icon> display-name:当使用GUI(Graphic User Interface)工具时,用于指定web应用的名称 <display-name>xxxxxxx</display-name> description:用于描述web应用的相关信息 <description>xxxxxxx</description> distributable:元素为空标签,它的存在与否可以指定站台是否可分布式处理,也就是实现session复制,分布式web容器应用。 ①如果在web.xml中指定该标签,则表示应用程序已经可以部署在分布式的servlet容器中了,即此应用程序可以在多个实例之间分发servlet及会话 ②只要看web.xml中是否出现该标签,就可以判断web项目是否具有分布式的功能 <distributable/> jsp-config 包括taglib>和jsp-property-group 两个子元素。 ①其中taglib元素在JSP 1.2时就已经存在;而jsp-property-group是JSP 2.0 新增的元素。 jsp-property-group元素主要有八个子元素,它们分别为: <1>description:设定的说明; <2>display-name>:设定名称; <3>url-pattern:设定值所影响的范围,如:/CH2 或 /*.jsp; <4>el-ignored:若为true,表示不支持EL 语法; <5>scripting-invalid:若为true,表示不支持<% java代码%>语法; <6>page-encoding:设定JSP 网页的编码; <7>include-prelude:设置JSP 网页的抬头,扩展名为.jspf; <8>include-coda:设置JSP 网页的结尾,扩展名为.jspf。 <jsp-config> <taglib> <taglib-uri>Taglib</taglib-uri> <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location> </taglib> <jsp-property-group> <description>Special property group for JSP Configuration JSP example.</description> <display-name>JSPConfiguration</display-name> <url-pattern>/jsp/* </url-pattern> <el-ignored>true</el-ignored> <page-encoding>GB2312</page-encoding> <scripting-invalid>true</scripting-invalid> <include-prelude>/include/prelude.jspf</include-prelude> <include-coda>/include/coda.jspf</include-coda> </jsp-property-group> </jsp-config>