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过滤器
基本概念
- 过滤器就是外Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet。
- Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。
- 在 Servlet API 中定义了三个接口类供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig。
- Filter是单例的
- FilterConfig:Filter的配置对象
1)可以获得该Filter的参数
2)也可以获得整个应用程序的ServletContext - 过滤顺序(对同一个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 {
}
}