MVC工程開發(fā)

JAVA后臺

  • servlet(控制器)

  • service(服務邏輯)

  • dao(數(shù)據(jù)查詢)

  • utils(工具類)

  • entity(實體類Bean)

servlet

控制器扼雏、過濾器等

主要用于進行頁面數(shù)據(jù)轉(zhuǎn)發(fā)涛漂,定向頁面

  • 配置url

1摆马、通過注釋定義路徑

@WebServlet("/servletname")

2、通過web.xml

<servlet>
      <servlet-name>UserServlet</servlet-name>
      <servlet-class>com.igeek.shop.web.servlet.UserServlet</servlet-class>
</servlet>

<servlet-mapping>
      <servlet-name>UserServlet</servlet-name>
      <url-pattern>/user</url-pattern>
</servlet-mapping>
  • Servlet內(nèi)容

繼承HttpServlet
public class UserServlet extends HttpServlet 
  • 一般只需重寫doGet和doPost方法
  • url訪問方式 - get|post請求
  • 在一個方法中調(diào)用另一個方法 - 只需在一個方法中可實現(xiàn)所有操作

一個對象對應一個Servlet - 區(qū)分不同的操作
例如地址中的method使用不同關鍵字唤崭,使用“聘惦?”分割:
url?method=login | reg | logout

  • doGet/doPost內(nèi)容

如果有使用中文的情況記得設置中文參數(shù)數(shù)據(jù)的編碼方式

request.setCharacterEncoding("UTF-8");
  • 獲取請求request參數(shù)數(shù)據(jù) - 區(qū)分不同操作

//以登陸作為示例
String method = request.getParameter("method");
                                    //取出request中method后數(shù)據(jù) 
        if("login".equals(method)) {            //對數(shù)據(jù)進行判斷以確定其流向
            login(request, response);
        } else if("reg".equals(method)) {
            reg(request, response);
        }
  • 構造login函數(shù)

private UserService userService = new UserService();//定義service類對象
protected void login(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        //2:獲取請求request參數(shù)數(shù)據(jù)        
                //?拼接參數(shù)數(shù)據(jù)    form表單中參數(shù)數(shù)據(jù)
        String userAccount = request.getParameter("userAccount");
        String password = request.getParameter("password");

         //3: 把數(shù)據(jù)帶至數(shù)據(jù)庫端實現(xiàn)數(shù)據(jù)操作   -  調(diào)用Service業(yè)務層對應的方法
        //System.out.println(userAccount + "\t" + password); 
        User user = userService.login(userAccount, password);//返回user對象
    }
  • Service內(nèi)容

  • Service - 業(yè)務

  • 對象操作方法
  • 后臺驗證(金融锦援、保險...)
  • 邏輯處理
  • 調(diào)用數(shù)據(jù)庫層 - 實現(xiàn)數(shù)據(jù)具體操作
public class UserService {

    private UserDao userDao = new UserDao();//定義數(shù)據(jù)層對象
    
    public Userlogin(String userAccount, String password) {
        //4: 調(diào)用Dao數(shù)據(jù)層 - 實現(xiàn)數(shù)據(jù)庫操作
        return userDao.login(userAccount, password);
    }   
}
  • dao內(nèi)容

通過調(diào)用utils中的工具類,實現(xiàn)對應數(shù)據(jù)庫中數(shù)據(jù)操作

public class UserDao {

    public Userlogin(String userAccount, String password) {
        Connection con = DBUtil.getConnection();//工具類utiles中方法--連接數(shù)據(jù)庫
        PreparedStatement stmt = null;//初始化查詢語句
        ResultSet rs = null;
        User user = null;
        //5: 定義出sql語句
        String sql = "select * from user where userName = ? and password = md5(?)";
        try {
            stmt = con.prepareStatement(sql);       //Connection獲取語句處理
            //若sql中有?參數(shù)  - 設置?對應的數(shù)據(jù)    setType(index, value)  index - 從1開始
            stmt.setString(1, userAccount);
            stmt.setString(2, password);
            
            /*
             * 執(zhí)行ARUD   
             *  executeQuery()   -  select  
             *  executeUpdate()  -  insert湖笨、 update旗扑、 delete
             */
            rs = stmt.executeQuery();
            
            /*
             * 對查詢的結果處理 - 數(shù)據(jù)封裝為對象       
             *  rs.next()   - boolean
             *  rs.getType(index|列名)
             */
            if(rs.next()) {
                user = new User();
                user.setUserId(rs.getInt("userid"));    //結果集處理 - 每個列數(shù)據(jù)封裝至對象
                user.setUserName(rs.getString(2));
                user.setSex(rs.getString("sex"));
                user.setEmail(rs.getString("email"));
                user.setName(rs.getString("name"));
                user.setBirthDay(rs.getDate("birthDay"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {     //關閉數(shù)據(jù)庫相關操作
            DBUtil.allClose(rs, stmt, con); 
        }
        return user;
    }
    
}
  • 工具類

兩種方法
JDBC - API
  • 物理連接操作
  • 加載數(shù)據(jù)庫驅(qū)動jar - 拷貝至WEB-INF/lib中
  • 加載驅(qū)動程序類
  • DriverManager.getConection()
  • 關閉相關操作
數(shù)據(jù)庫連接池
public class DBUtil {

    private static Connection connection;
//jdbc方法    
//  public static Connection getConnection() {
//      try {
//          Class.forName("com.mysql.jdbc.Driver");
//          connection = DriverManager.getConnection("jdbc:mysql://192.168.12.2:3306/ebuy", 
//                                                   "igeek", "igeek");
//      } catch (ClassNotFoundException e) {
//          e.printStackTrace();
//      } catch (SQLException e) {
//          e.printStackTrace();
//      }
//      return connection;
//  }
    
    private static DataSource dataSource=null;
    static{
        dataSource = new ComboPooledDataSource("mysql");        
                                //讀取配置文件 - 讀取mysql相關配置
    }
    
    /**
     * 獲取數(shù)據(jù)庫連接
     * @return
     */
    public static Connection getConnection(){
        try {
            connection = dataSource.getConnection();        //獲取連接池中的一個連接
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    
    /**
     * 關閉數(shù)據(jù)庫相關操作
     *  ResultSet - select查詢的結果集
     *  PreparedStatement   - 語句處理  java語句轉(zhuǎn)換為數(shù)據(jù)庫中可執(zhí)行的sql語句
     */
    public static void allClose(ResultSet rs, PreparedStatement stmt, Connection con) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
}
  • entity類(Bean實體)

  • Java實體對象 - 表
  • JavaBean定義
  • private的屬性 + setter與getter方法
  • 無參構造器
  • 實現(xiàn)序列化 - 給定唯一系列化UID
  • 網(wǎng)絡、文件傳遞存儲對象
public class User implements Serializable {

    private static final long serialVersionUID = 1520708863050632827L;
    private int userId;
    private String userName;        //用戶名
    private String password;
    private String sex;
    private String email;
    private String name;            //姓名
    private Date birthDay;

          //Get和Set方法省略
}
  • Servlet對查詢回傳數(shù)據(jù)進行處理

    protected void login(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        ........
        //6:對返回的結果進行處理 - 依據(jù)流向  - 跳轉(zhuǎn)至下一個顯示頁面
        if(user == null) {  //用戶名或密碼錯誤
            /*
             * 傳遞頁面所需數(shù)據(jù)
             *  request  -  數(shù)據(jù)只在下一個頁面中使用  - 必須結合forward跳轉(zhuǎn)
             *  session  
             *      setAttribute("name", value)
             */
            request.setAttribute("info", "用戶名或密碼錯誤!"); 
            //跳轉(zhuǎn)至下一個url對應的頁面
            request.getRequestDispatcher("/login.jsp").forward(request, response); 
        } else {
            /*
             * 數(shù)據(jù)在多個頁面中使用
             *  session - 當前用戶  - 跨頁面數(shù)據(jù)傳遞
             */
            HttpSession sesison = request.getSession();
            sesison.setAttribute("user", user); 
            
            //無request傳遞數(shù)據(jù) - 都可以
//          request.getRequestDispatcher("/index.jsp").forward(request, response); 
            response.sendRedirect(request.getServletContext().getContextPath() + "/index.jsp");     
                                  //    登陸成功跳轉(zhuǎn)至主頁面
        }
    }
  • 頁面回收Info信息并顯示錯誤

<div class="col-sm-6" id="logintip" style="color: red; font-size: 13px;">
    <%-- 
          %= 對象不存在顯示
          nullEL表達式顯示空
    --%>
    &nbsp;${requestScope.info}
</div>
  • EL表達式

<%-- Jsp注釋 - 即可注釋java部分也可注釋html部分 
    
      ${內(nèi)置對象.name}
        requestScope
        sessionScope    -  獲取servlet傳遞的setAttribute的數(shù)據(jù)
                
                若name的值為基本類型或String  - 直接 內(nèi)置對象.name
                若name的值為實體對象   內(nèi)置對象.name.屬性
            
        pageContext -  獲取jsp內(nèi)置對象
                ${pageContext.request.contextPath}    web上下文 /項目名稱
 --%>

源碼:
鏈接: https://pan.baidu.com/s/17FPGWghph1qkNZiPn_6uIA 密碼: teje

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慈省,一起剝皮案震驚了整個濱河市臀防,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辫呻,老刑警劉巖清钥,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異放闺,居然都是意外死亡祟昭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門怖侦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篡悟,“玉大人,你說我怎么就攤上這事匾寝“嵩幔” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵艳悔,是天一觀的道長急凰。 經(jīng)常有香客問我,道長猜年,這世上最難降的妖魔是什么抡锈? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任疾忍,我火速辦了婚禮,結果婚禮上床三,老公的妹妹穿的比我還像新娘一罩。我一直安慰自己,他們只是感情好撇簿,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布聂渊。 她就那樣靜靜地躺著,像睡著了一般四瘫。 火紅的嫁衣襯著肌膚如雪汉嗽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天莲组,我揣著相機與錄音诊胞,去河邊找鬼。 笑死锹杈,一個胖子當著我的面吹牛撵孤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竭望,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼邪码,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咬清?” 一聲冷哼從身側響起闭专,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旧烧,沒想到半個月后影钉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡掘剪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年平委,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夺谁。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡廉赔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匾鸥,到底是詐尸還是另有隱情蜡塌,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布勿负,位于F島的核電站馏艾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琅摩,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一厚者、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迫吐,春花似錦、人聲如沸账忘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳖擒。三九已至溉浙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒋荚,已是汗流浹背戳稽。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留期升,地道東北人惊奇。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像播赁,于是被迫代替她去往敵國和親颂郎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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