文章目录

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

1. JavaBean

实体类:一般都是和数据库中的表结构一一对应
JavaBean有特定的写法:

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

一般用来和数据库的字段做映射 ORM;
ORM :对象关系映射

  • 表—>类
  • 字段–>属性
  • 行记录---->对象
class People{private int id;private String name;private int age;private String address;
}class A{new People(1,"美女1号",18,"安徽");new People(2,"美女2号",27,"杭州");new People(3,"美女3号",38,"西安");
}

JavaBean属性

  • 一个JavaBean对象的属性应该是可访问的。这个属性可以是任意合法的Java数据类型,包括自定义Java类。
  • 一个JavaBean对象的属性可以是可读写,或只读,或只写。 getPropertyName() 和 setPropertyName() 两个方法

进行测试:
建立一个People 类

package com.zz.pojo;public class People {private int id;private String name;private int age;private String address;public People() {}public People(int id, String name, int age, String address) {this.id = id;this.name = name;this.age = age;this.address = address;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "People{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}
}

打开SQLyog软件,创建数据库jdbc,并在数据库下创建表people

用IDEA连接jdbc数据库

建立javabean.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><jsp:useBean id="people" class="com.zz.pojo.People" scope="page"/><jsp:setProperty name="people" property="id" value="1" />
<jsp:setProperty name="people" property="name" value="小胖猪" />
<jsp:setProperty name="people" property="age" value="18" />
<jsp:setProperty name="people" property="address" value="安徽" /><%--得到--%>
id:<jsp:getProperty name="people" property="id"/>;
姓名:<jsp:getProperty name="people" property="name"/>;
年龄:<jsp:getProperty name="people" property="age"/>;
地址:<jsp:getProperty name="people" property="address"/></body>
</html>

测试访问结果:

2. MVC三层架构

什么是MVC: Model view Controller 模型、视图、控制器

2.1 早些年


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

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

2.2 MVC 三层架构

Model

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

View

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

Controller (Servlet)

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

3. Filter (重点)

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

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

    Filter开发步骤:
    (1)导包
    在pom.xml文件内进行导包
<?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>com.zz</groupId><artifactId>javaweb-filter</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--Servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><!--JSP依赖--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency><!--JSTL表达式的依赖--><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency><!--standard标签库--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--连接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency></dependencies></project>

(2)编写过滤器

  • 必须导javax.servlet包

  • 实现Filter接口,重写对应的方法即可
    CharacterEncodingFilter文件的代码如下:
package com.zz.filter;import javax.servlet.*;
import java.io.IOException;public class CharacterEncodingFilter implements Filter {// 初始化 :web服务器启动,就已经初始化了,随时等待过滤对象出现!public void init(FilterConfig filterConfig) throws ServletException {System.out.println("CharacterEncodingFilter初始化");}//filterChain : 链/*1. 过滤中的所有代码,在过滤特定请求的时候都会执行2. 必须要让过滤器继续同行filterChain.doFilter(servletRequest,servletResponse);*/public 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("CharacterEncodingFilter执行之前.....");filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止!System.out.println("CharacterEncodingFilter执行之后.....");}//销毁:web服务器关闭的时候,过滤会销毁public void destroy() {System.out.println("CharacterEncodingFilter销毁");}
}
  • ShowServlet文件的代码如下:
package com.zz.servlet;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 ShowServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("你好,小姐姐");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
  • 在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>com.zz.servlet.ShowServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>ShowServlet</servlet-name><url-pattern>/servlet/show</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ShowServlet</servlet-name><url-pattern>/show</url-pattern></servlet-mapping><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.zz.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><!--只要是 /servlet的任何请求,会经过这个过滤器--><url-pattern>/servlet/*</url-pattern><!--<url-pattern>/*</url-pattern>--></filter-mapping></web-app>
  • 测试访问结果:
    访问show 时,没有经过过滤器,会出现乱码问题

    访问servlet/show时,经过过滤器,不会出现乱码问题

    此时输出控制台显示:

    当关闭服务器时,输出控制台显示:

4. 监听器

实现一个监听器的接口;(有N种)
(1)编写一个监听器OnlineCountListener
实现监听器的接口HttpSessionListener…

package com.zz.listener;import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {//创建session监听: 看你的一举一动//一旦创建Session就会触发一次这个事件!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监听//一旦销毁Session就会触发一次这个事件!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);}}

(2)web.xml中注册监听器

<!--注册监听器--><listener><listener-class>com.zz.listener.OnlineCountListener</listener-class></listener><session-config><session-timeout>1</session-timeout></session-config>

(3)测试访问结果:

5. 过滤器、监听器的常见应用

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

package com.zz.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);panel.setBackground(new Color(0,255,0)); //设置背景颜色frame.add(panel);frame.setVisible(true);//监听事件,监听关闭事件frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {super.windowClosing(e);}});}
}

过滤器应用:用户登录之后才能进入登录成功页面(主页)!用户注销后就不能进入登录成功页面了!
(1)用户登录之后,向Sesison中放入用户的数据
(2)进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!

  • 创建的文件有如下:
  • 登录页面 Login.jsp 的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>登录</h1>
<form action="/servlet/login" method="post"><input type="text" name="username"><input type="submit">
</form></body>
</html>
  • 登录成功页面 success.jsp 的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>欢迎来到主页</h1>
<p><a href="/servlet/logout">注销</a></p></body>
</html>
  • 登录错误页面 error.jsp 的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>错误</h1>
<h3>没有权限,或者用户名错误!</h3>
<a href="/Login.jsp">返回到登录页面</a></body>
</html>
  • LoginServlet 的代码如下:
package com.zz.servlet;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")){//如果登录成功,就把用户信息放到session里面,并且重定向跳转到成功页面req.getSession().setAttribute("USER_SESSION",req.getSession().getId());resp.sendRedirect("/sys/success.jsp");}else{//如果登录失败,就重定向跳转到错误页面resp.sendRedirect("/error.jsp");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
  • LogoutServlet 的代码如下:
package com.zz.servlet;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 LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//拿到sessionObject user_session = req.getSession().getAttribute("USER_SESSION");//如果session不为空,则移除session,并重定向到登录页面if(user_session!=null){req.getSession().removeAttribute("USER_SESSION");resp.sendRedirect("/Login.jsp");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
  • 工具包下的常量Constant 的代码如下:
package com.zz.util;public class Constant {public static String USER_SESSION="USER_SESSION";
}
  • 注册页面web.xml 的代码如下:
<?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>LoginServlet</servlet-name><servlet-class>com.zz.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/servlet/login</url-pattern></servlet-mapping><servlet><servlet-name>LogoutServlet</servlet-name><servlet-class>com.zz.servlet.LogoutServlet</servlet-class></servlet><servlet-mapping><servlet-name>LogoutServlet</servlet-name><url-pattern>/servlet/logout</url-pattern></servlet-mapping>
</web-app>
  • 测试访问结果:

    进入登录页面

    随意输入,如:2323,就进入了登录错误页面

    输入admin, 就进入了登录成功页面,再点击注销按钮

  • 发现问题:点击注销后,即未登录成功的情况下,就能直接访问登录成功页面

  • 解决方法
    方法一(不推荐使用):
    在登录成功的页面上进行限制,即增加下图红方块内代码。

    同时在LogoutServlet 中增加如下代码:

方法二(推荐使用):
添加一个过滤器,编写SysFilter类,代码如下:

package com.zz.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class SysFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//强转成我们常使用的两个对象HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//获取sessionObject user_session = request.getSession().getAttribute("USER_SESSION");if(user_session==null){//如果session为空,则进入错误页面response.sendRedirect("/error.jsp");}//让过滤器继续往下走filterChain.doFilter(request,response);}public void destroy() {}
}

在web.xml 中注册过滤器:

  <!--注册过滤器--><filter><filter-name>SysFilter</filter-name><filter-class>com.zz.filter.SysFilter</filter-class></filter><filter-mapping><filter-name>SysFilter</filter-name><url-pattern>/sys/*</url-pattern></filter-mapping>

测试访问结果:

进入登录页面

输入admin,进入登录成功页面后,点击注销按钮

再输入sys/success.jsp后,不能再进入登录成功页面,显示进入登录错误页面

JavaWeb(九)——JavaBean、Filter相关推荐

  1. SP+Servlet+JavaBean+Filter+JSTL小例子

    web应用:MVC用户认证部分    下载源代码 [ 作者: island ][ 大小:808k ][ 发布日期:2007-09-08 ][ 浏览:1 ]  (一)    学习java web应用已经 ...

  2. JavaWeb:过滤器Filter

    1. 过滤器概述 1.1 什么是过滤器 过滤器会在一组资源(jsp.servlet..css..html等等)的前面执行!它可以让请求得到目标资源,也可以不让请求达到!过滤器有拦截请求的能力! 过滤器 ...

  3. javaWEB学习之filter

    JavaWeb三大组件 1. 都需要在web.xml中进行配置 Servlet Listener Filter 2. 过滤器       它通过web.xml管理着一大片资源,它会在一组资源(jsp. ...

  4. JavaWeb过滤器(Filter)

    开发工具与关键技术:javaWeb,过滤器(Filter) 撰写时间:2019-05-26 总结下述所有表达 第一点:过滤器是什么 第二点:客户端到服务端的流程 第三点:过滤器如何编写 第四点:Fil ...

  5. (29) JavaWeb中使用filter过滤器拦截请求、权限检查,过滤响应。

    Filter 过滤器 一.Filter 什么是过滤器 二.Filter 过滤器的使用步骤: 三.Filter 的生命周期 四.FilterConfig 类 五.FilterChain 过滤器链 六.F ...

  6. javaweb学习总结——Filter高级开发

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...

  7. python十九:map,filter,reduce函数

    # 处理序列中的每个元素,得到的结果是一个'列表',该'列表'元素个数及位置与原来一样 def map_practice(func, lt_num):lt_new = []for i in lt_nu ...

  8. JavaWeb学习:Filter

    图1 关于Filter,见名知意,是为了过滤(进行一些处理)而存在的,当一些需要统一的操作,在实际处理时就可以采用filter来进行处理. 图2 关于filter的接口,主要如图2所示,生命周期主要还 ...

  9. JAVA爬虫三剑客,JAVAWEB三剑客之Filter

    Filter是什么 什么是Filter,看名字就是过滤器的意思,主要是针对用户发起的请求进行拦截预处理,常见的Filter应用有检查当前请求是否登录,记录请求日志,设置上下文信息等等,当然Filter ...

最新文章

  1. zookeeper适用场景:zookeeper解决了哪些问题
  2. JavaScript对象系统说明图
  3. JavaScript面试时候的坑洼沟洄——表达式与运算符
  4. linux下 LVM的应用
  5. HALCON示例程序measure_ring.hdev齿轮齿宽度测量
  6. 207. 课程表/210. 课程表 II
  7. java 字符串比较 == equals_Java在比较字符串的时候,equals 与== 完全一样呀?
  8. mybatis 二级缓存使用注意
  9. 2017-06-23
  10. Base ui 纯as3的ui
  11. BotenaGo 僵尸网络利用33个exploit 攻击数百万物联网设备
  12. 树莓派(raspberry pi)学习11: 将树莓派变成一个Web服务器(转)
  13. Opengl es2.0 学习笔记(十)VBO、IBO和FBO
  14. idea 读取md文件卡死
  15. Photoshop快捷键总结
  16. 用Python学《微积分B》(微积分应用)
  17. 2021-04-29 Mac有效阻止应用联网 - 免费的第三方软件
  18. Python使用wordcloud做词云
  19. spring bean的实例化
  20. 《痞子衡嵌入式半月刊》 第 48 期

热门文章

  1. matlab如何输出D-H表,MATLAB结果怎么输出表格形式的数据?
  2. kdj值应用口诀_KDJ买卖绝学!记住这些操作 精准判断quot;顶部和底部quot; 让你远离亏损...
  3. matlab作图标记
  4. 2017年10月08日普及组 世界语
  5. 无法启动此程序,因为计算机中丢失msvcrtd.dll,Win7打开剑灵提示“丢失d3dx10_43.dll、MSVCRTD.dll文件”怎么办?...
  6. 福昕pdf虚拟打印机_一学就会的PDF文档压缩小技巧
  7. vc下c语言网络编程,用VC编写C/S消息传送程序
  8. 结对编程小项目实现 Python+PyQt5+OOP
  9. async异步注解和aspect切面注解等注解的原理
  10. java集合框架03