MVC三層架構
什麼是MVC?
Model View Controller 模型 視圖 控制器
模型:可理解爲實體類與表中對應的字段
視圖:比如jsp頁面
控制器:Servlet控制頁面跳轉與request和response處理
Filter過濾器
Filter:過濾網站數據,如登錄驗證,中文亂碼處理等
Filter開發步驟:1、導包。2、編寫過濾器。3、web.xml配置Filter
Filter接口爲import javax.servlet.*;
包下的。implents接口需要實現三個方法
//初始化
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
//銷燬
public void destroy() {
}
編寫Filter
1、過濾器中所有代碼在過濾特定請求時都會執行
2、必須要讓過濾器filterChain.doFilter()將req和resp轉交給後面的過濾器,繼續通行
3、filterChain.doFilter(servletRequest,servletResponse); //讓我們的請求繼續走,如果不寫,程序到這裏就被攔截停止。後面還有其他過濾器,需要把這次的req和resp傳給後面的Filter
public class CharacterEncodingFilter implements Filter {
/*
1、過濾器中所有代碼在過濾特定請求時都會執行
2、必須要讓過濾器filterChain.doFilter()將req和resp轉交給後面的過濾器,繼續通行
*/
//初始化:web服務器啓動就進行了初始化
public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CharacterEncodingFilter Init..."); }
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
System.out.println("Filter run start......");
filterChain.doFilter(servletRequest,servletResponse); //讓我們的請求繼續走,如果不寫,程序到這裏就被攔截停止。後面還有其他過濾器,需要把這次的req和resp傳給後面的Filter
System.out.println("Filter run stop......");
}
//銷燬:web服務器關閉時,Filter銷燬
public void destroy() { System.out.println("CharacterEncodingFilter Destmroy..."); }
}
註冊Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.zh1z3ven.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 在此設定的路由下的請求都會經過Filter處理-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
下面簡單測試下,創建兩個路由,一個走過濾器,一個不走過濾器
servlet
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好,世界");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Web.xml
<servlet>
<servlet-name>show</servlet-name>
<servlet-class>com.zh1z3ven.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>show</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>show</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
Filter實現權限攔截
Jsp中實現過濾
<%--在jsp中實現鑑權。如果用戶未攜帶session就跳轉到login頁面--%>
<%
Object user_session = request.getSession().getAttribute("USER_SESSION");
if (user_session==null){
response.sendRedirect("/login.jsp");
}
%>
但是這樣success.jsp和error.jsp都要寫一遍,代碼寫的就很臃腫,不如Filter來實現比較方便和易於管理
主要實現用戶登錄之後,判斷是否存在session,若有才可以進入/sys/success頁面。若不存在則跳到error界面。
Login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<h2>登錄</h2>
<form action="/servlet/login" method="post" >
<input name="username" type="text">
<input name="submit" type="submit">
</form>
</body>
</html>
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
<h2>error</h2>
<h2><a href="/login.jsp">返回首頁</a> </h2>
</body>
</html>
/sys/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<h2>success</h2>
<p><a href="/servlet/logout" name="logout">logout</a> </p>
</body>
</html>
LoginServlet
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
if ("admin".equals(username)){
req.getSession().setAttribute(Contant.USER_SESSION,req.getSession().getId());
resp.sendRedirect("/sys/success.jsp");
}else {
resp.sendRedirect("/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
LogoutServlet
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object user_session = req.getSession().getAttribute(Contant.USER_SESSION);
if (user_session!=null){
req.getSession().removeAttribute(Contant.USER_SESSION);
resp.sendRedirect("/login.jsp");
}else {
resp.sendRedirect("/login.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
SysFilter
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 Req = (HttpServletRequest) servletRequest;
HttpServletResponse Resp = (HttpServletResponse) servletResponse;
if (Req.getSession().getAttribute(Contant.USER_SESSION)==null){
Resp.sendRedirect("/error.jsp");
}
filterChain.doFilter(Req,Resp);
}
public void destroy() {
}
}
/util/Contant.java 將session處理爲常量,便於編寫和修改代碼
public class Contant {
public final 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>login</servlet-name>
<servlet-class>com.zh1z3ven.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>com.zh1z3ven.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logout</servlet-name>
<url-pattern>/servlet/logout</url-pattern>
</servlet-mapping>
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.zh1z3ven.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
</web-app>