一、JavaBean

实体类

JavaBean有特定的写法

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法

一般用来和数据库的字段做映射

ORM:对象关系映射

  • 表---->类
  • 字段---->属性
  • 行记录----->对象
id name age address
1 tom 3 US
2 jerry 5 UK
3 kitty 4 Polan
class People{private int id;private Strig name;private int age;private String address;
}
class A{new People(1,"tom",3,"US")
}

二、MVC三层架构

Model View Controller 模型 视图 控制器

2.1 原先

用户直接访问控制层,控制层可以直接操作数据库

servlet--CRUD --->数据库
弊端:十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码架构思想:没有什么是加一层解决不了的
|
JDBC
|
MySQL  Oracle    SQL server.....

Model

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

View

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

Controller

  • 接受用户的请求:request(请求参数,session信息…)
  • 交给业务层处理对应的代码
  • 控制视图的跳转
登录----接收用户的登录请求---->处理用户的请求(胡去哦去用户登录的参数,username,password) --->交给业务层处理登录业务(判断用户名密码是否正确)--->DAO层查询用户名和密码是否正确。

三、Filter

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

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

  2. 编写过滤器

    1. 导包不要倒错

      import javax.servlet.*;
      下的Filter
      
    2. 配置依赖

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>javaweb-filter</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency><dependency><groupId>org.apache.karaf.assemblies.features</groupId><artifactId>standard</artifactId><version>2.4.4</version></dependency>
      <!--    链接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency>
      </dependencies>
      </project>
      
  3. 实现Filter接口,重写方法

    package org.raylene.filter;import javax.servlet.*;
    import java.io.IOException;public class CharacterFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("filter已经初始化了");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=utf-8");System.out.println("filter执行前");filterChain.doFilter(servletRequest,servletResponse);System.out.println("filter执行后。。。。");}
    //服务器关闭的时候,过滤会销毁@Overridepublic void destroy() {System.out.println("filter已经销毁了");}
    }
  4. 配置web.xml中Filter

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">
    <servlet><servlet-name>showServlet</servlet-name><servlet-class>org.raylene.servlet.ShowServlet</servlet-class>
    </servlet><servlet-mapping><servlet-name>showServlet</servlet-name><url-pattern>/show</url-pattern></servlet-mapping><servlet-mapping><servlet-name>showServlet</servlet-name><url-pattern>/servlet/show</url-pattern></servlet-mapping><filter><filter-name>fil</filter-name><filter-class>org.raylene.filter.CharacterFilter</filter-class></filter><filter-mapping><filter-name>fil</filter-name>
    <!--        只要是/servlet下的所有请求,都会经过这个过滤器--><url-pattern>/servlet/*</url-pattern></filter-mapping>
    </web-app>
    

四、监听器

参考文献:javaweb监听器

  1. 实现监听器
package org.raylene.listener;import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public class OnlineCountListener implements HttpSessionListener {public void sessionCreated(HttpSessionEvent httpSessionEvent) {ServletContext servletContext = httpSessionEvent.getSession().getServletContext();Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount");if(onlineCount == null){onlineCount = new Integer(1);}else{int count = onlineCount.intValue();onlineCount = new Integer(count+1);}servletContext.setAttribute("OnlineCount",onlineCount);}public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {ServletContext servletContext = httpSessionEvent.getSession().getServletContext();Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount");if(onlineCount == null){onlineCount = new Integer(0);}else{int count = onlineCount.intValue();onlineCount = new Integer(count-1);}servletContext.setAttribute("OnlineCount",onlineCount);}
//    session的销毁
//    1,手动销毁  getsession().invalidate();
//    2,自动销毁}
  1. 在webxml中注册监听器
 <listener><listener-class>org.raylene.listener.OnlineCountListener</listener-class></listener>
  1. 根据情况看使用哪种或者不使用

五、过滤器、监听器的常见应用

监听器:GUI界面中减产使用

package org.raylene.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(50,50,500,500);frame.setBackground(Color.blue);panel.setBounds(100,100,200,200);panel.setBackground(Color.green);frame.add(panel);frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

用户登录后才能进入主页,用户注销后不能进入主页!

Filter实现权限拦截

  1. 配置依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>javaweb-filter</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency><dependency><groupId>org.apache.karaf.assemblies.features</groupId><artifactId>standard</artifactId><version>2.4.4</version></dependency>
<!--    链接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency>
</dependencies>
</project>
  1. 编写对应的jsp页面(登录页面、登录成功页面,登录失败页面)

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form action="/servlet/login" method="post"><input type="text" name="username"><input type="submit">
</form>
</body>
</html>

sys/success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>主页</h1>
<a href="/login.jsp">注销</a>//下面这段java,可选择加或不加,不加的话,在首次登录界面可以防止直接进入成功界面,但是当点注销时,其实并无注销操作,所以注销后可直接进入登录成功界面。加了的话,会在每次登录成功后,注销时结束该会话,使得退出登录页面后,无法直接进入登录页面
<%pageContext.getSession().removeAttribute(Constant.USER_SESSION);
%>
</body>
</html>

error/err.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>错误</h1>
<h1>权限不够</h1><a href="/login.jsp">返回登录页面</a>
</body>
</html>
  1. 编写对应的LoginServlet和LogoutServlet

静态常量

public class Constant {public final static String USER_SESSION = "USER_SESSION";
}

Login

package org.raylene.servlet;import org.raylene.util.Constant;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取前端请求的参数String username = req.getParameter("username");if(username.equals("Admin")){//登录成功req.getSession().setAttribute(Constant.USER_SESSION, req.getSession().getId());resp.sendRedirect("/sys/success.jsp");}else{resp.sendRedirect("/error/err.jsp");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

Logout

package org.raylene.servlet;import org.raylene.util.Constant;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LogoutServlett extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Object user_session = req.getSession().getAttribute(Constant.USER_SESSION);if(user_session != null){req.getSession().removeAttribute(Constant.USER_SESSION);resp.sendRedirect("/login.jsp");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
  1. 编写过滤器,防止其直接进入登录成功界面
package org.raylene.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class SysFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse resp = (HttpServletResponse) servletResponse;if(req.getSession().getAttribute("USER_SESSION")== null){resp.sendRedirect("/error/err.jsp");}filterChain.doFilter(req,resp);}@Overridepublic void destroy() {}
}
  1. 在web.xml中配置servlet和filter
   <servlet><servlet-name>login</servlet-name><servlet-class>org.raylene.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>login</servlet-name><url-pattern>/servlet/login</url-pattern></servlet-mapping><servlet><servlet-name>logout</servlet-name><servlet-class>org.raylene.servlet.LogoutServlett</servlet-class></servlet><servlet-mapping><servlet-name>logout</servlet-name><url-pattern>/servlet/logout</url-pattern></servlet-mapping><filter><filter-name>sf</filter-name><filter-class>org.raylene.filter.SysFilter</filter-class></filter><filter-mapping><filter-name>sf</filter-name><url-pattern>/sys/*</url-pattern></filter-mapping>

六、JDBC

  1. 新建数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V0Ydm642-1637285970218)(C:\Users\raylene\AppData\Roaming\Typora\typora-user-images\image-20211116200513126.png)]

  1. 添加依赖
<!--    mysql驱动-->
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency>
</dependencies>
  1. 新建java文件

jdbc固定步骤

  1. 加载驱动
    Class.forName(“com.mysql.cj.jdbc.Driver”);

  2. 链接数据库
    Connection connection = DriverManager.getConnection(url, username, pwd);

  3. 向数据库发生sql的对象statement :CRUD
    Statement statement = connection.createStatement();

  4. 编写sql
    String sql = “select * from users”;

  5. 执行sql

    ResultSet resultSet = statement.executeQuery(sql);
    int i = statement.executeUpdate(sql);
    
  6. 关闭资源

package org.raylene.test;import java.sql.*;public class TestJdbc {public static void main(String[] args) throws ClassNotFoundException, SQLException {//        配置信息String url = "jdbc:mysql://localhost:3306/jdbc?&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";String username = "root";String pwd = "yourpassword";//   1.  加载驱动Class.forName("com.mysql.cj.jdbc.Driver");
//        2.链接数据库Connection connection = DriverManager.getConnection(url, username, pwd);
//       3.向数据库发生sql的对象statement   :CRUDStatement statement = connection.createStatement();
//        4.编写sqlString sql = "select * from users";
//        5.执行sqlResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()) {System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("name"));System.out.println("pwd="+resultSet.getObject("password"));System.out.println("email="+resultSet.getObject("email"));System.out.println("birthday="+resultSet.getObject("birthday"));}
//        6.关闭资源resultSet.close();statement.close();connection.close();}
}

预编译sql

package org.raylene.test;import java.sql.*;
import java.util.Date;public class TestJdbc2 {public static void main(String[] args) throws ClassNotFoundException, SQLException {
//        配置信息String url = "jdbc:mysql://localhost:3306/jdbc?&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";String username = "root";String pwd = "GRL971215";//   1.  加载驱动Class.forName("com.mysql.cj.jdbc.Driver");
//        2.链接数据库Connection connection = DriverManager.getConnection(url, username, pwd);//        3.编写sqlString sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";//       4. 预编译   向数据库发生sql的对象statement   :CRUDPreparedStatement pst = connection.prepareStatement(sql);
//        5.执行sqlpst.setInt(1, 4);pst.setString(2, "hhh");pst.setString(3, "672");pst.setString(4, "sjva@qq.com");pst.setDate(5, new java.sql.Date(new Date().getTime()));int execute = pst.executeUpdate();if (execute > 0) {System.out.println("插入成功!");}
// 6.关闭资源pst.close();connection.close();}
}

事务

ACID

开启事务
事务提交
事务回滚
关闭事务

junit单元测试

<!--    单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>

简单使用

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)

@Test注解只有在运行时有效,只要加了这个注解的方法,就可以直接运行

package org.raylene.test;import org.junit.jupiter.api.Test;public class TestJdbc3 {@Testpublic void test(){System.out.println("hello");}
}

运行成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UTpVSbQJ-1637285970221)(C:\Users\raylene\AppData\Roaming\Typora\typora-user-images\image-20211116203505362.png)]

运行失败

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtL32dTS-1637285970222)(C:\Users\raylene\AppData\Roaming\Typora\typora-user-images\image-20211116203544818.png)]

新建数据库

 CREATE TABLE `jdbc`.`account`( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(40), `money` DECIMAL, PRIMARY KEY (`id`) ) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; INSERT INTO `jdbc`.`account` (`id`, `name`, `money`) VALUES ('1', 'A', '2000');
INSERT INTO `jdbc`.`account` (`id`, `name`, `money`) VALUES ('2', 'B', '10000');
INSERT INTO `jdbc`.`account` (`id`, `name`, `money`) VALUES ('3', 'C', '5000');

测试事务提交

package org.raylene.test;import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class TestJdbc3 {String url = null;String username =null;String pwd = null;Connection connection = null;@Testpublic void test() throws ClassNotFoundException, SQLException {//        配置信息url = "jdbc:mysql://localhost:3306/jdbc?&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";username = "root";pwd = "GRL971215";try {//   1.  加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//        2.链接数据库connection = DriverManager.getConnection(url, username, pwd);//        3.编写sqlconnection.setAutoCommit(false);String sql = "update `account` set money = money - 100 where name = 'A';";connection.prepareStatement(sql).executeUpdate();//       制造错误int i = 1/0;String sql2 = "update `account` set money = money + 100 where name = 'B';";connection.prepareStatement(sql2).executeUpdate();//      以上两条语句都执行成功才提交connection.commit();System.out.println("success");}catch (Exception e){try{connection.rollback();}catch (SQLException e1){e1.printStackTrace();}}finally {connection.close();}
}
}

javabean|MVC|Filter|监听器|过滤器|JDBC相关推荐

  1. JavaWeb(二):Cookie、Session、JSP、过滤器和监听器、JDBC

    JavaWeb-2 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV12J411M7Sj 学习资料笔记:CSDN – https://blog.c ...

  2. java day43【Filter:过滤器 、Listener:监听器】

    第一章  Filter:过滤器 1. 概念: * 生活中的过滤器:净水器,空气净化器,土匪. * web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能. * 过滤器的作 ...

  3. JavaWeb(九)——JavaBean、Filter

    文章目录 1. JavaBean 2. MVC三层架构 2.1 早些年 2.2 MVC 三层架构 3. Filter (重点) 4. 监听器 5. 过滤器.监听器的常见应用 1. JavaBean 实 ...

  4. ASP.NET MVC 4 (三) 过滤器

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  5. MVC Filter

    MVC Filter是典型的AOP(面向切面编程).MVC框架支持5种不同类型的过滤器,每种类型让你能够在请求处理类型的不同点上引入逻辑.下图描述了集中过滤器类型: 不同类型的Filters Auth ...

  6. Asp.net MVC Filter监控页面性能和运行时间

    本篇文章作用说明: Asp.net MVC Filter监控View实例,监控每个View页面加载的时间,跟踪分析每个页面的加载性能,然后做进一步优化: 问题背景 最近,客户一直反馈系统使用慢,有时候 ...

  7. (Filter)过滤器的使用

    过滤器(Filter)的简介 过滤器(Filter): 能够完成筛选不需要数据的工具(东西). 类似于生活中的净水器,香烟过滤嘴,滤纸, 收费站等.------->单向的. Web中:  过滤器 ...

  8. ASP.NET MVC使用Authorize过滤器验证用户登录

    ASP.NET MVC使用Authorize过滤器验证用户登录.Authorize过滤器首先运行在任何其它过滤器或动作方法之前,主要用来做登录验证或者权限验证. 示例:使用Authorize过滤器实现 ...

  9. .NET MVC Filter异常处理

    .NET MVC Filter异常处理 参考文章: (1).NET MVC Filter异常处理 (2)https://www.cnblogs.com/wgale025/p/6232759.html ...

最新文章

  1. weblogic管理2 - 创建并启动一个managed server
  2. XCTF WEB backup
  3. 递归反转链表的一部分
  4. 20应用统计考研复试要点(part6)--统计学
  5. 史上最硬核的数学老师!搞发明、造大炮,让战斗民族直叫爸爸,看完我跪了......
  6. typeorm 生成实体类_android常用orm框架greenDAO创建表生成实体类
  7. 网页载入动画 php,网站页面加载动画代码
  8. 今天用Map集合写了一个字符串字符统计的程序,看集合看的头痛,就看了一下GUI,于是就随便记点。
  9. 如何成为优秀的科学家
  10. VB 域名转换IP地址函数
  11. idea无法登录github,显示显示错误信息invalid authentication data的终极解决办法。
  12. c 标签 foreach里面套choose做判断
  13. 实习成长之路:设计模式二:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
  14. python源码剖析_Python源码剖析
  15. 截至20161210创业板股票代码和名称
  16. CrossBar 将 PUF 技术引入 ReRAM
  17. 【外挂逆向】《某涯明月刀》BUFF及技能预判
  18. 【SIM】MCC(移动国家码)和 MNC(移动网络码)
  19. 网络属性检查和设置-getsockopt()
  20. 《机器学习》周志华 --第3章 线性模型 思维导图+笔记+习题

热门文章

  1. css 径向渐变实现渐变小圈
  2. Vue-router,从基础入门到手拿大厂Offter,看这篇文章就够了。
  3. 杰里695N系列(soundbox)之0.0 开发环境搭建
  4. mysql 辅键_mysql 的主辅配置
  5. web2——影评网页
  6. opencv Day1
  7. 爬虫:爬取某个商品的历史价格并绘制折线图
  8. 按学号和姓名进行查询c语言,数据库实验4 数据查询(答案)
  9. C#高效编程--改进C#代码的50个行之有效的办法笔记
  10. android消息发送字符串,android - 从Android客户端通过HTTP在HL7消息中发送base64字符串时遇到错误 - 堆栈内存溢出...