使用Servlet作為控制器

1、使用Servlet作為表現(xiàn)層的三個(gè)劣勢(shì)

  • 開(kāi)發(fā)效率低,所有的HTML標(biāo)簽都需使用頁(yè)面輸出流完成;
  • 不利于團(tuán)隊(duì)協(xié)作開(kāi)發(fā), 美工人員無(wú)法參與Servlet界面的開(kāi)發(fā);
  • 程序可維護(hù)性差,即使修改一個(gè)按鈕的標(biāo)題,都必須重新編輯Java代碼,并重新編譯。

2、Servlet僅作為控制器使用

在標(biāo)準(zhǔn)的MVC模式中,Servlet僅作為控制器使用。Java EE應(yīng)用架構(gòu)正式遵循MVC模式的, 對(duì)于遵循MVC模式的Java EE應(yīng)用而言,JSP僅作為表現(xiàn)層(View)技術(shù), 其作用有兩點(diǎn):

  • 負(fù)責(zé)收集用戶請(qǐng)求參數(shù);
  • 將應(yīng)用的處理結(jié)果、狀態(tài)數(shù)據(jù)呈現(xiàn)給用戶。

3、示例,一個(gè)簡(jiǎn)單的登錄驗(yàn)證(Servlet作為控制器的MVC應(yīng)用):

1)登錄頁(yè)面login.jsp

<%--
  Created by IntelliJ IDEA.
  User: Chuan
  Date: 2017/9/1
  Time: 20:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="" %>
<html>
<head>
    <title>登錄頁(yè)面</title>
</head>
<body>
<%--輸出出錯(cuò)提示--%>
<span style="color:red; font-weight: bold">
    <%
        if (request.getAttribute("err") != null)
        {
            out.println(request.getAttribute("err") + "<br/>");
        }
    %>
</span>
請(qǐng)輸入用戶名和密碼:
<%--登錄表單,該表單提交到一個(gè)Servlet--%>
<form id="login" method="post" action="login">
    用戶名:<input type="text" name="username" /><br/>
    密&nbsp;&nbsp碼:<input type="password" name="pass" /><br/>
    <input type="submit" value="登錄">
</form>
</body>
</html>

2)控制器Servlet代碼LoginServlet.java

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.ResultSet;

@WebServlet(name = "login", urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet
{
    //響應(yīng)客戶端請(qǐng)求的方法
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        String errMsg = "";
        //Servlet本身并不輸出響應(yīng)到客戶端,因此必須將請(qǐng)求轉(zhuǎn)發(fā)到視圖頁(yè)面
        RequestDispatcher rd;
        
        //設(shè)置請(qǐng)求的編碼方式
        request.setCharacterEncoding("UTF-8");
        //獲取請(qǐng)求參數(shù)
        String username = request.getParameter("username");
        String pass = request.getParameter("pass");
        try
        {
            //Servlet本身并不執(zhí)行任何的業(yè)務(wù)邏輯處理,它調(diào)用JavaBean處理用戶請(qǐng)求
            DbDao dd = new DbDao("com.mysql.jdbc.Driver",
                    "jdbc:mysql://localhost:3306/您的數(shù)據(jù)庫(kù)名字", "您的用戶名", "您的密碼");
            //查詢結(jié)果集
            ResultSet rs = dd.query("select pass from user_inf"
            + " where name = ?", username);
            if (rs.next())
            {
                //用戶名和密碼匹配
                if (rs.getString("pass").equals(pass))
                {
                    //獲取session對(duì)象
                    HttpSession session = request.getSession(true);
                    //設(shè)置session屬性,跟蹤會(huì)話狀態(tài)
                    session.setAttribute("name", username);
                    //獲取轉(zhuǎn)發(fā)對(duì)象
                    rd = request.getRequestDispatcher("/welcom.jsp");
                    rd.forward(request, response);
                }
                else
                {
                    //用戶名和密碼不匹配
                    errMsg += "您的用戶名密碼不符合, 請(qǐng)重新輸入";
                }
            }
            else
            {
                //用戶名不存在時(shí)
                errMsg += "您的用戶名不存在,請(qǐng)先注冊(cè)";
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        if(errMsg != null && !errMsg.equals(""))
        {
            rd = request.getRequestDispatcher("/login.jsp");
            request.setAttribute("err", errMsg);
            rd.forward(request, response);
        }
    }
}

3)本應(yīng)用中的Modle: DbDao.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DbDao
{
    private Connection conn;
    private String driver;
    private String url;
    private String username;
    private String pass;

    public DbDao()
    {
    }

    public DbDao(String driver, String url, String username, String pass)
    {
        this.driver = driver;
        this.url = url;
        this.username = username;
        this.pass = pass;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    //獲取數(shù)據(jù)庫(kù)連接
    public Connection getConnection() throws Exception
    {
        if (conn == null)
        {
            Class.forName(this.driver);
            conn = DriverManager.getConnection(url, username, this.pass);
        }
        return conn;
    }

    //插入記錄
    public boolean insert(String sql, Object... args) throws Exception
    {
        PreparedStatement pstmt = getConnection().prepareCall(sql);
        for (int i = 0; i < args.length; i++)
        {
            pstmt.setObject(i + 1, args[i]);
        }
        if (pstmt.executeUpdate() != 1)
        {
            return false;
        }
        return true;
    }

    //執(zhí)行查詢
    public ResultSet query(String sql, Object... args) throws Exception
    {
        PreparedStatement pstmt = getConnection().prepareStatement(sql);
        for (int i = 0; i < args.length; i++)
        {

            pstmt.setObject(i + 1, args[i]);
        }
        return pstmt.executeQuery();
    }

    //執(zhí)行修改
    public void modify(String sql, Object... args) throws Exception
    {
        PreparedStatement pstmt = getConnection().prepareStatement(sql);
        for (int i = 0; i < args.length; i++)
        {
            pstmt.setObject(i + 1, args[i]);
        }
        pstmt.executeUpdate();
        pstmt.close();
    }

    //關(guān)閉連接
    public void closeConn() throws Exception
    {
        if(conn != null && !conn.isClosed())
        {
            conn.close();
        }
    }

}

4)登錄成功歡迎頁(yè)面welcome.jsp

<%--
  Created by IntelliJ IDEA.
  User: Chuan
  Date: 2017/9/1
  Time: 21:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>歡迎頁(yè)面</title>
</head>
<body>
<h3>歡迎登陸</h3>
<%=session.getAttribute("name")%>,歡迎登錄
</body>
</html>

5)數(shù)據(jù)表


user_inf.PNG

6)演示結(jié)果


登錄頁(yè)面.PNG
歡迎頁(yè)面.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 復(fù)習(xí)復(fù)習(xí)!??!搞起來(lái)??!Servlet和JSP是Java EE規(guī)范最基本成員,他們是Java Web開(kāi)發(fā)的重點(diǎn)知識(shí)...
    JackFrost_fuzhu閱讀 2,987評(píng)論 1 70
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,692評(píng)論 18 399
  • 轉(zhuǎn)自陳明乾的博客,可能有一定更新。 轉(zhuǎn)原文聲明:原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、...
    C86guli閱讀 4,883評(píng)論 6 72
  • 親愛(ài)的飛鳥(niǎo)們: 終于又聽(tīng)見(jiàn)了你們的歌聲,真好! 這個(gè)世界怎么能少了你們呢?少了你們,就少了音樂(lè),少了歌聲,少了歡樂(lè)...
    飛鳥(niǎo)王瓊閱讀 1,605評(píng)論 0 9
  • 同事小欣是個(gè)典型的北京姑娘,八零后,家里挺富裕,有車(chē)有房。姑娘自己也很上進(jìn),念了一本之后出國(guó)讀了碩士,回國(guó)之后就一...
    Jenny喬閱讀 750評(píng)論 1 6

友情鏈接更多精彩內(nèi)容