Model1 開(kāi)發(fā)模式 實(shí)例

早期的Java EE項(xiàng)目全部采用JSP編寫(xiě),JSP文件既要負(fù)責(zé)創(chuàng)建HTML頁(yè)面,又要控制網(wǎng)頁(yè)流程.同時(shí)還要負(fù)責(zé)處理業(yè)務(wù)邏輯. 這給Java EE的開(kāi)發(fā)帶來(lái)一系列問(wèn)題 如 代碼耦合性強(qiáng),系統(tǒng)控制流程復(fù)雜,難以維護(hù)等,為了解決這些問(wèn)題,原Sun公司制定了Model1模式作為Java EE程序員開(kāi)發(fā)的考性規(guī)范.

在Java EE程序開(kāi)發(fā)中,通常用JSP負(fù)責(zé)動(dòng)態(tài)生成Web網(wǎng)頁(yè),而業(yè)務(wù)邏輯則由其他可重用的組件(如JavaBean)來(lái)實(shí)現(xiàn) .JSP可通過(guò)Java程序片段來(lái)訪問(wèn)這些組件,于是就有了JSP+JavaBean這樣同行的程序結(jié)構(gòu) ,也就是Model1開(kāi)發(fā)模式.

Model1開(kāi)發(fā)模式圖

基于Model1架構(gòu)的Java EE程序 ,其工作流程都死按如下4步進(jìn)行的.

  1. 瀏覽器發(fā)出請(qǐng)求 該請(qǐng)求由JSP頁(yè)面 接收
  2. JavaBean用于實(shí)現(xiàn)業(yè)務(wù)邏輯 JSP根據(jù)請(qǐng)求的需要與不同的JavaBean進(jìn)行交互
  3. JavaBean執(zhí)行業(yè)務(wù)處理 通過(guò)JDBC操作數(shù)據(jù)庫(kù)
  4. JSP將程序運(yùn)行的結(jié)果信息生成動(dòng)態(tài)Web網(wǎng)頁(yè)發(fā)回瀏覽器

下面是一個(gè)簡(jiǎn)易留言版的實(shí)例

登陸頁(yè)面 login.jsp
<%--
  Created by IntelliJ IDEA.
  User: FX50J
  Date: 2018/1/17
  Time: 15:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=gb2312" language="java" %>
<html>
<head>
    <title>簡(jiǎn)易留言板</title>
</head>
<body>
    <form action="newvalidate.jsp" method="post">
        <table>
        <caption>用戶登陸</caption>
        <tr>
            <td>用戶名:</td>
            <td>
                <input type="'text" name="username" size ="20" />
            </td>
        </tr>
        <tr>
            <td>密碼:</td>
            <td>
                <input type="password" name="password" size="21"/>
            </td>
        </tr>
        </table>
        <input type="submit" value="登陸"/>
        <input type="reset" value="重置"/>
    </form>
    如果沒(méi)有注冊(cè)單機(jī)<a href=""> 這里</a>注冊(cè)!
</body>
</html>

信息處理 newvalidate.jsp
//主要用來(lái)處理 login.jsp 發(fā)送過(guò)來(lái)的信息 如果正確轉(zhuǎn)向留言板頁(yè)面
//如果錯(cuò)誤 轉(zhuǎn)向error頁(yè)面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page language="java" pageEncoding="gb2312" import="java.sql.*,org.easybooks.test.model.vo.UserTable" %>
<jsp:useBean id="SqlSrvDB" scope="page" class="org.easybooks.test.jdbc.SqlSrvDBConn"/>
<html>
<head>
    <title>newValidate</title>
</head>
<body>
    <%
        request.setCharacterEncoding("gb2312"); //設(shè)置請(qǐng)求編碼
        String user = request.getParameter("username");
        String pwd = request.getParameter("password");
        boolean validated = false;
        UserTable User = null; //疑惑
        //先獲得UserTable對(duì)象 如果是第一次訪問(wèn)該頁(yè) 用戶對(duì)象肯定為空 但如果是第二次甚至是第三次 就直接登陸主頁(yè)而無(wú)須重復(fù)驗(yàn)證用戶信息
        User =(UserTable)session.getAttribute("User");
        //如果 用戶是第一次進(jìn)入 會(huì)話中尚未存儲(chǔ)User持久化啊對(duì)象 故為null
        //if(session.getAttribute("User")==null) System.out.println("Now the problem is solved");用來(lái)debug用的 可以無(wú)視
        if(User==null){
            //查詢userTable表中的記錄
            String sql = "select * from usertable";
            ResultSet rs = SqlSrvDB.executeQuery(sql);
           // System.out.println(user+"   "+pwd); //debug用
            while(rs.next()){
               // System.out.println(rs.getString("username")+"  "+rs.getString("password")); debug用
                if(rs.getString("username").trim().compareTo(user)==0 && rs.getString("password").trim().compareTo(pwd)==0){
                    validated = true;
                    User = new UserTable();   //創(chuàng)建持久化的JavaBean對(duì)象user
                    User.setId(rs.getInt("id"));
                    User.setUsername(rs.getString("username"));
                  //  System.out.println(User.getUsername()); debug用
                    User.setPassword(rs.getString("password"));
                   // System.out.println(User.getPassword()); debug用
                    session.setAttribute("User",User);   //把user對(duì)象存儲(chǔ)在會(huì)話中
                    UserTable testUser = (UserTable)session.getAttribute("User");
                //    if(testUser==null) System.out.println("Error"); debug用
                //   else System.out.println("There is no error");

                }
            }
            rs.close();
            SqlSrvDB.closeStmt();
            SqlSrvDB.closeConn();
        }
        else{
            validated = true;
            System.out.println("revies validate");
        }
   //     System.out.println(validated); debug用
        if(validated){
            %>
        <jsp:forward page="newmain.jsp" />
    <%
        }
        else{
            %>
    <jsp:forward page="error.jsp"/>
    <%
        }
    %>
</body>
</html>

用來(lái)保存session信息的UserTable類
//每次成功登陸以后 就設(shè)置一個(gè)session屬性User 下次有此頁(yè)面進(jìn)入時(shí) 便不用再次登陸了
package org.easybooks.test.model.vo;

public class UserTable {
    //屬性
    private Integer id;
    private String username;
    private String password;

    //屬性id 的 get/set方法
    public Integer getId(){
        return this.id;
    }
    public void setId(Integer id){
        this.id = id;
    }
    //屬性u(píng)sername的set/get方法
    public String getUsername(){
        return username;
    }
    public void setUsername(String username){
        this.username = username;
    }
    //屬性password的set/get方法
    public String getPassword(){
        return this.password;
    }
    public void setPassword(String password){
        this.password = password;
    }
}

用來(lái)操作數(shù)據(jù)庫(kù)的jdbc類
package org.easybooks.test.jdbc;
import java.sql.*;
public class SqlSrvDBConn {
//    public static void main(String[] argv){  debug用
//        SqlSrvDBConn sqlSrvDBConn = new SqlSrvDBConn();
//        String sql = "select * from usertable";
//        sqlSrvDBConn.executeQuery(sql);
//        ResultSet rs = sqlSrvDBConn.rs;
//        if(sqlSrvDBConn.conn==null) {
//            System.out.println("Conn is null");
//        }
//        if(rs==null){
//            System.out.println("Error");
//            return ;
//        }
//        try{
//            while(rs.next()){
//                System.out.println(rs.getString("username"));
//            }
//        }catch(SQLException e){
//            System.out.println(e.getMessage());
//        }
//    }
    private Statement stmt;
    private Connection conn;
    public ResultSet rs;
    //在構(gòu)造方法中創(chuàng)建數(shù)據(jù)庫(kù)連接
    public SqlSrvDBConn(){
        stmt = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(Exception e){
            System.out.println("Class is error");
        }
        try{
            String uri = "jdbc:mysql://localhost:3306/test?useSSL=true";
            String user = "host";
            String password = "HanDong85";
            conn = DriverManager.getConnection(uri,user,password);
        }catch(Exception e){
            System.out.println("Connection happened error");
            e.printStackTrace();
        }
    }

    public ResultSet executeQuery(String sql){
        try{
//            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
        }catch(SQLException e){
            System.out.println("Data.executeQuery:"+e.getMessage());
        }
        return rs;
    }
    //關(guān)閉 對(duì)象
    public void closeStmt(){
        try{
            stmt.close();
        }catch(SQLException e){
            System.out.println("38行出錯(cuò)啦!!!!");
            System.out.println("Data.executeQuery:"+e.getMessage());
        }
    }

    public void closeConn(){
        try{
            conn.close();
        }catch(SQLException e){
            System.out.println("Data.executeQuery:"+e.getMessage());
        }
    }
}

如果正確 則轉(zhuǎn)向main.jsp 此時(shí)便可調(diào)用之前設(shè)為User屬性的session了
<%--
  Created by IntelliJ IDEA.
  User: FX50J
  Date: 2018/1/17
  Time: 17:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>留言信息板</title>
</head>
<body>
    <%out.print(request.getParameter("username"));%>,你好!歡迎登陸留言板.
</body>
</html>

信息錯(cuò)誤 則轉(zhuǎn)向此頁(yè)
<%--
  Created by IntelliJ IDEA.
  User: FX50J
  Date: 2018/1/17
  Time: 17:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>出錯(cuò)</title>
</head>
<body>
    登錄失敗!單擊<a href="login.jsp">這里</a>返回
</body>
</html>
login頁(yè)面
如果成功則轉(zhuǎn)向此頁(yè)面

后退刷新頁(yè)面


測(cè)試session

點(diǎn)擊登陸

同樣結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喜最,隨后出現(xiàn)的幾起案子庄蹋,更是在濱河造成了極大的恐慌限书,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件能真,死亡現(xiàn)場(chǎng)離奇詭異粉铐,居然都是意外死亡卤档,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門劝枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舔腾,“玉大人,你說(shuō)我怎么就攤上這事载荔〔商遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵工扎,是天一觀的道長(zhǎng)肢娘。 經(jīng)常有香客問(wèn)我橱健,道長(zhǎng)沙廉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任珊皿,我火速辦了婚禮蟋定,結(jié)果婚禮上草添,老公的妹妹穿的比我還像新娘果元。我一直安慰自己,他們只是感情好而晒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布倡怎。 她就那樣靜靜地躺著,像睡著了一般颤专。 火紅的嫁衣襯著肌膚如雪钠乏。 梳的紋絲不亂的頭發(fā)上晓避,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音暑塑,去河邊找鬼。 笑死惕艳,一個(gè)胖子當(dāng)著我的面吹牛远搪,可吹牛的內(nèi)容都是我干的逢捺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柠新!你這毒婦竟也來(lái)了恨憎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓤荔,失蹤者是張志新(化名)和其女友劉穎输硝,沒(méi)想到半個(gè)月后点把,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屿附,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褒翰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年优训,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伦吠,死狀恐怖毛仪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腺逛,我是刑警寧澤衡怀,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布抛杨,位于F島的核電站怖现,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏潘拨。R本人自食惡果不足惜铁追,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一脂信、第九天 我趴在偏房一處隱蔽的房頂上張望狰闪。 院中可真熱鬧埋泵,春花似錦、人聲如沸礁蔗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至徒坡,卻和暖如春撕氧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喇完。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工伦泥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锦溪。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓不脯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刻诊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跨新,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容