JAVA Servlet详解
什么是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类。这个接口主要定义了一下三个方法
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。 |
2 | public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 | public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
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详解!!
还没有评论,来说两句吧...