文章目录
1.介绍
1.1 servlet是什么?
- Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
即处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西 - Java Servlet是和平台服务器无关的一种web组件
- Java Servlet API由两个软件包组成:一个是对应HTTP的软件包,另一个是不对应HTTP的通用的软件包。这两个软件包的同时存在使得Java Servlet API能够适应将来的其他请求-响应的协议。
1.2 servlet规范目录结构
1.3 Servlet容器响应客户请求过程
- 1.Servlet引擎检查是否已经装载并创建了该Servlet的实例对象,若是,则直接执行第4步,否则,执行第2步
- 2.装载并创建该Servlet的一个实例对象,调用构造方法
- 3.调用Servlet实例对象的init方法
- 4.创建一个用于封装请求的ServletRequest对象和一个代表相应消息的ServletResponse对象,然后调用Servlet的
service方法并将请求和相应对象作为参数传递进去 - 5.WEB应用程序(容器)停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy方法
2.常用接口
2.1 Servlet
public class HellowServlet implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("*****HellowServlet****【init】********");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("****HellowServlet*****【getServletConfig】********");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("*****HellowServlet****【service】********");
}
@Override
public String getServletInfo() {
System.out.println("****HellowServlet*****【getServletInfo】********");
return null;
}
@Override
public void destroy() {
System.out.println("****HellowServlet*****【destroy】********");
}
}
public class HellwServletStart implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("*****HellwServletStart****【init】********");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("****HellwServletStart*****【getServletConfig】********");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("*****HellwServletStart****【service】********");
}
@Override
public String getServletInfo() {
System.out.println("****HellwServletStart*****【getServletInfo】********");
return null;
}
@Override
public void destroy() {
System.out.println("****HellwServletStart*****【destroy】********");
}
}
web.xml
<servlet>
<servlet-name>HellowServlet</servlet-name>
<!--访问才实例化-->
<servlet-class>com.zy.crud.servlet.HellowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HellowServlet</servlet-name>
<!--/表示web的根目录,比如http://10.12.80.16:9922/ssm-crud就是根目录-->
<url-pattern>/hellow</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HellowStart</servlet-name>
<servlet-class>com.zy.crud.servlet.HellwServletStart</servlet-class>
<!--web容器启动就实例化,值越小,越早创建-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HellowStart</servlet-name>
<url-pattern>/hellowStart</url-pattern>
</servlet-mapping>
依次输入 http://10.12.80.16:9922/ssm-crud/hellow 即可查看到如下结果:
从上面可知,当启动的时候,先执行init,当访问的时候,才执行service,当容器结束的时候,会执行destroy方法
2.2 生命周期
注意: init在构造器调用后,会立即调用这个初始化方法,如果没有指定load级别,那么init方法是在第一次有请求访问的时候,才会被执行调用,因为这时servlet才首次被虚拟机加载到内存中去。
2.3 servletconfig
ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多)
该接口有如下四个方法:
- String getServletName() – 获取当前Servlet在web.xml中配置的名字
- String getInitParameter(String name) – 获取当前Servlet指定名称的初始化参数的值
- Enumeration getInitParameterNames() – 获取当前Servlet所有初始化参数的名字组成的枚举
- ServletContext getServletContext() – 获取代表当前web应用的ServletContext对象
在Servlet的配置文件中,可以使用一个或多个标签为servlet配置一些初始化参数。
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
这样做的好处是:如果将数据库信息、编码方式等配置信息放在web.xml中,如果以后数据库的用户名、密码改变了,则直接很方便地修改web.xml就行了,避免了直接修改源代码的麻烦。
public class HellowServlet implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("*****HellowServlet****【init】********");
String dbName = servletConfig.getInitParameter("dbName");
String servletName = servletConfig.getServletName();
System.out.println("**servletName"+servletName+"***dbName"+dbName);
Enumeration initParameterNames = servletConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()){
System.out.print("**"+initParameterNames.nextElement());
}
}
<servlet>
<servlet-name>HellowServlet</servlet-name>
<servlet-class>com.zy.crud.servlet.HellowServlet</servlet-class>
<!--添加初始化参数-->
<init-param>
<param-name>dbName</param-name>
<param-value>mysql</param-value>
</init-param>
<init-param>
<param-name>dbPass</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HellowServlet</servlet-name>
<url-pattern>/hellow</url-pattern>
</servlet-mapping>
2.4 servletContext
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。
生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁域销毁。
注意:
< context-param>里的参数,可以被所有servlet所识别访问到,是个全局变量
< init-param>里的参数,是一个servlet节点里面设置的,只能这个servlet访问,是个局部变量
一些参数概念,要注意区分:
- 请求参数 parameter — 浏览器发送过来的请求中的参数信息
- 初始化参数 initparameter — 在web.xml中为Servlet或ServletContext配置的初始化时带有的基本参数
- 域属性 attribute — 四大作用域中存取的键值对
1.获取当前WEB初始化参数
<servlet>
<servlet-name>HellowServlet</servlet-name>
<servlet-class>com.zy.crud.servlet.HellowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HellowServlet</servlet-name>
<url-pattern>/hellow</url-pattern>
</servlet-mapping>
<!--配置参数-->
<context-param>
<param-name>driver</param-name>
<param-value>com.apache.mysql</param-value>
</context-param>
public class HellowServlet implements Servlet{
ServletContext servletContext;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("*****HellowServlet****【init】********");
// 1.这里要注意:在这里是获取不到context配置的参数信息的,初始化的时候,还没有生成参数
servletContext = servletConfig.getServletContext();
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("*****HellowServlet****【service】********");
// 2.在这里访问,配置的参数才能获取到
String driver = servletContext.getInitParameter("driver");
System.out.println("driver = " + driver);
}
2.获取WEB路径与流等信息
加载资源文件
2.5 servletRequest与servletResponse
1.Request
2.Response
2.6 GenericServlet
public class HelloGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
2.7 HTTPservlet
public class HelloHttpServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
2.8 Cookies
2.8 session
2.8 WEB中的绝对路径和相对路径
2.9 过滤器
<filter>
<filter-name>HelloFileter</filter-name>
<filter-class>com.zy.crud.servlet.HelloFilter</filter-class>
<init-param>
<param-name>www</param-name>
<param-value>222</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HelloFileter</filter-name>
<!--注意url写法,这里不能写/不然不起作用-->
<url-pattern>/*</url-pattern>
</filter-mapping>
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("****HelloFilter*****【init】********");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("****HelloFilter*****【doFilter】********");
}
@Override
public void destroy() {
System.out.println("****HelloFilter*****【destroy】********");
}
}
2.请求转发
2.10 监听器
Java Servlet监听器种类及介绍
1.监听对象
<listener>
<listener-class>com.zy.crud.servlet.HelloListener</listener-class>
</listener>
public class HelloListener implements ServletContextListener{
//ServletContext创建之前会调用这个方法
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("****HelloListener*****【contextInitialized】********");
}
//ServletContext销毁之前会调用这个方法
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("****HelloListener*****【contextDestroyed】********");
}
}
2.监听对象中的属性
<listener>
<listener-class>com.zy.crud.servlet.HelloContextAttrLisener</listener-class>
</listener>
public class HelloContextAttrLisener implements ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("****HelloContextAttrLisener*****【attributeAdded】********");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("****HelloContextAttrLisener*****【attributeRemoved】********");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("****HelloContextAttrLisener*****【attributeReplaced】********");
}
}
1.加载顺序
加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:context-param -> listener -> filter -> servlet -> 拦截器(interceptor)
<!--servlet-->
<servlet>
<servlet-name>HellowStart</servlet-name>
<servlet-class>com.zy.crud.servlet.HellwServletStart</servlet-class>
<!--web容器启动就实例化-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HellowStart</servlet-name>
<url-pattern>/hellowStart</url-pattern>
</servlet-mapping>
<!--过滤器-->
<filter>
<filter-name>HelloFileter</filter-name>
<filter-class>com.zy.crud.servlet.HelloFilter</filter-class>
<init-param>
<param-name>www</param-name>
<param-value>222</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HelloFileter</filter-name>
<!--注意url写法,这里不能写/不然不起作用-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--监听器-->
<listener>
<listener-class>com.zy.crud.servlet.HelloListener</listener-class>
</listener>
<!--全局参数-->
<context-param>
<param-name>driver22</param-name>
<param-value>com.apache.mysql</param-value>
</context-param>
public class HellwServletStart implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("*****HellwServletStart****【init】********");
ServletContext servletContext = servletConfig.getServletContext();
String driver22 = servletContext.getInitParameter("driver22");
System.out.println("driver22 = " + driver22);
}
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("****HelloFilter*****【init】********");
}
public class HelloListener implements ServletContextListener{
//ServletContext创建之前会调用这个方法
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("****HelloListener*****【contextInitialized】********");
}
2.11 国际化
2.12 文件上传与下载
参考:
Servlet 容器
Java Servlet API中文说明文档
Java Web(一) Servlet详解!!
Servlet 简介
JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用