一、前戏

image.png
用户直接访问控制层,控制层就可以直接操作数据库;

  1. servlet--CRUD(增删改查)--->数据库
  2. 弊端:程序十分臃肿,不利于维护
  3. servlet的代码中:处理请求、响应、试图跳转、处理JDBC、处理业务代码、处理逻辑代码
  4. 架构:没有什么是加一层解决不了的!
  5. 程序员调用
  6. |
  7. JDBC
  8. |
  9. Mysql Oracle SqlServer...

image.png

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD (Dao)

View

  • 展示数据
  • 提供链接发起的Servlet请求 (a , form, img…)

Controller (Servlet)

  • 接收用户的请求:(req: 请求参数、Session信息…)
  • 交给业务层处理对应的代码
  • 控制视图的跳转
  1. 登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)--->交给业务层处理登录业务(判断用户名密码是否正确:事务)--->Dao层查询用户名和密码是否正确--->数据库

二、Filter

Filter:过滤器,用来过滤网站的数据;

  • 处理中文乱码
  • 登录验证….

image.png
CharacterEncodingFilter.java

  1. // 初始化
  2. public void init(FilterConfig filterConfig) throws ServletException {
  3. System.out.println("CharacterEncodingFilter成功激活!");
  4. }
  5. // filterChain:链
  6. /*
  7. * 1.过滤中的所有代码,在过滤特定请求的时候都会执行
  8. * 2.必须要让过滤器继续通行*/
  9. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  10. servletRequest.setCharacterEncoding("utf-8");
  11. servletResponse.setCharacterEncoding("utf-8");
  12. servletResponse.setContentType("text/html;charset=utf-8");
  13. System.out.println("CharacterEncodingFilter执行前...");
  14. filterChain.doFilter(servletRequest,servletResponse); // 让我们的请求继续走,如果不写,程序到这里就被拦截停止了
  15. System.out.println("CharacterEncodingFilter执行后...");
  16. }
  17. // 销毁:web服务器关闭的时候,过滤会销毁
  18. public void destroy() {
  19. System.out.println("CharacterEncodingFilter销毁");
  20. }

在web.xml中配置Filter

  1. <filter>
  2. <filter-name>CharacterEncodingFilter</filter-name>
  3. <filter-class>com.shuai.filter.CharacterEncodingFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>CharacterEncodingFilter</filter-name>
  7. <!--只要是 /servlet的任何请求,会经过这个过滤器-->
  8. <url-pattern>/servlet/*</url-pattern>
  9. <!--<url-pattern>/*</url-pattern>-->
  10. </filter-mapping>

三、监听器

实现一个监听器的接口:(有N种)

  1. 编写一个监听器

    1. 实现监听器的接口....
  1. // 统计网站在线人数,统计session
  2. public class OnlineCountListener implements HttpSessionListener {
  3. // 创建session监听:看你的一举一动
  4. // 一旦创建Session就会触发一次这个事件!
  5. public void sessionCreated(HttpSessionEvent se) {
  6. ServletContext ctx = se.getSession().getServletContext();
  7. Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
  8. if (onlineCount==null){
  9. onlineCount = new Integer(1);
  10. }else {
  11. int count = onlineCount.intValue();
  12. onlineCount = new Integer(count+1);
  13. }
  14. ctx.setAttribute("OnlineCount",onlineCount);
  15. }
  16. // 销毁session监听
  17. // 一旦销毁Session就会触发一次这个事件
  18. public void sessionDestroyed(HttpSessionEvent se) {
  19. ServletContext ctx = se.getSession().getServletContext();
  20. System.out.println(se.getSession().getId());
  21. Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
  22. if (onlineCount==null){
  23. onlineCount = new Integer(0);
  24. }else {
  25. int count = onlineCount.intValue();
  26. onlineCount = new Integer(count-1);
  27. }
  28. ctx.setAttribute("OnlineCount",onlineCount);
  29. }
  30. }

index.jsp

  1. <h1>当前有 <span style="color: red"><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span> 人在线</h1>

2.销毁监听器

  1. // 手动销毁
  2. se.getSession().invalidate();
  3. // 自动注销
  4. <session-config>
  5. <session-timeout>1</session-timeout>
  6. </session-config>

监听器:GUI编程中经常使用;

  1. public class TestPanel {
  2. public static void main(String[] args) {
  3. Frame frame = new Frame("每天努力亿点点"); // 新建一个窗体
  4. Panel panel = new Panel(null); // 面板
  5. frame.setLayout(null); // 设置窗体的布局
  6. frame.setBounds(300,300,500,500);
  7. // rgb ---> 红绿蓝
  8. frame.setBackground(new Color(0,0,255)); // 设置背景颜色
  9. panel.setBounds(50,50,300,300);
  10. panel.setBackground(new Color(0,255,0));
  11. frame.add(panel);
  12. frame.setVisible(true);
  13. // 监听事件,监听关闭事件
  14. frame.addWindowListener(new WindowListener() {
  15. public void windowOpened(WindowEvent e) {
  16. System.out.println("打开");
  17. }
  18. public void windowClosing(WindowEvent e) {
  19. System.out.println("关闭ing");
  20. System.exit(0);
  21. }
  22. public void windowClosed(WindowEvent e) {
  23. System.out.println("关闭ed");
  24. }
  25. public void windowIconified(WindowEvent e) {
  26. }
  27. public void windowDeiconified(WindowEvent e) {
  28. }
  29. public void windowActivated(WindowEvent e) {
  30. System.out.println("激活");
  31. }
  32. public void windowDeactivated(WindowEvent e) {
  33. System.out.println("未激活");
  34. }
  35. });
  36. }
  37. }