MVC三层架构
什么是MVC:Model View Controller 模型、视图、控制器
10.1早些年
控制器Controller Servlet:
- 接收用户的请求
- 响应给客户端内容
- 重定向或者转发
视图层View JSP:
- 展示数据
- 提供可以供我们操作的请求
Servlet和JSP都可以写JAVA代码;为了易于维护和使用;Servlet专注于请求处理,以及控制视图跳转;JSP专注于显示数据。
用户直接访问控制层,控制层可以直接操作数据库。
servlet--CRUD-->数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求,响应,视图跳转,处理JDBC,处理业务代码,处理逻辑代码
架构:没有什么是加一层解决不了的!
程序员调用
|
JDBC
|
Mysql Oracle SqlServlet
10.2MVC三层架构
控制器Controller Servlet:
- 接收用户的请求
- 交给业务层去做
- 视图跳转
视图层View JSP:
- 展示数据
- 提供用户操作
控制器向视图层转发或者重定向;
视图层向控制器操作。
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View
- 展示数据
- 提供链接发起Servlet请求(a,form,img...)
Controller(Servlet)
-
接收用户请求:(req:请求参数,Session信息...)
-
交给业务层处理对应的代码
-
控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数:username,password)-->交给业务层处理登录业务(判断用户名密码是否正确,事务)--->Dao层查询用户名和密码是否正确-->数据库
Filter
Filter:过滤器,用来过滤网站的数据。
- 处理中文乱码
- 登录验证
Filter开发步骤
- 导包不要错,一定要导到import java.servlet.Filter;包
- 编写过滤器
-
过滤中的所有代码,在过滤器特定的请求的时候都会执行
-
必须要让过滤器继续同行
-
实现Filter接口,重写对应的方法即可
-
在web.xml中配置Filter
监听器
实现一个监听器的接口;(有N种)
-
编写一个监听器
实现监听器的接口
package listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListene; //统计网站在线人数,统计session public class OnlineCountListener implements HttpSessionListener{ //创建session监听:看你的一举一动 //一旦创建Session就会触发这个事件 public void sessionCreated(HttpSessionEvent se){ ServletContext ctx=se.getSession().serServletContext(); 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监听 //一旦销毁session就会触发一次这个事件 public void sessionDestroyed(HttpSessionEvent se){ ServletContext ctx=se.getSession().serServletContext(); 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销毁的两种情况 * 1. 手动销毁 * 2. 自动销毁 * */ }
-
web.xml中注册监听器
<listener> <listener-class>com.OnlineCountListener</listener-class> </listener>
-
看情况是否使用。
过滤器、监听器的常见应用
监听器:GUI编程中经常使用
package listener;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestPanel {
public static void main(String[] args) {
Frame frame=new Frame("快乐");//新建一个窗体
Panel panel=new Panel(null);//面板
frame.setLayout(null);//设置窗体布局
frame.setBounds(300,300,500,500);
frame.setBackground(new Color(0,0,255));//设置背景颜色
panel.setBounds(50,50,300,300);
frame.setBackground(new Color(0,255,0));
frame.add(panel);
frame.setVisible(true);
//监听事件,监听关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
System.out.println("打开");
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("关闭ing");
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println("打开ed");
}
@Override
public void windowIconified(WindowEvent e) {
super.windowIconified(e);
}
@Override
public void windowDeiconified(WindowEvent e) {
super.windowDeiconified(e);
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("激活");;
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("未激活");
}
@Override
public void windowStateChanged(WindowEvent e) {
super.windowStateChanged(e);
}
@Override
public void windowGainedFocus(WindowEvent e) {
super.windowGainedFocus(e);
}
@Override
public void windowLostFocus(WindowEvent e) {
super.windowLostFocus(e);
}
});
}
}
用户登录之后才能进入主页,注销之后就不能进入主页了。
-
用户登录之后,向session中放入用户的数据。
-
进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现。
HttpServletRequest request=(HttpServletRequest) req; HttpServletResponse response=(HttpServletResponse) resp; if(request.getSession().getAttribute(Constant.USER_SESSION)==null){ response.sendRedirect("/reeor.jsp"); } chain.doFilter(request,response);