首先我們來理清一些概念吧:

DAO(Data Access Object):主要對(duì)數(shù)據(jù)的操作,增加" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > Web開發(fā)模式【Mode I 和Mode II的介紹、應(yīng)用案例】

Web開發(fā)模式【Mode I 和Mode II的介紹、應(yīng)用案例】

時(shí)間:2023-05-31 03:57:01 | 來源:網(wǎng)站運(yùn)營

時(shí)間:2023-05-31 03:57:01 來源:網(wǎng)站運(yùn)營

Web開發(fā)模式【Mode I 和Mode II的介紹、應(yīng)用案例】:

開發(fā)模式的介紹

在Web開發(fā)模式中,有兩個(gè)主要的開發(fā)結(jié)構(gòu),稱為模式一(Mode I)和模式二(Mode II).

首先我們來理清一些概念吧:

模式一

模式一指的就是在開發(fā)中將顯示層、控制層、數(shù)據(jù)層的操作統(tǒng)一交給JSP或者JavaBean來進(jìn)行處理

模式一有兩種情況:

  1. 開發(fā)速度賊快,只要寫JSP就行了,JavaBean和Servlet都不用設(shè)計(jì)!
  2. 小幅度修改代碼方便,直接修改JSP頁面交給WEB容器就行了,不像Servlet還要編譯成.class文件再交給服務(wù)器!【當(dāng)然了,在ide下開發(fā)這個(gè)也不算是事】



  1. 程序的可讀性差、復(fù)用性低、代碼復(fù)雜!什么jsp代碼、html代碼都往上面寫,這肯定很難閱讀,很難重用!






  1. 程序的可讀性較高,大部分的代碼都寫在JavaBean上,不會(huì)和HTML代碼混合在一起,可讀性還行的。
  2. 可重復(fù)利用高,核心的代碼都由JavaBean開發(fā)了,JavaBean的設(shè)計(jì)就是用來重用、封裝,大大減少編寫重復(fù)代碼的工作!



  1. 沒有流程控制,程序中的JSP頁面都需要檢查請(qǐng)求的參數(shù)是否正確,異常發(fā)生時(shí)的處理。顯示操作和業(yè)務(wù)邏輯代碼工作會(huì)緊密耦合在一起的!日后維護(hù)會(huì)困難






應(yīng)用例子:

我們使用JavaBean+JSP開發(fā)一個(gè)簡易的計(jì)算器吧,效果如圖下



















public class Calculator { private double firstNum; private double secondNum; private char Operator = '+'; private double result; //JavaBean提供了計(jì)算的功能 public void calculate() { switch (this.Operator) { case '+': this.result = this.firstNum + this.secondNum; break; case '-': this.result = this.firstNum - this.secondNum; break; case '*': this.result = this.firstNum * this.secondNum; break; case '/': if (this.secondNum == 0) { throw new RuntimeException("除數(shù)不能為0"); } this.result = this.firstNum / this.secondNum; break; default: throw new RuntimeException("傳入的字符非法!"); } } public double getFirstNum() { return firstNum; } public void setFirstNum(double firstNum) { this.firstNum = firstNum; } public double getSecondNum() { return secondNum; } public void setSecondNum(double secondNum) { this.secondNum = secondNum; } public char getOperator() { return Operator; } public void setOperator(char operator) { Operator = operator; } public double getResult() { return result; } public void setResult(double result) { this.result = result; } } <%--開發(fā)用戶界面--%> <form action="/zhongfucheng/1.jsp" method="post"> <table border="1"> <tr> <td colspan="2">簡單計(jì)數(shù)器</td> <td></td> </tr> <tr> <td>第一個(gè)參數(shù):</td> <td><input type="text" name="firstNum"></td> </tr> <tr> <td>運(yùn)算符</td> <td> <select name="operator"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> </td> </tr> <tr> <td>第二個(gè)參數(shù):</td> <td><input type="text " name="secondNum"></td> </tr> <tr> <td colspan="2"><input type="submit" value="提交"></td> <td></td> </tr> </table> </form>











<%--獲取得到Bean對(duì)象--%> <jsp:useBean id="calculator" class="domain.Calculator" scope="page"/> <%--設(shè)置Bean對(duì)象的數(shù)據(jù)--%> <jsp:setProperty name="calculator" property="*"/> <%--調(diào)用Caculator的方法計(jì)算出值--%> <jsp:scriptlet> calculator.calculate(); </jsp:scriptlet> <%--得出的結(jié)果:--%> <c:out value="計(jì)算得出的結(jié)果是:"/> <jsp:getProperty name="calculator" property="firstNum"/> <jsp:getProperty name="calculator" property="operator"/> <jsp:getProperty name="calculator" property="secondNum"/> <c:out value="="/> <jsp:getProperty name="calculator" property="result"/>











開發(fā)這個(gè)簡易的計(jì)算器,只用了一個(gè)JSP頁面和一個(gè)JavaBean完成!

總的來說,Mode I 適合小型的開發(fā),復(fù)雜程序低的開發(fā),因?yàn)镸ode I 的特點(diǎn)就是開發(fā)速度快,但在進(jìn)行維護(hù)的時(shí)候就要付出更大的代價(jià)!

模式二

Mode II 中所有的開發(fā)都是以Servlet為主體展開的,由Servlet接收所有的客戶端請(qǐng)求,然后根據(jù)請(qǐng)求調(diào)用相對(duì)應(yīng)的JavaBean,并所有的顯示結(jié)果交給JSP完成!,也就是俗稱的MVC設(shè)計(jì)模式!













MVC設(shè)計(jì)模式:

應(yīng)用例子:

我們使用MVC模式開發(fā)一個(gè)簡單的用戶登陸注冊的案例吧!作為一個(gè)簡單的用戶登陸注冊,這里就直接使用XML文檔當(dāng)作小型數(shù)據(jù)庫吧!

①搭建開發(fā)環(huán)境













②開發(fā)實(shí)體User

private int id; private String username; private String password; private String email; private Date birthday; //....各種setter、getter

③開發(fā)dao

//外界傳遞用戶名和密碼進(jìn)來,我要在XML文檔中查找是否有該條記錄 public User find(String username, String password) { //得到XML文檔的流對(duì)象 InputStream inputStream = UserImplXML.class.getClassLoader().getResourceAsStream("user.xml"); //得到dom4j的解析器對(duì)象 SAXReader saxReader = new SAXReader(); try { //解析XML文檔 Document document = saxReader.read(path); //使用XPATH技術(shù),查找XML文檔中是否有傳遞進(jìn)來的username和password Element element = (Element) document.selectSingleNode("//user[@username='" + username + "' and@password='" + password + "']"); if (element == null) { return null; } //如果有,就把XML查出來的節(jié)點(diǎn)信息封裝到User對(duì)象,返回出去 User user = new User(); user.setId(Integer.parseInt(element.attributeValue("id"))); user.setUsername(element.attributeValue("username")); user.setPassword(element.attributeValue("password")); user.setEmail(element.attributeValue("email")); //生日就需要轉(zhuǎn)換一下了,XML文檔保存的是字符串,User對(duì)象需要的是Date類型 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd"); Date birthday = simpleDateFormat.parse(element.attributeValue("birthday")); user.setBirthday(birthday); //返回User對(duì)象出去 return user; } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException("初始化時(shí)候出錯(cuò)啦!"); } catch (ParseException e) { e.printStackTrace(); throw new RuntimeException("查詢的時(shí)候出錯(cuò)啦!"); } } private String username = "zhongfucheng"; private String password = "123"; @Test public void testLogin() { UserImplXML userImplXML = new UserImplXML(); User user = userImplXML.find(username, password); System.out.println(user.getBirthday()); System.out.println(user.getEmail()); System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); }











3.2注冊功能

//注冊功能,外界傳遞一個(gè)User對(duì)象進(jìn)來。我就在XML文檔中添加一條信息 public void register(User user) { //獲取XML文檔路徑! String path = UserImplXML.class.getClassLoader().getResource("user.xml").getPath(); try { //獲取dom4j的解析器,解析XML文檔 SAXReader saxReader = new SAXReader(); Document document = saxReader.read(path); //在XML文檔中創(chuàng)建新的節(jié)點(diǎn) Element newElement = DocumentHelper.createElement("user"); newElement.addAttribute("id", String.valueOf(user.getId())); newElement.addAttribute("username", user.getUsername()); newElement.addAttribute("email", user.getEmail()); newElement.addAttribute("password", user.getPassword()); //日期返回的是指定格式的日期 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd"); String date = simpleDateFormat.format(user.getBirthday()); newElement.addAttribute("birthday",date); //把新創(chuàng)建的節(jié)點(diǎn)增加到父節(jié)點(diǎn)上 document.getRootElement().add(newElement); //把XML內(nèi)容中文檔的內(nèi)容寫到硬盤文件上 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("UTF-8"); XMLWriter xmlWriter = new XMLWriter(new FileWriter(path),outputFormat); xmlWriter.write(document); xmlWriter.close(); } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException("注冊的時(shí)候出錯(cuò)了?。?!"); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("注冊的時(shí)候出錯(cuò)了?。?!"); } } @Test public void testRegister() { UserImplXML userImplXML = new UserImplXML(); //這里我為了測試的方便,就添加一個(gè)帶5個(gè)參數(shù)的構(gòu)造函數(shù)了! User user = new User(10, "nihao", "123", "sina@qq.com", new Date()); userImplXML.register(user); }


























④開發(fā)service層

service層的開發(fā)就非常簡單了!上面已經(jīng)說了,service層就是:將多個(gè)原子性的DAO操作進(jìn)行組合,組合成一個(gè)完整的業(yè)務(wù)邏輯。簡單來說:對(duì)web層提供所有的業(yè)務(wù)服務(wù)的!

在邏輯代碼不是非常復(fù)雜的情況下,我們可以沒有service層的,這里還是演示一下吧!

public class UserServiceXML { //Service層就是調(diào)用Dao層的方法,我們就直接在類中創(chuàng)建Dao層的對(duì)象了 UserDao userImplXML = new UserImplXML(); public void register(User user) { userImplXML.register(user); } public void login(String username, String password) { userImplXML.find(username, password); } }











⑤開發(fā)web層

5.1我們來先做注冊的界面吧!

public class RegisterUIServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { //直接跳轉(zhuǎn)到顯示注冊界面的JSP request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { this.doPost(request, response); } }<h1>歡迎來到注冊界面!</h1><%--提交給處理注冊的處理Servlet--%><form method="post" action="${pageContext.request.contextPath}/RegisterServlet"> <table> <%--對(duì)于id來講,是服務(wù)器分配的!不需要用戶自己輸入--%> <tr> <td>用戶名</td> <td> <input type="text " name="username"> </td> </tr> <tr> <td>密碼</td> <td> <input type="text" name="password"> </td> </tr> <tr> <td>確認(rèn)密碼</td> <td> <input type="text" name="password"> </td> </tr> <tr> <td>郵箱</td> <td> <input type="text" name="email"> </td> </tr> <tr> <td>生日</td> <td> <input type="text " name="birethday"> </td> </tr> <tr> <td> <input type="submit" value="提交"> </td> <td> <input type="reset" value="重置!"> </td> </tr> </table></form>











//首先要接受Parameter的參數(shù),封裝到User里面去 String username = request.getParameter("username"); String password = request.getParameter("password"); //......如果參數(shù)過多,我們就要寫好多好多類似的代碼了...


/* * 將Parameter參數(shù)的數(shù)據(jù)封裝到Bean中,為了外邊不用強(qiáng)轉(zhuǎn),這里就使用泛型了! * * @request 由于要獲取的是Parameter參數(shù)的信息,所以需要有request對(duì)象 * @tClass 本身是不知道封裝什么對(duì)象的,所以用class * * */ public static <T> T request2Bean(HttpServletRequest httpServletRequest, Class<T> tClass) { try { //創(chuàng)建tClass的對(duì)象 T bean = tClass.newInstance(); //獲取得到Parameter中全部的參數(shù)的名字 Enumeration enumeration = httpServletRequest.getParameterNames(); //遍歷上邊獲取得到的集合 while (enumeration.hasMoreElements()) { //獲取得到每一個(gè)帶過來參數(shù)的名字 String name = (String) enumeration.nextElement(); //獲取得到值 String value = httpServletRequest.getParameter(name); //把數(shù)據(jù)封裝到Bean對(duì)象中 BeanUtils.setProperty(bean, name, value); } return bean; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("封裝數(shù)據(jù)到Bean對(duì)象中出錯(cuò)了!"); } }











//日期轉(zhuǎn)換器 ConvertUtils.register(new DateLocaleConverter(), Date.class); /*生成ID*/ public static int makeId() { return Integer.parseInt(UUID.randomUUID().toString()); }User user = WebUtils.request2Bean(request, User.class); user.setId(WebUtils.makeId()); //調(diào)用service層的注冊方法,實(shí)現(xiàn)注冊 ServiceBussiness serviceBussiness = new UserServiceXML(); serviceBussiness.register(user);











上面的代碼是不夠完善的(沒有校驗(yàn)用戶輸入的信息、注冊成功或失敗都沒有給出提示..等等)

public class FormBean { //表單提交過來的數(shù)據(jù)全都是String類型的,birthday也不例外! private String username; private String password; private String password2; private String email; private String birthday; /*用于判斷表單提交過來的數(shù)據(jù)是否合法*/ public boolean validate() { return false; } //......各種setter、getter方法}











public boolean validate() { //用戶名不能為空,并且要是3-8的字符 abcdABcd if (this.username == null || this.username.trim().equals("")) { return false; } else { if (!this.username.matches("[a-zA-Z]{3,8}")) { return false; } } //密碼不能為空,并且要是3-8的數(shù)字 if (this.password == null || this.password.trim().equals("")) { return false; } else { if (!this.password.matches("//d{3,8}")) { return false; } } //兩次密碼要一致 if (this.password2 != null && !this.password2.trim().equals("")) { if (!this.password2.equals(this.password)) { return false; } } //郵箱可以為空,如果為空就必須合法 if (this.email != null && !this.email.trim().equals("")) { if (!this.email.matches("//w+@//w+(//.//w+)+")) { System.out.println("郵箱錯(cuò)誤了!"); return false; } } //日期可以為空,如果為空就必須合法 if (this.birthday != null && !this.birthday.trim().equals("")) { try { DateLocaleConverter dateLocaleConverter = new DateLocaleConverter(); dateLocaleConverter.convert(this.birthday); } catch (Exception e) { System.out.println("日期錯(cuò)誤了!"); return false; } } //如果上面都沒有執(zhí)行,那么就是合法的了,返回true return true; } //將表單的數(shù)據(jù)封裝到formBean中 FormBean formBean = WebUtils.request2Bean(request, FormBean.class); //驗(yàn)證表單的數(shù)據(jù)是否合法,如果不合法就跳轉(zhuǎn)回去注冊的頁面 if(formBean.validate()==false){ request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); return; } try { //將表單的數(shù)據(jù)封裝到User對(duì)象中 User user = WebUtils.request2Bean(request, User.class); user.setId(WebUtils.makeId()); //調(diào)用service層的注冊方法,實(shí)現(xiàn)注冊 ServiceBussiness serviceBussiness = new UserServiceXML(); serviceBussiness.register(user); } catch (Exception e) { e.printStackTrace(); }
































它拋出了錯(cuò)誤!原因也非常簡單:表單數(shù)據(jù)提交給Servlet,Servlet將表單的數(shù)據(jù)(Parameter中的數(shù)據(jù))用BeanUtils封裝到User對(duì)象中,當(dāng)封裝到日期的時(shí)候,發(fā)現(xiàn)日期為null,無法轉(zhuǎn)換成日期對(duì)象!

那我們現(xiàn)在要怎么解決呢?

首先我們要明確:因?yàn)?b>我們在設(shè)定的時(shí)候,已經(jīng)允許了email和birthday可以為空,那么在DAO層就應(yīng)該有相應(yīng)的邏輯判斷email和birthday是否為空!

if (user.getEmail() == null) { newElement.addAttribute("email", ""); } else { newElement.addAttribute("email", user.getEmail()); } //如果不是空才格式化信息 if (user.getBirthday() != null) { //日期返回的是指定格式的日期 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String date = simpleDateFormat.format(user.getBirthday()); newElement.addAttribute("birthday", date); } else { newElement.addAttribute("birthday", ""); }解決辦法:

public static <T> T request2Bean(HttpServletRequest httpServletRequest, Class<T> tClass) { try { //創(chuàng)建tClass的對(duì)象 T bean = tClass.newInstance(); //獲取得到Parameter中全部的參數(shù)的名字 Enumeration enumeration = httpServletRequest.getParameterNames(); //日期轉(zhuǎn)換器 ConvertUtils.register(new DateLocaleConverter(), Date.class); //遍歷上邊獲取得到的集合 while (enumeration.hasMoreElements()) { //獲取得到每一個(gè)帶過來參數(shù)的名字 String name = (String) enumeration.nextElement(); //獲取得到值 String value = httpServletRequest.getParameter(name); //如果Parameter中的數(shù)據(jù)為"",那么我就不封裝到User對(duì)象里邊去!執(zhí)行下一次循環(huán) if (value == "") { continue; } else { //把數(shù)據(jù)封裝到Bean對(duì)象中 BeanUtils.setProperty(bean, name, value); } } return bean; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("封裝數(shù)據(jù)到Bean對(duì)象中出錯(cuò)了!"); } }

















將數(shù)據(jù)封裝到User對(duì)象中還有另外一個(gè)辦法:













//將表單的數(shù)據(jù)封裝到formBean中 FormBean formBean = WebUtils.request2Bean(request, FormBean.class); //驗(yàn)證表單的數(shù)據(jù)是否合法,如果不合法就跳轉(zhuǎn)回去注冊的頁面 if(formBean.validate()==false){ request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); return; } try { //這是第一種-------------------------- /*User user = new User(); user.setId(WebUtils.makeId()); BeanUtils.copyProperties(user,formBean);*/ //------------------------------------------ //這是第二種 User user1 = WebUtils.request2Bean(request,User.class); user1.setId(WebUtils.makeId()); //----------------------------------- //調(diào)用service層的注冊方法,實(shí)現(xiàn)注冊 ServiceBussiness serviceBussiness = new UserServiceXML(); serviceBussiness.register(user1); } catch (Exception e) { e.printStackTrace(); }現(xiàn)在還有問題,如果我填寫信息不合法,提交給服務(wù)器驗(yàn)證以后,服務(wù)器應(yīng)該告訴用戶哪個(gè)信息不合法,而不是直接把跳轉(zhuǎn)回注冊界面,把所有的信息全部清空,讓用戶重新填寫!













我們應(yīng)該這樣做:當(dāng)發(fā)現(xiàn)用戶輸入的信息不合法時(shí),把錯(cuò)誤的信息記錄下來,等到返回注冊頁面,就提示用戶哪里出錯(cuò)了!




//表單提交過來的數(shù)據(jù)全都是String類型的,birthday也不例外! private String username; private String password; private String password2; private String email; private String birthday; //記錄錯(cuò)誤的信息 private HashMap<String, String> error = new HashMap<>(); /*用于判斷表單提交過來的數(shù)據(jù)是否合法*/ public boolean validate() { //用戶名不能為空,并且要是3-8的字符 abcdABcd if (this.username == null || this.username.trim().equals("")) { error.put("username", "用戶名不能為空,并且要是3-8的字符"); return false; } else { if (!this.username.matches("[a-zA-Z]{3,8}")) { error.put("username", "用戶名不能為空,并且要是3-8的字符"); return false; } } //密碼不能為空,并且要是3-8的數(shù)字 if (this.password == null || this.password.trim().equals("")) { error.put("password", "密碼不能為空,并且要是3-8的數(shù)字"); return false; } else { if (!this.password.matches("//d{3,8}")) { error.put("password", "密碼不能為空,并且要是3-8的數(shù)字"); return false; } } //兩次密碼要一致 if (this.password2 != null && !this.password2.trim().equals("")) { if (!this.password2.equals(this.password)) { error.put("password2", "兩次密碼要一致"); return false; } } //郵箱可以為空,如果為空就必須合法 if (this.email != null && !this.email.trim().equals("")) { if (!this.email.matches("//w+@//w+(//.//w+)+")) { error.put("email", "郵箱不合法!"); return false; } } //日期可以為空,如果為空就必須合法 if (this.birthday != null && !this.birthday.trim().equals("")) { try { DateLocaleConverter dateLocaleConverter = new DateLocaleConverter(); dateLocaleConverter.convert(this.birthday); } catch (Exception e) { error.put("birthday", "日期不合法!"); return false; } } //如果上面都沒有執(zhí)行,那么就是合法的了,返回true return true; } //.....各種的setter和getter
  • 在跳轉(zhuǎn)到注冊頁面之前,把formbean對(duì)象存到request域中。在注冊頁面就可以把錯(cuò)誤的信息取出來(使用EL表達(dá)式)!
  • 處理表單的Servlet的部分代碼
//驗(yàn)證表單的數(shù)據(jù)是否合法,如果不合法就跳轉(zhuǎn)回去注冊的頁面 if(formBean.validate()==false){ //在跳轉(zhuǎn)之前,把formbean對(duì)象傳遞給注冊頁面 request.setAttribute("formbean", formBean); request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); return; }
  • 在注冊頁面中,使用EL表達(dá)式把錯(cuò)誤的信息寫出來












  • 測試:












  • 效果:












做到這里,還是有丟丟的問題,我們不應(yīng)該把用戶輸入的數(shù)據(jù)全部清空的!你想想,如果用戶注冊需要輸入多個(gè)信息,僅僅一個(gè)出錯(cuò)了,就把全部信息清空,要他重新填寫,這樣是不合理的!

  • 我們在各個(gè)的輸入項(xiàng)中使用EL表達(dá)式回顯數(shù)據(jù)就行了!












  • 效果:












還沒有完善,細(xì)心的朋友可以發(fā)現(xiàn),上面圖的日期也是錯(cuò)誤的,但是沒一次性標(biāo)記出來給用戶!要改也十分簡單:在驗(yàn)證的時(shí)候,不要先急著return false 用一個(gè)布爾型變量記住,最后返回布爾型的變量即可













無論注冊成功還是失敗都需要給用戶一個(gè)友好界面的!













5.2登陸界面

登陸和注冊是類似的,我們按著注冊的步驟來寫就對(duì)了!

首先寫一個(gè)提供登陸界面的Servlet

//直接跳轉(zhuǎn)到登陸界面 request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
  • 寫登陸界面
<h1>這是登陸界面</h1><form action="${pageContext.request.contextPath}/LoginServlet" method="post"> <table> <tr> <td>用戶名</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密碼</td> <td><input type="password" name="password"></td> </tr> <tr> <td><input type="submit" value="提交"></td> <td><input type="reset" name="重置"></td> </tr> </table></form>
  • 寫處理登陸表單的Servlet
//獲取提交過來的數(shù)據(jù) String username = request.getParameter("username"); String password = request.getParameter("password"); //調(diào)用service層的方法,去查詢數(shù)據(jù)庫(XML)是否有該條記錄 try { ServiceBussiness serviceBussiness = new UserServiceXML(); User user = serviceBussiness.login(username, password); if (user == null) { request.setAttribute("message", "用戶名或密碼是錯(cuò)的"); } else { request.setAttribute("message","登陸成功"); } } catch (Exception e) { e.printStackTrace(); request.setAttribute("message","登陸失敗咯"); } request.getRequestDispatcher("/message.jsp").forward(request, response);
  • 效果:












5.3把注冊和登陸都掛在首頁上

<h1>這是首頁!</h1> <a href="${pageContext.request.contextPath}/LoginUIServlet">登陸</a> <a href="${pageContext.request.contextPath}/RegisterUIServlet">注冊</a> </body>











總結(jié)

  • 使用JSP+JavaBean開發(fā)一個(gè)簡單計(jì)算器,是非常容易的,顯示頁面和請(qǐng)求都是交由JSP來做。沒有什么新的知識(shí)點(diǎn),用一些JSP行為就能完成了。
  • MVC模式開發(fā)使用Servlet來做處理請(qǐng)求,代碼量略大,但層次清晰
  • 使用BeanUtils開發(fā)組件可以將request請(qǐng)求的參數(shù)封裝到JavaBean對(duì)象中,Date屬性要另外處理
  • 校驗(yàn)的功能也是使用一個(gè)JavaBean來完成,目的就是為了可重用性,職責(zé)分工。同時(shí),我們可以在該JavaBean設(shè)置一個(gè)Map集合來保存錯(cuò)誤的信息,以便在前臺(tái)上展示錯(cuò)誤信息。
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

關(guān)鍵詞:模式

74
73
25
news
  • 網(wǎng)站
  • 營銷
  • 設(shè)計(jì)
  • 運(yùn)營
  • 優(yōu)化
  • 效率
  • 專注
  • 電商
  • 方案
  • 推廣
為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉