您现在的位置是:首页 > 其他 当前栏目 JAVA Servlet详解 服务器 客户端 Servlet 2023-03-02 11:00:29 时间 # 什么是Servlet # Servlet是运行在web服务器或应用服务器上的程序。 Servlet作为来自web浏览器或其他Http客户端的请求和Http服务器上的数据库或应用程序之间的中间件。 servlet中封装了http的请求和响应。 那为什么要使用servlet呢,如果web是静态的网页,是不需要这样做的。但是网页的动态显示需要使用servlet。 # Servlet详解 # Servlet客户端http请求 Servlet服务器http响应 Servlethttp状态码 可以通过HttpservletResponse对象来设置servlet程序中的http状态码 servlet编写过滤器 servlet过滤器是可用于servlet编程的java类,作用是: 在客户端的请求访问后端资源之前,拦截请求进行处理 在服务器的响应发送给客户端之前,处理这些响应。 过滤器类是一个实现了javax.servlet.Filter接口的java类。这个接口主要定义了一下三个方法 <table style="border:0px;color:rgb(51,51,51);font-family:'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', Arial, sans-serif;font-size:12px;background-color:rgb(255,255,255);"> <tbody> <tr style="border-top:0px;background-color:rgb(246,244,240);"> <th style="border-color:rgb(85,85,85);font-size:12px;color:rgb(255,255,255);background-color:rgb(85,85,85);vertical-align:top;width:29px;">序号</th> <th style="border-color:rgb(85,85,85);font-size:12px;color:rgb(255,255,255);background-color:rgb(85,85,85);vertical-align:top;">方法 & 描述</th> </tr> <tr style="border-top:0px;background-color:rgb(255,255,255);"> <td style="border-color:rgb(212,212,212);font-size:13px;min-width:24px;line-height:2em;vertical-align:top;">1 </td> <td style="border-color:rgb(212,212,212);font-size:13px;line-height:2em;min-width:24px;vertical-align:top;"><strong>public void doFilter (ServletRequest, ServletResponse, FilterChain)</strong><br>该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。</td> </tr> <tr style="border-top:0px;background-color:rgb(246,244,240);"> <td style="border-color:rgb(212,212,212);font-size:13px;min-width:24px;line-height:2em;vertical-align:top;">2</td> <td style="border-color:rgb(212,212,212);font-size:13px;line-height:2em;min-width:24px;vertical-align:top;"><strong>public void init(FilterConfig filterConfig)</strong><br>web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。</td> </tr> <tr style="border-top:0px;background-color:rgb(255,255,255);"> <td style="border-color:rgb(212,212,212);font-size:13px;min-width:24px;line-height:2em;vertical-align:top;">3</td> <td style="border-color:rgb(212,212,212);font-size:13px;line-height:2em;min-width:24px;vertical-align:top;"><strong>public void destroy()</strong><br>Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。</td> </tr> </tbody> </table> FigureConfig的使用 Filter的init方法中提供了一个FilterConfig对象 比如配置文件applicaiton.properties中配置字段schools schools =dmxy,zjdx 代码中: @Override public void init(FilterConfig filterConfig) throws ServletException { schools = filterConfig.getInitParameter("schools"); } 使用demo: public class DomainFilter implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse res, FilterChain chain) throws IOException, ServletException { List<String> allowedOrigins= new ArrayList<>(); allowedOrigins.add("http://192.168.0.104:8080"); String originHeader=((HttpServletRequest) request).getHeader("Origin"); if (allowedOrigins.contains(originHeader)){ ((HttpServletResponse) res).setHeader("Access-Control-Allow-Origin", originHeader); ((HttpServletResponse) res).setContentType("application/json;charset=UTF-8"); ((HttpServletResponse) res).setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); ((HttpServletResponse) res).setHeader("Access-Control-Max-Age", "3600"); ((HttpServletResponse) res).setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token,sign");//表明服务器支持的所有头信息字段 ((HttpServletResponse) res).setHeader("Access-Control-Allow-Credentials", "true"); //如果要把Cookie发到服务器,需要指定Access-Control-Allow-Credentials字段为true; ((HttpServletResponse) res).setHeader("XDomainRequestAllowed","1"); } chain.doFilter(request, res); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } } 上面是一个判断request的header是否为允许访问的header。 并为response添加header的过滤器 # Servlet的生命周期 # Servlet的生命周期可被定义为,从创建到毁灭的整个过程。 初始化:通过init()方法进行初始化 处理请求:通过service()方法处理客户端的请求 销毁:铜过destory()方法结束 最后,Servlet是由JVM的垃圾回收器进行垃圾回收 生命周期中的重要方法 init() init方法只能调用一次,在第一次创建servlet时调用,在后续的每次请求中不再调用。因此,它是一次性初始化。 servlet创建于用户第一次调用对应于该servlet的URL时,也可以指定servlet在服务器第一次启动时被加载。 当用户调用一个servlet时,就会创建一个servlet实例。 init()简单的创建或加载一些数据,这些数据将被用户整个servlet的生命周期。 service() service()方法是执行实际任务的主要方法,servlet容器(web服务器)调用service()方法,来处理来自客户端的请求,并把格式化的响应返回给客户端。 服务器每次收到一个servlet请求,服务器会产生一个新的线程并调用服务。service()方法检测http请求的类型(post,get,put,delete等),并在适当的时候调用doPost,doGet,doPut,doDelete等方法。 service()方法由容器调用,service方法在适当的时候调用doPost,doGet,doPut,doDelete等方法。所以不用对service方法做任何动作,只需要重写doPost,doGet,doPut,doDelete即可。(类似java设计模式中的模板模式) destory() destory方法只会被调用一次。在servlet生命周期结束的时候被调用。在destory()方法之后,servlet对象被标记为垃圾回收。 # Servlet与tomcat # tomcat就是servlet容器 # Servlet源码分析 # servlet可以使用javax.servlet和javax.servlet.http包创建 servlet中的关键类httpservletRequest,httpServletResponse,servletRequest,servletResponse,servlet javax.servlet包 Servlet接口 全部的servlet都需要实现这个接口 public interface Servlet { public void init(ServletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; public String getServletInfo(); public void destroy(); } 接口里面总共有5个核心方法 init()表示初始化,被servlet容器调用,用来表明一个servlet servlet在接收请求 # Springmvc+tomcat中的Servlet使用 # 。。。 # Springboot中内置tomcat的Servlet使用 # 。。。 # 总结 # 。。。 # 参考 # [Java Web(一) Servlet详解!!][Java Web_ Servlet] [Java Web_ Servlet]: https://www.cnblogs.com/whgk/p/6399262.html 本文地址: JAVA Servlet详解 相关文章 我的第一台服务器day1 网络服务之DNS 大型医疗保健提供商的CISO是如何通过云计算转型增强网络安全的 ESC体验 网络服务之DHCP ENS服务现已支持大多数传统域名,会给域名行业带来哪些影响? openstack组件之Keystone 度假,音乐节和聚会服装品牌Unedited.xyz VMware网络模式分析 接龙小程序布局教程 发现白金词域名价值 docker 安装 标题 浅谈低代码/无代码领域新发展 Linux体验感 PHP安装 在apipost如何自定义变量 接触服务器的过程 Linux-vim 部署Nginx服务