MVC三层架构
Model:
1.DAO数据持久层(通过JDBC进行的数据库的CRUD)。
2.业务逻辑(Service)。
View:
1.用户看到的视图。
2.提供链接发起Servlet请求。
Controller
1.接受用户的请求(Request和Response等)
2.交给业务层响应的代码
3.控制视图的跳转
本身不会直接与数据库进行操作。
过滤器Filter
FIlter:用来过滤网站的数据。
-
处理中文乱码,每次我都要set“utf-8”。
-
儒雅随和变成***。
-
处理乱码问题。
如何实现一个过滤器?
1.在idea Maven项目中导入依赖
2.实现监听器接口(必须实现的是javax.servlet下的Filter),重写三个方法
3.web.xml中注册监听器。
package com.kyz.filter;
import javax.servlet.*;
import java.io.IOException;
public class characterEncodingFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("characterEncodingFilter初始化了");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("characterEncodingFilter 执行前...");
chain.doFilter(request,response);//让我们的请求继续走,如果不写到这里会被拦截停止
System.out.println("characterEncodingFilter 执行后...");
}
//destory
@Override
public void destroy() {
System.out.println("characterEncodingFilter销毁了 ");
}
}
这个简单的FilterDemo可以实现处理jsp或者是html中的网页乱码问题,将所有的resp.setCharacterEncoding("utf-8");等req resp的设置全部设置在Filter中。
chain.doFilter(request,response);//让我们的请求继续走,如果不写到这里会被拦截停止
1.chain是链,过滤器中的所有代码在执行特定请求的时候都会执行,2.必须要让过滤器继续通行3.所有代码Filter都会过滤,web服务器关闭的时候过滤器会销毁。
监听器Listener
后面应该可以实现一个这样简单的监听器。
实现一个监听器
1. 编写一个监听器 & 实现监听器的接口 HttpSessionLisenter
2.web.xml中注册监听器 <listener>
package com.kyz.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineCountlistener implements HttpSessionListener {
//监听session的举动,一旦创建一个session,就会触发一次事件,
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlinecount= (Integer)ctx.getAttribute("onlinecount");
if(onlinecount==null)
{
onlinecount = new Integer(1);
}else
{
int count = onlinecount.intValue();
onlinecount = new Integer(count+1);
}
//直接键值对赋值
ctx.setAttribute("onlinecount",onlinecount);
}
//一旦session销毁就会触发destory方法
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlinecount= (Integer)ctx.getAttribute("onlinecount");
if(onlinecount==null)
{
onlinecount = new Integer(0);
}else
{
int count = onlinecount.intValue();
onlinecount = new Integer(count-1);
}
//直接键值对赋值
ctx.setAttribute("onlinecount",onlinecount);
}
//session销毁的情况
// 1.手动销毁 se.getSession().invalidate();
// 2.自动销毁
// <session-config>
// <session-timeout>15</session-timeout>
// </session-config>
}
chrome中访问该页面以后再使用edge访问该页面,充分体现了每一个不同的Browser都是一个不同的session
这里关闭浏览器没有自动销毁session应该是与浏览器的Cookie关,我们直接手动销毁
HttpSession httpsession = req.getsession();
httpsession.invalidata();
1.session销毁的两种情况,在web.xml中配置session-timeout
2.直接手动在servlet中加入业务逻辑调用session.invalidate销毁本次会话。