iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
0
自我挑戰組

30 days JSP & Servlet學習紀錄 系列 第 9

[Day 9 ] ServletConfig & ServletContent - part2

前言

今天就來針對前幾天所提到的的東西
加上預設參數的機制
分別使用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/
    http://ithelp.ithome.com.tw/upload/images/20161209/20103425QtI156azbr.png

    輸入正確的帳號密碼後
    這次的修改會將user name帶出來
    http://ithelp.ithome.com.tw/upload/images/20161209/20103425wNhluzGNZ9.png

    如果是輸入錯誤的帳號密碼
    則會導到錯誤頁面
    http://ithelp.ithome.com.tw/upload/images/20161209/20103425pCw42Mgpzi.png

    http://ithelp.ithome.com.tw/upload/images/20161209/20103425fAbAXii1Dn.png

    在錯誤頁面點選按鈕,即回到login
    http://ithelp.ithome.com.tw/upload/images/20161209/20103425AcbeUIwTmm.png


小結

這個練習用到前幾天提到的一些method
最後的地方在登入錯誤回到登入頁
因為在web.xml裡面設定了url-pattern
所以URL被我轉成home了
但呼叫的方式還是使用doGet(),參數還是會顯示在URL上
一般應該是不會去用到GET呼叫才是

以及通常不會把帳號密碼設定在預設參數裡
一般都是寫在DB
但在這裡就先當作練習,之後再對此作擴充修改


上一篇
[Day 8] ServletConfig & ServletContent - part1
下一篇
[Day 10] Listener 偵聽器
系列文
30 days JSP & Servlet學習紀錄 30

尚未有邦友留言

立即登入留言