简介:梳理一下基础知识点的入门案例,具体的详解可以看相应链接中的文章。
目录
- web项目基本结构
- Servlet入门案例
- 过滤器
- 监听器
1.web项目基本结构
web项目新建后,有一个src目录,是专门用来存Java文件的。
此外还要一个web目录(或webapp或WebContent),里面有一个MATA-INF
文件夹,该文件夹用来存放一些项目相关的元数据(用来描述数据的数据)。除此之外,还有一个WEB-INF
文件夹,这个是web项目特有的,该文件夹客户端是无法访问的。所以我们的页面文件一定不能放在这里,否则还需要额外的web.xml配置才能访问。一般会放一些jar包和web.xml。
在下面的项目中,还创建了一个pages文件夹,专门来放其它的页面。
2.Servlet入门案例
Servlet就是实现了Servlet接口的Java类,由于页面的拼接比较繁琐,我们这里的demo就把处理的数据数据输出到控制台上。index页面中的代码为一个简单的表单:
<form action="showname" method="post">
<input type="text" name="userName" value="Tom">
<input type="submit" value="showName">
</form>
可以看到,我们这个表单,所要请求的,就是一个URL,而这个地址对应的资源,就是一个Servlet(写映射的路径名就行,不用打斜杠
)。当我们点击提交时,请求的地址即为项目路径下的/showname。可我们的Java程序,又不是在这个路径下的,所以还得让该地址和对应的Java程序,形成一个映射关系,让服务器知道,如果访问这个路径,那么就调用哪个Servlet程序。该映射是写在web.xml文件中的。
首先我们需要一个servlet
标签和一个servlet-mapping
标签
<servlet>
<servlet-name>sayhi</servlet-name>
<servlet-class >com.sayhello.ShowName</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sayhi</servlet-name>
<url-pattern>/showname</url-pattern>
</servlet-mapping>
servlet
标签里面写上我们Servlet程序的所在位置(从类路径开始写就可以了,注意包之间用点隔开),随后再取一个有意义的名字。
servlet-mapping
中,要填写一个URL路径,这个路径就是我们action中填的路径,只不过要打上斜杠,访问这个路径后,就去学寻找该标签中另一个子标签servlet-name
里的那个Servlet,所以如果我们想要映射能够对应上,名字一定要写对了(想把请求交给哪个Servlet,就写哪个Servlet的名字,而Servlet的名字,可以通过servlet
标签中的servlet-name
进行配置)。
Servlet代码如下:
public class ShowName 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(req.getParameter("userName"));
}
}
ShowName类继承了HttpServlet ,并重写了doGet和doPost方法,用来处理相应的请求方式。
上面的方式是最快捷的写法,下面则是来更加系统得理一下Servlet接口的相关知识。
还未更新。。。
3.过滤器实例
过滤器也只是一个普通的Java类,实现了Filter接口,该接口只有3个方法,并且是由系统自动创建对象和调用的:
这三个方法就是他的生命周期方法。
init
方法在创建对象时就会执行且执行一次,而该对象在服务启动时(不需要有请求),就会被创建。doFilter
方法在过滤时被调用。destroy
方法在服务器关闭时调用且执行一次。
过滤器的主要功能是,当客服端发起请求后,该程序可以对该请求进行数据处理,并把处理后的数据提交给服务器,甚至可以驳回客户端的请求。当然,对于服务器返回给客户端的响应数据,过滤器也可以进行数据处理,然后把处理后的数据,交给客户端。
下图为一个过滤器实例:
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("开始过滤");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if ("Tom".equals(servletRequest.getParameter("userName"))) {
System.out.println("是Tom");
} else {
System.out.println("不是Tom");
}
filterChain.doFilter(servletRequest,servletResponse);//放行请求或执行下一个过滤器
//对响应数据进行相应的处理了
System.out.println(servletResponse.getCharacterEncoding());
}
@Override
public void destroy() {
System.out.println("销毁过滤");
}
}
和Servlet一样,过滤器的使用也需要配置到web.xml中:
<filter>
<filter-name>f01</filter-name>
<filter-class>com.sayhello.Filter01</filter-class>
</filter>
<filter-mapping>
<filter-name>f01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
整体的结构和xml是相似的,只不过url-pattern
中,填入的是想要拦截的请求,使用上图方式,代表拦截所有的请求。
过滤器链
过滤器是可以有多个的,当一个请求申请访问时,可以被多个过滤器拦截,只要有任意一个拦截了请求,那么请求就不能达到服务器。多个过滤器的执行顺序则取决于在web.xml文件中配置的先后顺序。
过滤的四种拦截方式
<filter-mapping>
<filter-name>f01</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
这里的dispatcher标签,写一个,就表示会拦截此类的访问方式,如果什么都不写,就默认为一个dispatcher>REQUEST</dispatcher>
,但一旦显示指明,那么写了哪些,就有哪些。
4.监听器实例
监听器也是一个普通的Java类,不过根据监听对象的不同,也会实现不同的接口。当前,监听器可以对request对象,session对象和application对象进行监听。
监听器也需要配置到web.xml文件中,不过由于是针对对象进行操作和url-pattern无关,所以无需配置mapping,只需:
<listener>
<listener-class>com.sayhello.Listener01</listener-class>
</listener>
对于3大域的对象,都有着对应的两类接口——"生命周期监听
“和”属性监听
"。顾名思义,一个是在用来监听对象的创建与销毁,一个是用来监听对象中属性的修改(增删改)。
基本的格式如下:
生命周期监听接口通用格式:对象的数据类型Listener
,如:
- request对象:
ServletRequestListener
- session对象:
HttpSessionListener
- applocation对象:
ServletContextListener
属性监听接口通用格式:对象的数据类型AttributeListener
,如:
- request对象:
ServletRequestAttributeListener
- session对象:
HttpSessionAttributeListener
- applocation对象:
ServletContextAttributeListener
下面以request对象为例,来演示一下实际的代码
使用的前端页面如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index</title>
</head>
<body>
<form action="showname" method="post">
<input type="text" name="userName" value="Tom">
<input type="submit" value="showName">
</form>
</body>
</html>
生命周期监听器
request对象生命周期的监听:
public class ReqListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("开始");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("销毁");
}
}
3大域的生命周期接口,都只有两个方法:
监听的对象被创建时调用:requestInitialized(相应的事件)
监听的对象被销毁时调用:requestDestroyed(相应的事件)
当然,其它两个对象的写法有些区别:
从图中可以看出,这些方法都带着一个参数,这个参数就代表了事件对象(即触发了该时间的对象)。比如监听器1号对所有的request对象进行监听,当request1号被创建的时候,就会调用监听器1号的requestInitializedServletRequestEvent sre
方法,而该方法的传参,则正是基于request1号而转化的event对象
。
所以可以说,事件源是数据类型,事件对象则是具体的实例
对于不同的事件源(域类型),他们触发的时机如下:
事件源 | 创建时机 | 销毁时机 | 补充 |
---|---|---|---|
ServletRequest | 请求发出时创建(不能是请求静态资源) | 一次访问结束(产生响应)时销毁 | |
HttpSession | 首次访问服务器,且调用了request.getSession()方法时创建(jsp会自带创建session的代码)。 | session超时,调用invalidate()方法等 | 具体生命周期可参考HttpSession生命周期 |
ServletContext | 服务器启动时创建 | 服务器关闭时销毁 | 一个项目只有一个ServletContext对象,即application |
属性监听器
属性监听器和生命周期类似,每种事件源都分别实现各自的接口,而各接口中,也都只有三个方法:属性创建
,删除
,替换
。
下面写一个application属性监听器的实例:
jsp代码如下:
<%
application.setAttribute("k1","v1");
application.setAttribute("k1","v11");
application.removeAttribute("k1");
%>
监听器代码如下:
public class ScaListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("添加了" + scae.getName() + "--" + scae.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("删除了" + scae.getName() + "--" + scae.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("修改前" + scae.getName() + "--" + scae.getValue());
System.out.println("修改后" + scae.getName() + "--" +
scae.getServletContext().getAttribute(scae.getName()));
}
}
控制台输出的结果:
我们平常说的监听器,一共有八种,除了上述的6种,还有2种属于感知监听,都与session相关,且不需要注册到web.xml中,具体的写在了这篇文章中:对象感知监听器