Servlet简介
Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet运行于支持Java的应用服务器中。绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet 的使用方法
Servlet技术的核心是Servlet,它是所有Servlet类必须直接或者间接实现的一个接口。在编写实现Servlet的Servlet类时,直接实现它。在扩展实现这个这个接口的类时,间接实现它。
Servlet 的工作原理
Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例。
用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象.
Servlet的实现
Servlet创建方法:
1.实现javax.servlet.Servlet接口
2.继承javax.servlet.GenercServlet抽象类,GenericServlet是Servlet接口实现类
3.继承javax.servlet.http.HttpServlet抽象类(常用)专门处理Http请求HTTP Servlet是GenericServlet子类
第一种方式; 实现Servlet接口
编写一个类实现Servlet接口,并重写方法
package com.fs.servlet; import javax.servlet.*;import java.io.IOException; public class AServlet implements Servlet { private ServletConfig servletConfig; /** * c初始化方法,生命周期方法(有web服务器调用) * 在Servlet对象创建,马上调用它,只执行一次 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init()....."); System.out.println(servletConfig); this.servletConfig=servletConfig; } /** * 获取Servlet的配置类对象 ServletConfig *@return */ @Override public ServletConfig getServletConfig() { return this.servletConfig; } /** * 处理用户请求方法,生命周期方法(有web服务器调用),用户没请求Servlet一次, * service就执行一次 */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Aservlet........service(阳婷小猪)..."); } /** * 描述Servlet,没有意义 * @return */ @Override public String getServletInfo() { return null; } /** * 销毁方法,生命周期方法 * 当Servlet被销毁志强,调用destroy() */ @Override public void destroy() { System.out.println("AServlet.....destroy"); } /** * * */ }
在web.xml文件中,geiServlet绑定url(Servlet配置)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置Servlet--> <servlet> <servlet-name>CServlet</servlet-name> <!--Servlet类全限命名--> <servlet-class>com.fs.servlet.CServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CServlet</servlet-name> <url-pattern>/CServlet</url-pattern> </servlet-mapping> </web-app>
执行原理:
Servlet生命周期
面试高频
Servlet创建: 默认 第一次请求的时候创建Servlet对象, 马上调用init()方法进行初始化操作, 客户端每请求该Servlet一次, 调用一次Servlet对象的service(),
当Tomcat服务器关闭之前, 销毁Servlet对象, 销毁Servlet对象之前,调用destroy()
Servlet接口中关联的javaWeb的api接口
javaWeb: sun公司提供, JavaEE的标准
ServletConfig: 得到Servlet的配置
ServletRequest: 请求对象
获取请求参数: 重要
根据请求参数名获取请求参数值
前端传递的数据类型都是String
如果需要转换为其他类型, 需要对String进行类型转换
如果前端没有传递这个参数, 返回值nul
lServletResponse: 响应对象
第一种方式:实现Servlet接口
1.编写一个类实现Servlet接口,并重写方法
2.在web.xml文件中,给Servlet绑定url(Servlet配置)
Servlet第二种实现方式:继承GenericServlet
第二种实现方式:继承GenericServlet类
1.编写一个类继承HttpServlet类,重写doGet()//处理get请求,doPost()处理post请求
Servlet第三种实现方式:继承HttpServlet
专门处理http请求
编写一个类继承HttpServlet类, 重写doGet() //处理get请求, doPost() 处理post请求
2.配置
HttpServlet执行请求的流程:
Servlet细节
注解配置 web3.0以上提供注解的方式,替换xml配置
@WebServlet
get请求: 超链接链接, 浏览器地址栏输入, form action=“默认值GET”,
js: localtion.href=
post请求: form action=“post”
Get请求与post请求区别:
get请求: 请求参数通过url传递, 请求参数会在url显示, 不安全, 敏感字段,不能使用get, 请求参数只能是字符串数据
post请求: 请求参数通过请求体,请求参数不会在url显示, 安全
请求参数: 字符串数据 也可以是文件
使用idea创建Servlet
Servlet细节
servlet是否是线程安全的? 面试题
依据: 这个对象是否共享, 如果是多个线程共享, 一定是线程不安全servlet类: 在整个web项目中, 只有一个对象, 每一次请求, 服务器为这次请求创建线程处理, 多个线程共享Servlet对象, Servlet线程不安全
代码指导:编写servlet类时候, 一定不要使用属性接收用户请求参数
Servlet对象创建时机
默认情况: 在第一次访问的时候, 第一次请求, 消耗的时间比较多, 第一次惩罚
设置servlet创建时机, 在服务器启动的时候创建, 在servlet配置中有一个值: 非负整数
@WebServlet注解属性: loadOnStartup
如果不配置, 默认值: -1: servlet创建时机,在第一次访问的时候如果设置>=0整数: 在服务器启动的时候创建, 数字越小, servlet越先创建
解决方案: 修改tomcat的日志配置文件:
获取全局初始化参数: 通过ServletContext获取
servlet的url绑定
配置文件: 配置
注解: value或者urlPatterns配置
一个servlet可以绑定多个url, 但是实际开发中,
只写一个
url可以使用 *通配符: *: 表示任意个数任意字符/字符串: 精确匹配前缀匹配: /前缀字符串/*: /api/*: /api/1 /api/aa /api/abc后缀匹配: *.后缀字符串 *.do: a.do b.do c.do匹配所有: /*优先级最低
ServletContext对象
服务器会为每个应用创建一个ServletContext对象: 代表这个应用程序
ServletContext对象的创建是在服务器启动时完成的;
ServletContext对象的销毁是在服务器关闭时完成的
ServletContext生命周期与服务器周期一样, 与天同寿作用: ServletContext对象的作用是在整个Web应用的动态资源之间共享数据! 称为Application域
域对象: 类似与银行, 数据流通javaWeb中, 有四大域对象: 范围从小到大PageContext: page域, 在同一个jsp, servlet类有效, 很少使用ServletRequest: request域: 在同一次请求内有效, 重点HttpSession: session域: 在同一次会话(包含多次请求)内有效 , 重点ServletContext: application域: 整个Web应用都有效
域对象都有如下功能:
存数据: setAttribute(String name, Object value): 存储任意数据类型值
取数据: Object getAttribute(String name) 如果域中没有key, 返回null
删除数据: removeAttribute(String name)
获取域中所有属性的name: Enumeration getAttributeNames()
得到ServletContext对象:
通过ServletConfig的getServletContext()
如果Servlet继承GenericServlet, 直接getServletContext();
获取全局的初始化参数
全局初始化参数: 整个项目的动态资源都可以的访问的数据
练习: 使用ServletContext实现网站访问量, 每访问网站servlet, 访问量加1, 显示总访问量,
项目编码统一为UTF-8:
请求对象
javaWeb核心对象创建都不是程序员创建:Servlet, ServletConfig. ServletContext, ServletRequest, ServletResponse对象都是web服务器创建, 程序员直接使用
ServletRequest: 父接口
HttpServletRequest: 是ServletRequest子接口
当客户端每请求一次, 服务器就会为这个请求,创建Request, Response对象 服务器调用service() 方法, 传递Request, Response对象, 如果Servlet继承HttpServlet, HttpServlet他的service() 把Request, Response对象向下转型为HttpServletRequest, HttpServletResponse子对象. 根据请求方式, 调用doGet()/doPost(), 把HttpServletRequest, HttpServletResponse子对象传递过来
请求对象: 封装所有请求相关的数据:比如请求头数据,请求方式, 客户端ip, 端口, 服务器ip, 端口, 请求参数
请求对象方法分类:
获取请求头参数
获取请求参数
域对象
请求转发,包含
其他方法
request域: 同一次请求内有效
request域在请求转发中, 使用
request域对象功能
request获取请求头数据 了解
request与请求头相关的方法有:
String getHeader(String name):获取指定名称的请求头;
Enumeration getHeaderNames():获取所有请求头名称;
int getIntHeader(String name):获取值为int类型的请求头。