<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                進行數據驗證前,我們先解決一個一直沒有影響我們編碼,但可能卻影響心情的小問題。 即沒有引用servlet而引發的錯誤警告: ![https://box.kancloud.cn/2b1e3c5689812d4b0fde5e7948da1294_1148x202.png](https://box.kancloud.cn/2b1e3c5689812d4b0fde5e7948da1294_1148x202.png) 該類為tomcat為我們提供的類,修復步驟如下: bulidpath -> config buildpath -> Libraries -> add Library... -> Server Runtime -> Apache Tomcat v7.0 -> finish -> ok。 這時候, 紅色的小叉叉應該沒有了。 <hr /> 下面,我們正式加入驗證信息。 流程圖如下: ![https://box.kancloud.cn/1702cc12ea19dbdc7877c15d7e87e0c4_690x1214.png](https://box.kancloud.cn/1702cc12ea19dbdc7877c15d7e87e0c4_690x1214.png) ## 定義出錯后的操作界面error jsp/teacher/error.jsp ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>驗證錯誤</title> </head> <body> <h2>驗證錯誤</h2> </body> </html> ``` ## 配置路由 假設我們為新增數據的保存操作進行驗證,則我們配置保存操作的路由: struts.xml ``` <!-- 保存數據 --> <action name="save" class="com.mengyunzhi.javaee.action.teacher.Save"> <!-- 設置V層,相對于WebContent的絕對路徑 --> <result name="success">/jsp/success.jsp</result> <result name="error">/jsp/error.jsp</result> <result name="input">/jsp/teacher/error.jsp</result> </action> ``` > 有人問為什么要使用input,而不用其它的呢。原因是因為大家都用input,所以我們也用input能夠更好的和其它軟件工程師交流。 ## 測試路由與V層 打開保存的類,然后注釋掉原返回值,新增返回input com.mengyunzhi.javaee.action.teacher SaveAction 我們對用戶名的長度進行規定,并在V層輸出我們返回的錯誤信息。 ``` ... // 錯誤信息 private String error; public String getError() { return error; } public String execute() { if (this.username.length() < 4) { error = "用戶名長度過短"; return input; } if (this.name.length() < 3) { error = "姓名長度過短"; return input; } ...... ``` ### V層顯示 ``` <h2>驗證錯誤</h2> <h3><s:property value="error" /></h3> ``` > V層只所以可以使用`error`這個變量,這由于在Action中,存在getError()方法. ### 測試: ![https://box.kancloud.cn/6d3afc94fe7944c8f031a27563ddd5fe_748x322.png](https://box.kancloud.cn/6d3afc94fe7944c8f031a27563ddd5fe_748x322.png) ## 增加多個驗證,并一次性輸出 流程圖如下: ![https://box.kancloud.cn/decfc0b2137185515cdfa7caef5f312b_364x624.png](https://box.kancloud.cn/decfc0b2137185515cdfa7caef5f312b_364x624.png) ### 觸發器 ``` ... public class SaveAction extends TeacherAction { ... if (username.length() < 4) { addActionError("用戶名長度過短"); } if (this.name.length() < 3) { addActionError("姓名長度過短"); } ... // 存在錯誤,則返回input if (hasActionErrors()) { return INPUT; } else { return SUCCESS; } ... ``` > 我們間接的繼承了`ActionSupport`,而`addActionError`等函數,則正是`ActionSupport`中的方法。 ### V層 ``` <h2>驗證錯誤</h2> <ul> <s:iterator value="actionErrors" var="actionError" status="status"> <li><s:property value="#actionError" /></li> </s:iterator> </ul> ``` ### 測試 ![https://box.kancloud.cn/a567b03ea8db1982b6769d082e8a6a1d_852x346.png](https://box.kancloud.cn/a567b03ea8db1982b6769d082e8a6a1d_852x346.png) 總結:我們可以在繼承ActionSupport后,很簡單的實現了字段的驗證,這在實際的開發中,也是必要的。 示例代碼如下: ``` package com.mengyunzhi.javaee.action.teacher; import java.util.Collection; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class SaveAction extends TeacherAction { /** * 創建時間:2017.1.16 */ private static final long serialVersionUID = 1L; private String username; private String password; private String sex; private String name; private String email; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } // 該execute方法將被自動調用, 方法的返回類型必須為String public String execute() { if (username.length() < 4) { addActionError("用戶名長度過短"); } if (this.name.length() < 3) { addActionError("姓名長度過短"); } // 實例化并加載數據庫配置文件 Configuration configuration = new Configuration().configure(); // 構造服務注冊對象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); // 創建會話工廠(session factory)) SessionFactory sessionFactory = configuration .buildSessionFactory(serviceRegistry); // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) Session session = sessionFactory.getCurrentSession(); // 開啟事務(使用緩沖池進行數據庫的連接) Transaction transaction = session.beginTransaction(); // 在這里,必須使用try catch finally語句。來確定會話正常關閉. // 否則,當操作數據庫產生錯誤時,你可能需要重啟mysql服務 try { // 初例化 賦值 com.mengyunzhi.javaee.entity.Teacher teacher = new com.mengyunzhi.javaee.entity.Teacher(); teacher.setName(name); teacher.setUsername(username); teacher.setEmail(email); teacher.setPassword(password); // 由于sex的類型是String對象,所以需要使用equals()來判等 if (sex.equals("0")) { teacher.setSex(false); } else { teacher.setSex(true); } session.save(teacher); // 提交事務 transaction.commit(); // 捕獲異常 } catch (HibernateException e) { } finally { // 如果session處于開啟狀態,則關閉session if (session.isOpen()) { // 關閉會話 session.close(); } } // 存在錯誤,則返回input if (hasActionErrors()) { return INPUT; } else { return SUCCESS; } } } ``` > 注意:上述代碼未重構,直接在C層調用實體層,是錯誤的做法。我們將在下一個班級管理中,對該方法進行重構. <hr /> 下面,我們共同看看Struts使用注解進行驗證的方法。 我們在前面學過了,數據由用戶發送的時候,直接調用了action類的setXXX方法,來進行賦值。Struts的驗證也是利用了這一點,在進行賦值時,進行驗證。如果正確的則正確執行,如果錯誤,則返回"input". 流程圖如下: ![https://box.kancloud.cn/9aa4c2d12384f92a242887264c9f935d_882x1516.png](https://box.kancloud.cn/9aa4c2d12384f92a242887264c9f935d_882x1516.png) # 內置驗證 首先,我們刪除在execute中用于驗證的代碼,并直接返回SUCCESS. 然后,我們在setName()、setUsername()方法上添加注解,來實現驗證. ``` ... @RequiredStringValidator( message="用戶名不能為空") @StringLengthFieldValidator( minLength="4", maxLength="8", trim=true, message="用戶名必須介于4-8之間") public void setUsername(String username) { this.username = username; } ... @RequiredStringValidator( message="姓名不能為空") @StringLengthFieldValidator( minLength="2", trim=true, message="姓名不能少于2位") public void setName(String name) { this.name = name; } ``` ## V層顯示錯誤信息 驗證字段產生的錯誤將自動存儲在`fieldErrors`中,該字段同樣位于`ActionSupport`中,同時為我們提供了`getFieldErrors`供我們在前臺調用。 ``` <ul> <!-- 循環輸出字段驗證發生的錯誤 --> <s:iterator value="fieldErrors" var="fieldError"> <li><s:property /></li> </s:iterator> </ul> ``` ![https://box.kancloud.cn/d6b30601c55ce08e2bca1a4dc1750cf2_722x348.png](https://box.kancloud.cn/d6b30601c55ce08e2bca1a4dc1750cf2_722x348.png) 不止如此,我們還可以使用struts的內置標簽來快捷的輸出錯誤: ``` <body> <h2>驗證錯誤</h2> <ul> <!-- 循環輸出字段驗證發生的錯誤 --> <s:iterator value="fieldErrors" var="fieldError"> <li><s:property /></li> </s:iterator> </ul> <!-- 使用struts內置標題輸出字段,將自動帶入出錯信息 --> <s:textfield label="姓名:" name="name" /> <br /> <s:textfield label="用戶名:" name="username" /> </body> ``` ![https://box.kancloud.cn/d63c34721992d581b49e4562e9c44e2c_814x476.png](https://box.kancloud.cn/d63c34721992d581b49e4562e9c44e2c_814x476.png) 好像,如果出現錯誤的話,應該再顯示add界面,并在add界面顯示錯誤吧。 <hr /> 沒錯,的確是這樣,現在,讓我們重構V層。 1. 修改路由 ``` <!-- 保存數據 --> <action name="save" class="com.mengyunzhi.javaee.action.teacher.Save"> <!-- 設置V層,相對于WebContent的絕對路徑 --> <result name="success">/jsp/success.jsp</result> <result name="error">/jsp/error.jsp</result> <result name="input">/jsp/teacher/add.jsp</result> </action> ``` 2. 重構add.jsp ``` <form action="save" method="post"> <s:textfield label="姓名:" name="name" /> <br /> <s:textfield label="用戶名:" name="username" /> <br /> 性別:<select name="sex"> <option value="0">男</option> <option value="1">女</option> </select> <br /> 郵箱:<input type="text" name="email" /><br /> 密碼:<input type="password" name="password" /><br /> <button type="submit">submit</button> </form> ``` 3. 刪除jsp/teacher/error.jsp ![https://box.kancloud.cn/d63c34721992d581b49e4562e9c44e2c_814x476.png](https://box.kancloud.cn/d63c34721992d581b49e4562e9c44e2c_814x476.png) 作業:驗證其它3個字段;增加udpate的驗證。 > 官方文檔:[http://127.0.0.1:8081/docs/validation.html](http://127.0.0.1:8081/docs/validation.html), [http://127.0.0.1:8081/docs/validation-annotation.html](http://127.0.0.1:8081/docs/validation-annotation.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看