日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaWeb(九)——JavaBean、Filter

發布時間:2025/3/13 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb(九)——JavaBean、Filter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。