今天就來針對前幾天所提到的的東西
加上預設參數的機制
分別使用INIT-PARAM 以及Context- Param去設定
這個練習先將正確的帳號及密碼使用ServletConfig寫在到web.xml裡面
在透過前端的key-in,讀取參數去判斷是否相符
若相符則導到JSP,錯誤的話則導到錯誤頁面
而因為錯誤訊息為公用的
所以在此將錯誤訊息用ServletContent
1.先加入INIT-PARAM參數
使用ServletConfig去做設定
將正確的帳號密碼設定在INIT-PARAM裡
web.xml
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.servlet.LoginServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>Zarek</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
注意這裡是寫在Servlet裡面
2.加入輸入錯誤的訊息(Context- Param)
web.xml
<context-param>
<param-name>ERROR</param-name>
<param-value>please check your account, thank you !</param-value>
</context-param>
</web-app>
這裡則是寫在web-app裡面
代表帳號密碼錯誤時要show什麼結果
3.新增一支Error JSP
新增一支JSP
如果帳號密碼錯誤時,則呼這支JSP
因為是ServletContent
所以在JSP可以直接使用
ErrorPage.jsp
<body>
<h1>
<%=request.getServletContext().getInitParameter("ERROR")%>.
</h1>
<form action='home'>
<input name="button" type="submit" id="button" value="Home">
</form>
</body>
直接在JSP裡面將錯誤訊息print出來
除了JSP特有的寫法
裡面的code和前幾天整理的寫法一樣
這裡多加一個button,並設定action name為home
然後在web.xnl在新增一組servlet-mapping
web.xml
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/home</url-pattern>
</servlet-mapping>
4.在Servlet裡判斷
接下來要在Servlet裡面取出JSP的資料
和web.xml裡面的比對
然後將頁面導到對應的JSP
取出參數
LoginServlet.xml
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//也可以在Servlet取出context-param,再由JSP取出
//String strError = getServletContext().getInitParameter("ERROR");
//JSP輸入的帳號密碼
String name = request.getParameter("name");
String password= request.getParameter("mypassword");
//init-paramn所設定的帳號密碼
String secretName = getServletConfig().getInitParameter("name");
String secretPassword = getInitParameter("password");
request.getParameter將JSP中input的name對應的名稱取出值
簡單說就是取出使用者輸入的內容
getServletConfig().getInitParameter或getInitParameter
取出INIT-PARAM所設定正確的帳號及密碼
判斷帳號密碼是否相同
LoginServlet.xml
if(secretName.equals(name) && secretPassword.equals(password) )
{
request.setAttribute("myname",name);
request.getRequestDispatcher("Index.jsp").forward(request, response);
return;
}
else
{
//也可以在Servlet取出context-param,再由JSP取出
//request.setAttribute("strMsg",strError);
request.getRequestDispatcher("ErrorPage.jsp").forward(request, response);
}
這裡的寫法其實都是前幾天提到的
如果帳號密碼相同,則在前端setAttribute讓JSP可以取出user輸入的名字
並使用getRequestDispatcher導到對應的JSP
如果不相同,直接導到錯誤頁面
也可以在Servlet設定
setAttribute一個新的strMsg,讓ErrorPage直接用
request.getAttribute("strMsg")去使用
重啟Server(Tomcat)
進入我們的登入頁
http://localhost:8080/MyFirstServlet/
輸入正確的帳號密碼後
這次的修改會將user name帶出來
如果是輸入錯誤的帳號密碼
則會導到錯誤頁面
在錯誤頁面點選按鈕,即回到login
這個練習用到前幾天提到的一些method
最後的地方在登入錯誤回到登入頁
因為在web.xml裡面設定了url-pattern
所以URL被我轉成home了
但呼叫的方式還是使用doGet(),參數還是會顯示在URL上
一般應該是不會去用到GET呼叫才是
以及通常不會把帳號密碼設定在預設參數裡
一般都是寫在DB
但在這裡就先當作練習,之後再對此作擴充修改
在練習時,LoginServlet中的annotation要註解掉,不然它會覆蓋掉在web.xml中的初始參數設定,造成LoginServlet中getInitParameter( )結果為null。
//@WebServlet("/LoginServlet")