MVC设计模式及过滤器

MVC设计模式

Model

表示业务、数据和业务逻辑。一个模型可以未多个视图提供服务。

View

视图是用户交互的界面,展示数据、接受用户的输入,不进行实际的业务处理

Controller

接受用户请求并决定使用哪个模型去处理业务

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!-- 使用fmt 标签库 格式化日期 value:日期变量,pattern:规则 -->
	<fmt:formatDate value="${myDate }" pattern="yyyy-MM-dd HH:mm:ss"/><br>
	<c:set var="balance" value="3.155"></c:set>
	<!-- fmt:formatNumber标签 
	pattern 0.00保留两位小数,五舍六入 不足两位时会补位
			#.##保留两位小数,五舍六入 不足两位时不会补位-->
	<fmt:formatNumber value="${balance }" pattern="0.00"></fmt:formatNumber><br>
	<fmt:formatNumber value="${balance }" pattern="#.##"></fmt:formatNumber><br>
log4j
作用:可以控制日志信息输出到控制台或保存文件
等级:ERROR ----> WARN —> INFO —> DEBUG

1.Error:打印错误和异常信息
2.Debug:对调试应用程序比较有帮助,打印调试信息
3.Info:打印一些重要信息
4.Warn:打印 潜在错误的信息,不会影响项目执行

stdout是输出到控制台
logfile日志文件

%p:优先级 %d:执行时间 %f:类名 %M:方法 %n:换行符

# ERROR ----> WARN ---> INFO --->  DEBUG 
log4j.rootLogger=DEBUG,stdout,logfile

# stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.logger.org.apache=DEBUG

# logfile
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=login.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%p %d %F %M  %m%n
log4j.logger.org.apache=DEBUG

Filter过滤器

基本概念
  1. 过滤器就是外Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet。
  2. Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。
  3. 在 Servlet API 中定义了三个接口类供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig。
  4. Filter是单例的
  5. FilterConfig:Filter的配置对象
    1)可以获得该Filter的参数
    2)也可以获得整个应用程序的ServletContext
  6. 过滤顺序(对同一个Servlet进行过滤)
    1) 采用配置文件进行过滤设置:按照编写的顺序进行过滤
    2) 如过是采用注解的方式进行过滤设置:按照Filter名称的字典序进行过滤
实现顺序(oneServlet)
// 第三步:执行Servlet
System.out.println("开始执行OneServlet"+request);
response.setContentType("text/html;chaset=utf-8");
response.getWriter().write("oneServlet");
System.out.println("执行完毕OneServlet");

顺序先打印开始执行,再打印执行完毕,最后响应oneServlet.

过滤器的生命周期

创建过滤器需要实现Filter接口。
1.实例化:当Web容器启动的时候,加载web.xml文件创建实例
2.初始化:执行一次初始化方法,
3.过滤:每次客户端请求都会执行该方法
4.销毁:当Web容器停止的时候或者tomcat服务器卸载应用的时候执行。

public class OneFilter implements Filter {
    public OneFilter() {
    	System.out.println("constructor...");
    }
    // 过滤器的初始化方法
    public void init(FilterConfig fConfig) throws ServletException {
    	System.out.println("init...");
String encoding = fConfig.getInitParameter("encoding");
    	System.out.println("filter的编码格式:"+encoding);
    	ServletContext servletContext = fConfig.getServletContext();
    	System.out.println("整个应用程序的变量:"+servletContext.getInitParameter("company"));

    }
    // 每次请求都会访问的方法
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 1.第一步
		System.out.println("doFilter..."+request);
		// 第二步:放行
		chain.doFilter(request, response);
		// 第四步:响应回客户端
		System.out.println("Filter结束");	
	}
	// 销毁的方法
	public void destroy() {
		System.out.println("destroy...");
	}
}
配置Filter
<!-- 配置整个应用程序的参数 -->
<context-param>
  	<param-name>company</param-name>
  	<param-value>hpe</param-value>
</context-param>
<!-- 配置Filter -->
  <filter>
  	<filter-name>oneFilter</filter-name>
  	<filter-class>com.hpe.filter.OneFilter</filter-class>
<!-- 配置初始化参数 -->
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
    </init-param> 
 </filter>
  <!-- 配置过滤器的拦截资源 -->
  <filter-mapping>
  	<filter-name>oneFilter</filter-name>
  	<url-pattern>/one</url-pattern>
  </filter-mapping>
<!-- 一个Filter可以拦截多个资源 -->
  <filter-mapping>
  	<filter-name>oneFilter</filter-name>
  	<url-pattern>/two</url-pattern>
  </filter-mapping>
过滤器链

若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的web.xml 中映射的顺序一致。

设置编码的过滤器
package com.hpe.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter(
		initParams={@WebInitParam(name="enc",value="utf-8")},
		urlPatterns={"/*"}
		)
public class EncodingFilter implements Filter {

	private String enc;
    public EncodingFilter() {}

	public void destroy() {}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		// 设置编码格式
		req.setCharacterEncoding(enc);
		//res.setContentType("text/html;charset=utf-8");
		res.setCharacterEncoding(enc);
		// 放行
		chain.doFilter(req, res);
	}

	public void init(FilterConfig fConfig) throws ServletException {
		enc = fConfig.getInitParameter("enc");
	}

}
退出登录处理Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 设置编码
	request.setCharacterEncoding("utf-8");
	response.setContentType("text/html;charset=utf-8");
	// 移除session中的user属性
	request.getSession().removeAttribute("user");
	//request.getSession().invalidate();
	// 移除cookie,查找名称为autoLogin的cookie,让其失效
	Cookie[] cookies = request.getCookies();
	if(cookies!=null && cookies.length>0){
		for (Cookie cookie : cookies) {
			// 如果找到autoLogin的cookie则将其失效
			if(cookie.getName().equals("autoLogin")){
				cookie.setValue(null);
				// 使cookie失效
				cookie.setMaxAge(0);
				// 响应给客户端,让其生效
				response.addCookie(cookie);
				break;
			}
		}
	}
	// 跳转到登录界面
	response.sendRedirect(request.getContextPath()+"/index.jsp");
}
自动登录过滤器
package com.hpe.filter;

import java.io.IOException;
import java.net.URLDecoder;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hpe.po.User;

public class AutoFilter implements Filter {

    public AutoFilter() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 实现自动登录
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		// 两种情况:一个是 没有/LoginServlet,一个是session中没有User属性
		if(!"/LoginServlet".equals(req.getServletPath()) && req.getSession().getAttribute("user")==null){
			// 判断cookie中有没有数据
			Cookie[] cookies = req.getCookies();
			// 遍历数组判断是否存在AutoLogin的cookie
			if(cookies!=null && cookies.length>0){
				for (Cookie cookie : cookies) {
					if(cookie.getName().equals("autoLogin")){
						// 获取用户名密码,将数据放置到session中
						String[] val = cookie.getValue().split("#");
						String name = URLDecoder.decode(val[0], "utf-8");
						String pwd = URLDecoder.decode(val[1], "utf-8");
						User user = new User(name, pwd);
						// 将用户名密码加入到session中
						req.getSession().setAttribute("user", user);
						break;
					}
				}
			}
		}
		// 放行
		chain.doFilter(request, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值