Java ---理解MVC架構

     以前的文章,咱們主要是介紹了jsp的相關語法操做,咱們能夠經過請求某個jsp頁面,而後由相對應的servlet實例給咱們返回html頁面。可是在實際的項目中,咱們不多會直接的請求某個頁面,通常都是請求某個URL,而後由咱們的攔截器解析這個URL,調用model層處理一些邏輯判斷或者數據取出等,最後會調用view將頁面信息返回。這就是典型的MVC架構模式。本篇文章將會從一個簡單的實例瞭解一下,MVC模式下的Java是如何實現的。
     首先,咱們須要知道在Java中,到底是哪些模塊充當Controler,View,Model。在Java中,使用servlet充當controler,使用javabean充當model,使用jsp充當view。咱們首先看看如何使用servlet充當controler的角色。咱們以前曾經講jsp的時候看過servlet實例的源代碼,那是編譯器自動生成的,並非咱們寫的。若是咱們想要用servlet做爲攔截器使用,就必需要本身實現一個servlet實例。每一個servlet必須繼承HttpServlet這個抽象類。也就是說,若是你想要使用servlet做爲攔截器就須要繼承抽象類HttpServlet,重寫其某些方法。html

public abstract class HttpServlet{
    void doGet()
    void doPost()
    void doPut()
    void doDelete()
    void service()
}

     HttpServlet這個類提供了不少的默認實現方法,有用於響應用戶get請求的方法,post請求方法,put請求方法等,service這個方法用於響應客戶端全部請求,因此咱們通常只須要重寫這個方法就能夠來實現對用戶全部請求的響應。java

@WebServlet(name="myservlet",urlPatterns = {"/walker"})
public class Test_class extends HttpServlet {

    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        OutputStream outputStream = resp.getOutputStream();
        PrintStream printStream = new PrintStream(outputStream);
        printStream.println("<html>");
        printStream.println("<head>");
        printStream.println("</head>");
        printStream.println("<body>");
        printStream.println("<h1>hello world</h1>");
        printStream.println("</body>");
        printStream.println("</html>");

    }
}

第一行是webservle註解,指定該servlet用於響應什麼URL,咱們指定的walker,也就是當咱們在瀏覽器上輸入walker地址將由此servlet響應咱們的請求。
這裏寫圖片描述web

下面的內容想必你們都是能看懂的,畢竟在介紹jsp內置對象的時候介紹過response是能夠獲取一個輸出到客戶端的輸出流的。咱們能夠將html代碼輸出到用戶端。(響應用戶請求)此處servlet並無做爲攔截器,這裏只是演示如何使用servlet響應用戶請求,關於servlet做爲攔截器的內容下文介紹。
     下面說說充當model的Javabean,javabean其實就是一種規範,他以嚴格的命名規範要求全部的屬性必須設置爲私有的,而且必須提供setXXX,getXXX方法,將屬性暴露。sql

public class Model {
    private String name;
    private int age;

    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name = name;
    }

    public int getAge(){
        return this.age;
    }
    public void getAge(int age){
        this.age = age;
    }
    
    //..........一些邏輯控制代碼...
}

這就是一個符合Javabean規範的model類,其中,除了定義一些屬性以外,咱們還能夠定義一些能夠控制邏輯走向的代碼,也就是能夠在這裏面定義一些方法用來完成一些功能,例如鏈接數據庫,查詢出符合某條件的結果集等。具體的最後會以一個例子演示。
     對於view層,咱們使用的jsp技術,它主要用來呈現由model層處理完的數據。具體的語法已經在以前的文章中介紹過了,此處再也不贅述,下面咱們經過一個登錄的例子來感覺一下MVC架構。代碼有點長,咱們慢慢看。數據庫

@WebServlet(name="Test_class",urlPatterns = {"/login"})
public class Test_class extends HttpServlet {

    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {

        RequestDispatcher rd = req.getRequestDispatcher("/login.jsp");

        rd.forward(req,resp);
    }
}
/////login.jsp
<html>
<head>
    <title>登陸註冊</title>
</head>
<body>
    <form method="post" action="/index">
        姓名:<input type="text" name="name" /><br /><br />
      密碼:<input type="password" name="pwd" />
      <input type="submit" value="提交" />
    </form>
</body>
</html>

以上是一個簡化了的MVC模式, servlet:Test_class 做爲攔截器,login.jsp做爲view展現層,只是沒有邏輯控制層,由於這個不須要邏輯控制,只是一個攔截跳轉頁面。咱們看到login頁面的form表單提交的目的地是:index攔截器。瀏覽器

@WebServlet(name="index",urlPatterns = {"/index"})
public class index extends HttpServlet {

    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        req.setCharacterEncoding("UTF-8");
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        Model model = new Model();
        Connection con =model.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=FitWeb", "sa", "123456");
        try {
            RequestDispatcher rd = req.getRequestDispatcher("/index.jsp");
            if(model.sureLogin(con,name,pwd)){
                req.setAttribute("mes","登陸成功");
            }else{
                req.setAttribute("mes","登陸失敗");
            }
            rd.forward(req,resp);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ServletException e) {
            e.printStackTrace();
        }finally {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

咱們能夠看到,在這個頁面裏面,咱們首先指定了響應編碼方式,而後接受表單提交的全部信息。建立一個Javabean的model層,由於攔截器不負責邏輯代碼,主要的邏輯代碼仍是在model層,咱們看model層代碼,等會回來接着看index攔截器。架構

public class Model {
    private String name;
    private String pwd;

    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name = name;
    }

    public String getAge(){
        return this.pwd;
    }
    public void getAge(String pwd){
        this.pwd = pwd;
    }

    public Connection getConnection(String url,String name,String pwd){
        Connection con=null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(url,name,pwd);
        }catch (Exception e){
            e.printStackTrace();
        }
        return con;
    }
    public boolean sureLogin(Connection con,String name,String pwd) throws SQLException {
        PreparedStatement ps = con.prepareStatement("SELECT * from users WHERE name =? AND pass=?");
        ps.setString(1,name);
        ps.setString(2,pwd);

        ResultSet rs = ps.executeQuery();

        if(rs.next()){
            return true;
        }else{
            return false;
        }
    }

}

整個model層主要定義了兩個方法,一個是獲取數據庫鏈接對象,一個是用來校驗用戶名和密碼是否正確的方法。其他的都是屬性,全部屬性必須徹底按照Javabean規範命名和定義getXXX,setXXX方法。這兩個方法很簡單,若是不清楚的能夠查看上篇文章。接着咱們回到index攔截器。
     try語句塊中,定義了RequestDispatcher 用來實現頁面的跳轉,這是一個很重要的方法,由於攔截器不會用來直接響應用戶,一定是調用jsp做爲view層響應用戶,因此這個跳轉語句幾乎是每一個攔截器都會有的。判斷用戶名和密碼,而後req.setAttribute方法,增長一個參數在當前request請求中,以便jsp頁面能夠獲取接受。最後跳轉頁面,經過jsp頁面展現結果。下面是運行的截圖。
這裏寫圖片描述
這裏寫圖片描述jsp

你們能夠看到,在整個過程當中,地址欄中的URL始終都是攔截器的URL。這更加的證實了咱們MVC架構的優勢,經過攔截器攔截URL解析而後響應用戶,若是遇到不正常的URL,直接攔截跳轉錯誤頁面。ide

     本篇結束,主要仍是從客觀上感覺了MVC架構的每一層所負責的任務。若是做者有理解錯誤,望你們指出!sqlserver

相關文章
相關標籤/搜索