简述工作
- 在项目前期,我撰写了部分博客,作为组长分配任务
- 设计项目整体框架结构,完成vue全局过滤器的声明和相关设置
- 撰写了普通用户(非管理员)增删改查部分的代码,对jsp和html等前端代码进行修改和完善
- 对数据库部分相关代码进行补充
- 进行系统测试
任务摘录
全局过滤器
我们的公文传输系统是前后端分离的项目,后台返回的数据需要经过处理才能显示到页面上。使用最多的场景就是日期/时间、数字、字符串的格式化处理。
在本项目中,我完成了vue封装全局filter、统一处理数据部分。包括配置Filter过滤器SetCharacterEncodingFilter处理JSP中文乱码和文件传送过滤器 RequestDumperFilter(这个过滤意义不是很大)。
基本性质
1) Filter(过滤器)的基本功能是对Servlet容器调用Servlet(JSP)的过程进行拦截,从而在Servlet处理请求前和Servlet响应请求后实现一些特殊的功能。
2) 在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序: Filter,FilterChain, FilterConfig。
3) Filter 程序是一个实现了Filter接口的 Java 类,与Servlet 程序相似,它由 Servlet容器进行调用和执行。
4) Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件。
其工作原理如下图所示:
这个 Servlet 过滤器就是我们的 filter
-
当在 web.xml 中注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,这个Filter 就成了 Tomcat 与该 Servlet 程序的通信线路上的一道关卡,该 Filter 可以对Servlet 容器发送给 Servlet 程序的请求和 Servlet 程序回送给 Servlet 容器的响应进行拦截,可以决定是否将请求继续传递给 Servlet 程序,以及对请求和相应信息是否进行修改。
-
在一个 web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以对一个或一组 Servlet 程序进行拦截。
-
若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。
具体实现
按照我们的程序来具体说明
1.定义/封装过滤器
在 src目录 下新建 filters目录 用来专门存放全局过滤器,我们的公文传输项目设置了两个过滤器。分别是文件传送过滤器 RequestDumperFilter和字符编码设置及转换过滤器SetCharacterEncodingFilter。
(下图为文件传送过滤器)
2.创建 filter 实现类
(1)继承Filter方法实现类
具体代码解析如下:
public class SetCharacterEncodingFilter implements Filter {
protected FilterConfig filterConfig = null; //初始化配置
protected String encoding = null; //接收字符编码
protected boolean ignore = true; //是否忽略大小写
/* 析构函数
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
(2)doFilter方法
在 doFilter执行之前,由容器将 filterChain 对象传入方法。调用此对象的.doFilter()方法可以将请求放行,实际上是执行过滤器链中的下一个 doFilter 方法,但是如果只有一个过滤器,则为放行。
具体代码如下:
/* 执行过滤操作
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request); //如果为空先从web.xml中得到
if (encoding != null){
request.setCharacterEncoding(encoding); //设置字符集编码
}
}
chain.doFilter(request, response);
}
(3)FilterConfig
FilterConfig 类似 ServletConfig,是 filter 的配置信息对象。
具体代码如下:
this.filterConfig = filterConfig;//初始化配置
this.encoding = filterConfig.getInitParameter("encoding"); //从web.xml文件中读取encoding的值
String value = filterConfig.getInitParameter("ignore");//从web.xml文件中读取ignore的值
//以下三种情况均为忽略大小写
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
(4)销毁方法
3.编写 web.xml 配置文件。
(1)多filter优先级
我们的项目使用了两个过滤器,在多Filter 执行环境下,如果同一个资源有多个 filter 都对其拦截,则拦截的顺序是按照 web.xml 中配置的顺序进行的。示意图如下:
可以看到我们这里只进行了SetCharacterEncodingFilter
过滤器的配置。
(2)Filter的 url-pattern
url-pattern是配置 filter 过滤哪些请求的。主要有以下几种配置:
web.xml中配置的/都是以当前项目路径为根路径的。
1)精确匹配:
/index.jsp/user/login 会在请求/index.jsp、/user/login 的时候执行过滤方法。
2)路径匹配:
/user/* /* 凡是路径为/user/下的所有请求都会被拦截,/*表示拦截系统的所有请求,包括静态资源文件。
3)扩展匹配:
*.jsp .action 凡是后缀名为.jsp .action 的请求都会被拦截。
注意:/login/.jsp 这种写法是错误的,只能是上述三种的任意一种形式。不能组合新形式。
*jsp 也是错误的,扩展匹配必须是后缀名。
4)多重 url-pattern 配置
上面的三种形式比较有局限性,但是 url-pattern 可以配置多个,这样这三种组合基本就能解决所有问题了。
我们此项目因为架构算法较为简单,所以并没有配置url-pattern。
你们小组总共的代码行数,你贡献的代码行数?相关代码链接?
代码总行数:7935行
我贡献的代码行数:1511行
代码链接:DKY666VIP组
你们小组总共的文档数?你贡献的文档数?相关链接?
小组目前总文档数:5篇
链接如下:
团队介绍
需求分析
确定分工
描述设计
贡献排序
我贡献了文档数:3篇 (团队介绍、需求分析和贡献排序)