Hello 大家好!
今天我们的主要内容是聊一聊JavaWeb的三大组件
(Servlet,Filter,Listener)
在聊JavaWeb三大组件之前,我们先来看一些关于Web的概念性的东西!看看大家是否能把这些概念理解清楚。
首先,我们来看第一个问题:什么是Web开发,什么是JavaWeb?
第二个问题:什么是网页?
网页是web应用程序最重要的元素
当我们在浏览器输入网址后,经过一段复杂而又快速的程序,网页文件会被传送到你的计算机,然后再通过浏览器解释网页的内容,再展示到你的眼前
第三个问题:Web为什么和Java是有关系的?
第四个问题:JavaEE是什么?
第五个问题:JavaSE是什么?
最后一个问题:Java程序设计语言和Java平台是什么意思?
大家觉得怎么样?是不是有点头大!别紧张,上面相关概念其实都是为了帮助大家能更好的理解Java和Web之间的一些关系,没有记住没关系,我们接着往下看:
Web资源我们一般分为两类
那么,经过上面的铺垫,接下来,JavaWeb中我们如何用Java语言去进行动态Web资源开发,那么就不得不提今天的三大主角了(Servlet,Filter,listener)
在Java web b/s(浏览器/服务器)架构中,servlet扮演了重要的角色,作为一个中转处理的容器,他连接了客户端和服务器端的信息交互和处理。
那么,Servlet既然是浏览器和服务器的中间层,它主要的任务到底是做什么的?
Servlet 执行以下主要任务:
总结:不难发现,Servlet主要有两个任务(读取和发送),一个是读取浏览器发送的数据,一个是根据相对应的需求处理后去返回一个结果给到浏览器。
那么我们来简单看看这个Servlet的流程
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletRequest.setCharacterEncoding("utf-8");
//得到前端请求数据
String first_name = servletRequest.getParameter("first_name");
//处理前端请求数据
first_name="你好,"+first_name;
System.out.println(first_name);
//返回处理数据给前端
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write(first_name);
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("结束");
}
}
这里注意对请求地址进行配置,在web.xml中
ServletDemo
ServletDemo
ServletDemo
/servletDemo
这就简单基础的实现了Servlet的基本任务!
通过上面的小案例,我们发现实现Servlet的类中,有很多的方法,简单介绍一下这些方法
(1)init方法
初始化方法,在Servlet被创建时(第一次访问到这个Servlet时)执行,只会执行一次
(2)service方法
每次Servlet被访问时执行
(3)destroy方法
在Servlet被杀死时会执行,在服务器正常关闭时,执行,只会执行一次
(4)getServletConfig方法(了解)
获取Servlet的配置对象
(5)getServletInfo方法(了解)
获取Servlet的一些信息,如版本,作者等等
那么,Servlet的生命周期其实是和这些方法有关的,如下:
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
那么,我们就举一个简单的列子来看看过滤器的作用
比如说“过滤敏感词汇”
需求:当前端发送的请求参数为“渔夫”,“很丑”,“愚蠢”时,将其过滤为“***”后放行,再给Servlet进行操作
public class SensitiveWordsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.创建代理对象,增强getParameter方法
ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强getParameter方法
//判断是否是getParameter方法
if(method.getName().equals("getParameter")){
//增强返回值
//获取返回值
String value = (String) method.invoke(req,args);
if(value != null){
//将请求中的参数和list集合里面的数据进行比较,敏感的词语替换为“***”,
//不敏感的则无需修改
for (String str : list) {
if(value.contains(str)){
value = value.replaceAll(str,"***");
}
}
}
return value;
}
return method.invoke(req,args);
}
});
//2.过滤完成,放行
chain.doFilter(proxy_req, resp);
}
private List list = new ArrayList();//敏感词汇集合
@Override
public void init(FilterConfig config) throws ServletException {
list.add("渔夫");
list.add("好丑");
list.add("愚蠢");
}
@Override
public void destroy() {
}
}
SensitiveWordsFilter
filter.SensitiveWordsFilter
SensitiveWordsFilter
/*
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletRequest.setCharacterEncoding("utf-8");
//得到前端请求数据
String first_name = servletRequest.getParameter("first_name");
//处理前端请求数据
first_name="你好,"+first_name;
System.out.println(first_name);
//返回处理数据给前端
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write(first_name);
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("结束");
}
}
于是,我们对所有请求参数的词语就进行了过滤操作。其执行流程是:请求首先到达过滤器的doFilter方法,然后对request增强,然后调用filterChain放行,最后servlet进行处理。
自定义的监听器其实用得不多,所以这里我们就只简单自定义一个对ServletContext域对象的监听器吧!
需求:当ServletContext这个对象创建时,我们打印“ServletContext已创建”,当ServletContext这个对象销毁时,我们打印“ServletContext已不在”
public class ContextLoaderListener implements ServletContextListener {
/**
* 监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建。
*
* 在服务器启动后自动调用
* @param servletContextEvent
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext已创建");
System.out.println("当ServletContext对象创建后,进行了这些。。。操作");
}
/**
* 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用
* @param servletContextEvent
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext已不在");
}
}
listener.ContextLoaderListener
当ServletContext这个对象创建时,就会去执行自定义监听器里面方法contextInitialized的代码,进行一些我们想要的操作。
当ServletContext这个对象销毁时,也会去执行自定义监听器里面方法contextInitialized的代码。
值得大家注意的是我们创建一个监听器的步骤,其他监听器都是按照这个步骤进行的。
好了,以上就是我们JavaWeb三大组件的基本概念和流程了,谢谢各位小伙伴的观看!
最后,给大家留一个思考题:Servlet和Filter这两者有什么区别?
欢迎大家在下面留言讨论!