生活随笔
收集整理的這篇文章主要介紹了
JavaWeb(九)——JavaBean、Filter
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. JavaBean
- 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)編寫過濾器
- 實現Filter接口,重寫對應的方法即可
CharacterEncodingFilter文件的代碼如下:
package com
.zz
.filter
;import javax
.servlet
.*
;
import java
.io
.IOException
;public class CharacterEncodingFilter implements Filter {public void init(FilterConfig filterConfig
) throws ServletException
{System
.out
.println("CharacterEncodingFilter初始化");}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執行之后.....");}public void destroy() {System
.out
.println("CharacterEncodingFilter銷毀");}
}
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
);}
}
<?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
- 測試訪問結果:
訪問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
;
public class OnlineCountListener implements HttpSessionListener {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
);}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
>
<%@ 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
>
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")){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
);}
}
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
{Object user_session
= req
.getSession().getAttribute("USER_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
);}
}
package com
.zz
.util
;public class Constant {public static String USER_SESSION
="USER_SESSION";
}
<?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
;Object user_session
= request
.getSession().getAttribute("USER_SESSION");if(user_session
==null
){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
測試訪問結果:
進入登錄頁面
輸入admin,進入登錄成功頁面后,點擊注銷按鈕
再輸入sys/success.jsp后,不能再進入登錄成功頁面,顯示進入登錄錯誤頁面
總結
以上是生活随笔為你收集整理的JavaWeb(九)——JavaBean、Filter的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。