javabean|MVC|Filter|监听器|过滤器|JDBC
一、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:过滤器,用来过滤网站的数据。
- 处理中文乱码
- 登录验证…
导包
编写过滤器
导包不要倒错
import javax.servlet.*; 下的Filter
配置依赖
<?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>
实现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已经销毁了");} }
配置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监听器
- 实现监听器
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,自动销毁}
- 在webxml中注册监听器
<listener><listener-class>org.raylene.listener.OnlineCountListener</listener-class></listener>
- 根据情况看使用哪种或者不使用
五、过滤器、监听器的常见应用
监听器: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实现权限拦截
- 配置依赖
<?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>
- 编写对应的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>
- 编写对应的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);}
}
- 编写过滤器,防止其直接进入登录成功界面
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() {}
}
- 在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
- 新建数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V0Ydm642-1637285970218)(C:\Users\raylene\AppData\Roaming\Typora\typora-user-images\image-20211116200513126.png)]
- 添加依赖
<!-- mysql驱动-->
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency>
</dependencies>
- 新建java文件
jdbc固定步骤
加载驱动
Class.forName(“com.mysql.cj.jdbc.Driver”);链接数据库
Connection connection = DriverManager.getConnection(url, username, pwd);向数据库发生sql的对象statement :CRUD
Statement statement = connection.createStatement();编写sql
String sql = “select * from users”;执行sql
ResultSet resultSet = statement.executeQuery(sql); int i = statement.executeUpdate(sql);
关闭资源
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相关推荐
- JavaWeb(二):Cookie、Session、JSP、过滤器和监听器、JDBC
JavaWeb-2 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV12J411M7Sj 学习资料笔记:CSDN – https://blog.c ...
- java day43【Filter:过滤器 、Listener:监听器】
第一章 Filter:过滤器 1. 概念: * 生活中的过滤器:净水器,空气净化器,土匪. * web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能. * 过滤器的作 ...
- JavaWeb(九)——JavaBean、Filter
文章目录 1. JavaBean 2. MVC三层架构 2.1 早些年 2.2 MVC 三层架构 3. Filter (重点) 4. 监听器 5. 过滤器.监听器的常见应用 1. JavaBean 实 ...
- ASP.NET MVC 4 (三) 过滤器
先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...
- MVC Filter
MVC Filter是典型的AOP(面向切面编程).MVC框架支持5种不同类型的过滤器,每种类型让你能够在请求处理类型的不同点上引入逻辑.下图描述了集中过滤器类型: 不同类型的Filters Auth ...
- Asp.net MVC Filter监控页面性能和运行时间
本篇文章作用说明: Asp.net MVC Filter监控View实例,监控每个View页面加载的时间,跟踪分析每个页面的加载性能,然后做进一步优化: 问题背景 最近,客户一直反馈系统使用慢,有时候 ...
- (Filter)过滤器的使用
过滤器(Filter)的简介 过滤器(Filter): 能够完成筛选不需要数据的工具(东西). 类似于生活中的净水器,香烟过滤嘴,滤纸, 收费站等.------->单向的. Web中: 过滤器 ...
- ASP.NET MVC使用Authorize过滤器验证用户登录
ASP.NET MVC使用Authorize过滤器验证用户登录.Authorize过滤器首先运行在任何其它过滤器或动作方法之前,主要用来做登录验证或者权限验证. 示例:使用Authorize过滤器实现 ...
- .NET MVC Filter异常处理
.NET MVC Filter异常处理 参考文章: (1).NET MVC Filter异常处理 (2)https://www.cnblogs.com/wgale025/p/6232759.html ...
最新文章
- weblogic管理2 - 创建并启动一个managed server
- XCTF WEB backup
- 递归反转链表的一部分
- 20应用统计考研复试要点(part6)--统计学
- 史上最硬核的数学老师!搞发明、造大炮,让战斗民族直叫爸爸,看完我跪了......
- typeorm 生成实体类_android常用orm框架greenDAO创建表生成实体类
- 网页载入动画 php,网站页面加载动画代码
- 今天用Map集合写了一个字符串字符统计的程序,看集合看的头痛,就看了一下GUI,于是就随便记点。
- 如何成为优秀的科学家
- VB 域名转换IP地址函数
- idea无法登录github,显示显示错误信息invalid authentication data的终极解决办法。
- c 标签 foreach里面套choose做判断
- 实习成长之路:设计模式二:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
- python源码剖析_Python源码剖析
- 截至20161210创业板股票代码和名称
- CrossBar 将 PUF 技术引入 ReRAM
- 【外挂逆向】《某涯明月刀》BUFF及技能预判
- 【SIM】MCC(移动国家码)和 MNC(移动网络码)
- 网络属性检查和设置-getsockopt()
- 《机器学习》周志华 --第3章 线性模型 思维导图+笔记+习题
热门文章
- css 径向渐变实现渐变小圈
- Vue-router,从基础入门到手拿大厂Offter,看这篇文章就够了。
- 杰里695N系列(soundbox)之0.0 开发环境搭建
- mysql 辅键_mysql 的主辅配置
- web2——影评网页
- opencv Day1
- 爬虫:爬取某个商品的历史价格并绘制折线图
- 按学号和姓名进行查询c语言,数据库实验4 数据查询(答案)
- C#高效编程--改进C#代码的50个行之有效的办法笔记
- android消息发送字符串,android - 从Android客户端通过HTTP在HL7消息中发送base64字符串时遇到错误 - 堆栈内存溢出...