ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Servlet
[打印本页]
作者:
李优秀
时间:
2024-6-22 12:48
标题:
Servlet
一、Servlet概念
1、Servlet是运行在 Java 服务器端的程序,用于接收和响应来自客户端基于 HTTP 协议的哀求。
2、Servlet就是一个接口,界说了Java类被浏览器访问到(tomcat辨认)的规则。SUN公司提供
3、核心方法:service(),任何客户端的哀求都会颠末该方法
二、Servlet快速入门
1、创建一个web项目
2、界说一个类实现Servlet接口
package com;
import javax.servlet.*;
import java.io.IOException;
//tomcat下lib目录下的 servlet-api.jar引入项目中
/**
* @author 86136
*/
public class MyWeb01 implements Servlet {
@Override//创建
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("女孩");
}
@Override
public String getServletInfo() {
return null;
}
@Override
//销毁
public void destroy() {
}
}
复制代码
3、在web.xml中配置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>
<!--com.MyWeb01类的别名 test01-->
<servlet-name>test01</servlet-name>
<!--com.MyWeb01 是类的全路径-->
<servlet-class>com.MyWeb01</servlet-class>
</servlet>
<servlet-mapping>
<!--MyWeb01类与请求的映射关系引用上面的别名-->
<servlet-name>test01</servlet-name>
<!--url-pattern是我们的路径请求-->
<url-pattern>/aa</url-pattern>
</servlet-mapping>
</web-app>
复制代码
4、点击运行
5、通过浏览器测试
在浏览器访问:http://localhost:8080/aa
三、Servlet执行原理
当服务器接受到客户端浏览器的哀求后,会解析哀求URL路径,获取访问的Servlet的资源路径
查找web.xml文件,是否有对应的<url-pattern>标签体内容。
如果有,则在找到对应的<servlet-class>全类名
tomcat会将字节码文件加载进内存,而且创建其对象
调用其service方法
我们通过浏览器发送哀求,哀求首先到达Tomcat服务器,由服务器解析哀求URL,然后在摆设的应用列表中找到我们的应用。接下来,在我们的应用中找应用里的web.xml配置文件,在web.xml中找到Servlet的配置,找到后执行service方法,最后由Servlet响应客户浏览器。整个过程如下图所示:
一句话总结执行过程:
浏览器——>Tomcat服务器——>我们的应用——>应用中的web.xml——>Servlet类——>响应浏览器
四、Servlet体系结构
在刚才的入门案例中,我们界说了本身的Servlet,实现的方式都是选择实现Servlet,在Servlet的API介绍中,它提出了我们除了实现Servlet还可以继承GenericServlet和继承HttpServlet,通过查阅servlet的类视图,我们看到Servlet下有一个抽象类GenericServlet,抽象类GenericServlet另有一个子类HttpServlet。同时,在service方法中另有参数ServletRequest和ServletResponse,
五、Servlet实现方式
实现Servlet功能的三种方式:
1、上面用过的:实现Servlet接口,接口中的方法必须全部实现
使用此种方式,表现接口中的全部方法在需求方面都有重写的必要。此种方式支持最洪流平的自界说
2、继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写
使用此种方式,表现只在接收和响应客户端哀求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开辟Servlet变得简单。但是,此种方式是和HTTP协议无关的
package com;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
/**
* @author 86136
*/
public class MyWeb02 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我喜欢你");
}
}
复制代码
web.xml
<?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-name>test02</servlet-name>
<servlet-class>com.MyWeb02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test02</servlet-name>
<url-pattern>/bb</url-pattern>
</servlet-mapping>
</web-app>
复制代码
3、继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。如果我们选择继承HttpServlet时,只必要重写doGet和doPost方法,不要覆盖service方法。
使用此种方式,表现我们的哀求和响应必要和HTTP协议干系。也就是说,我们是通过HTTP协议来访问的。那么每次哀求和响应都符合HTTP协议的规范。哀求的方式就是HTTP协议所支持的方式(目前我们只知道GET和POST)
package com;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author 86136
*/
public class MyWeb03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我喜欢你苏沐橙");
}
}
复制代码
web.xml
<?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-name>test03</servlet-name>
<servlet-class>com.MyWeb03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test03</servlet-name>
<url-pattern>/cc</url-pattern>
</servlet-mapping>
</web-app>
复制代码
六、 Servlet的生命周期
1、Servlet的创建,存活及死亡
1、创建:执行init方法,只执行一次
2、存活:提供服务,执行service方法,执行多次
3、烧毁:执行destroy方法,只执行一次
2 、Servlet什么时间被创建
1、默认环境下,第一次被访问时,Servlet被创建
2、可以手动配置执行Servlet的创建时机, 在web.xml的在<servlet>标签下配置
1、 <load-on-startup>的值为负数时, 第一次被访问时创建
2、<load-on-startup>的值为0或正整数时, 在服务器启动时创建
<?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>
<!--com.MyWeb01类的别名 test01-->
<servlet-name>test01</servlet-name>
<!--com.MyWeb01 是类的全路径-->
<servlet-class>com.MyWeb01</servlet-class>
<!--在服务器启动时创建-->
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
复制代码
七、 Servlet的线程安全题目
Servlet的init方法,只执行一次,阐明一个Servlet在内存中只存在一个对象,Servlet是单例的
1、多个用户同时访问时,可能存在线程安全题目
2、解决:只管不要在Servlet中界说成员变量。纵然界说了成员变量,也不要对其修改值
八、Servlet3.0解释开辟(重点)
1、注解开辟的优势
简单便捷,不必要再操纵繁琐的web.xml配置
//基于注解配置Servlet
@WebServlet("/index")
public class MyWeb04 extends HttpServlet {}
复制代码
2、取代了web.xml中的配置
九、映射的干系配置
1、Servlet的映射方式
1、具体名称的方式。访问的资源路径必须和映射配置完全雷同。
==(常用)==
// 只有/test01哀求能匹配 http://localhost:8080/test01
@WebServlet("/test01")
2、/ 开头 + 通配符的方式。只要符合目次结构即可,不消考虑结尾是什么
// *代表全部,任意
//只要哀求符合这个目次结构/com/, 背面无论是什么都能匹配到这个
@WebServlet("/com/*")
// http://localhost:8080/com/haha http://localhost:8080/com/jjj http://localhost:8080/com
//极端一点, 匹配全部, 任何哀求都能匹配到这个
@WebServlet("/*")
3、通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不消考虑前面的路径。
http://localhost:8080/mm.do
@WebServlet("*.do")
2、Servlet的多路径映射
我们可以给一个 Servlet 配置多个访问映射,从而可以让差别的哀求路径来访问雷同的Servlet
// @WebServlet内里可以写多个路径, 使用{}包裹,用逗号分隔
@WebServlet({"/vip","/vvip","/vvvip"}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4