J2EE Part 18

1.Servlet
參考 Java2 第22章之Sample2 ~ Sample 8
a. Sample2.3.5.6.html 會送出 get 或 post,由 Sample2.3.5.6.java 承接。
b. 在 doGet 後面加上另一個方法 doPost,如此不論前段的 HTML怎麼寫,接可承接二種方法。
c. 注意事項:
1.目錄和超連結的路徑要修改正確。
2.修改 *.html 檔案,網頁要重新整理。
3.只要有修改 *.java 檔案,就要重新編譯一次。然後再將  Tomcat 重新啟動或 reload。
課本範例Sample2.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Sample2 extends HttpServlet
{
   public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException
   {
      try{
         // 取得表單資料
         String tmp = request.getParameter("cars");
         String carname = new String(tmp.getBytes("ISO-8859-1"), "UTF-8");
         // 設定內容類型
         response.setContentType("text/html; charset=UTF-8");
         // 輸出HTML文件
         PrintWriter pw = response.getWriter();
         pw.println("<html>\n" +
                    "<head><title>\n" + carname + "</title></head>\n" +
                    "<body><center>\n" +
                    "<h2>\n" + carname + "</h2>\n" +
   "感謝您購買本公司的" + carname + "。<br/>\n" +
                    "</center></body>\n" +
                    "</html>\n");
       }
       catch(Exception e){
          e.printStackTrace();
       }
   }
         // 在這裡加上 doPost
   public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException
   {
this.doGet(request,response);
   }
}  //class


d. Sample8
這個範例是與 Sample1 相同,在加上用 web.xml & Tomcat 的帳密來做驗證機制。
web.xml

   <security-constraint>
      <web-resource-collection>
         <web-resource-name>Sample8</web-resource-name>
         <url-pattern>/Sample8</url-pattern>
      </web-resource-collection>
      <auth-constraint>
         <role-name>admin</role-name>
         <role-name>admin-gui</role-name>
      </auth-constraint>
   </security-constraint>

   <login-config>
      <auth-method>BASIC</auth-method>
   </login-config>

   <security-role>
      <role-name>admin</role-name>
      <role-name>admin-gui</role-name>
   </security-role>


Tomcat 7.0/conf/tomcat-users.xml

<tomcat-users>
<user name="root" password="apple" roles="admin-gui,manager-gui,admin" />


PS:檔案修改完後需要 restart Tomcat service。
PS2:第22章 Sample4.java 程式碼有誤
原始程式碼:Sample4.java

import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample4 extends HttpServlet
{
   public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException
   {
      try{
         // 取得Session
         HttpSession hs = request.getSession(true);
         Integer cn = (Integer) hs.getAttribute("count");
         Date dt = (Date) hs.getAttribute("date");

         String str1, str2;

         // 設定次數
         if(cn == null){
            cn = new Integer(1);
            dt = new Date();
            str1 = "這是您的初次造訪。";
            str2 = "";
         }
         else{
            cn = new Integer(cn.intValue() + 1);
            dt = new Date();   //這裡已經更新 dt 了,所以下面 str2 會是本次的時間,因此這行要移到 str2 的下面一行。
            str1 = "這是您的第" + cn + "次造訪。";
            str2 = "(上次是在:" + dt + ")";
         }
   
         // 設定Session
         hs.setAttribute("count", cn);
         hs.setAttribute("date", dt);

         // 設定內容類型
         response.setContentType("text/html; charset=UTF-8");

         // 輸出HTML文件
         PrintWriter pw = response.getWriter();
         pw.println("<html>\n" +
                    "<head><title>範例</title></head>\n" +
                    "<body><center>\n" +
                    "<h2>歡迎光臨</h2>" +
                    "<hr />\n" +
                    str1 + "<br/>\n" +
                    str2 + "<br/>\n" +
                    "請選擇一件商品。<br/>\n" +
                    "<br/>\n" +
                    "<a href=\"./car1.html\">汽車</a><br/>\n" +
                    "<a href=\"./car2.html\">卡車</a><br/>\n" +
                    "<a href=\"./car3.html\">戰車</a><br/>\n" +
                    "</center></body>\n" +
                    "</html>\n");
        }
        catch(Exception e){  
          e.printStackTrace();
       }
   }

   public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException
   {
     this.doGet(request, response);
   }
}



更正後的程式碼:Sample4.java

import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample4 extends HttpServlet
{
   public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException
   {
      try{
         // 取得Session
         HttpSession hs = request.getSession(true);
         Integer cn = (Integer) hs.getAttribute("count");
         Date dt = (Date) hs.getAttribute("date");

         String str1, str2;

         // 設定次數
         if(cn == null){
            cn = new Integer(1);
            dt = new Date();
            str1 = "這是您的初次造訪。";
            str2 = "";
         }
         else{
            cn = new Integer(cn.intValue() + 1);
            str1 = "這是您的第" + cn + "次造訪。";
            str2 = "(上次是在:" + dt + ")";
            dt = new Date();  //應該在這裡,上一行的時間才會是上次造訪的時間,並將這次目前的時間更新到 dt,最為下次使用。
         }
   
         // 設定Session
         hs.setAttribute("count", cn);
         hs.setAttribute("date", dt);

         // 設定內容類型
         response.setContentType("text/html; charset=UTF-8");

         // 輸出HTML文件
         PrintWriter pw = response.getWriter();
         pw.println("<html>\n" +
                    "<head><title>範例</title></head>\n" +
                    "<body><center>\n" +
                    "<h2>歡迎光臨</h2>" +
                    "<hr />\n" +
                    str1 + "<br/>\n" +
                    str2 + "<br/>\n" +
                    "請選擇一件商品。<br/>\n" +
                    "<br/>\n" +
                    "<a href=\"./car1.html\">汽車</a><br/>\n" +
                    "<a href=\"./car2.html\">卡車</a><br/>\n" +
                    "<a href=\"./car3.html\">戰車</a><br/>\n" +
                    "</center></body>\n" +
                    "</html>\n");
        }
        catch(Exception e){  
          e.printStackTrace();
       }
   }

   public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException
   {
     this.doGet(request, response);
   }
}





2.jsp include 的用法
JAVA 2 / ch23\Sample4.jsp
<%@ page contentType="text/html; charset=UTF-8" %>

<%
    String tmp = request.getParameter("cars");
    String carname = new String(tmp.getBytes("ISO-8859-1"), "UTF-8");
%>
<html>
<head>
<title><%= carname %></title>
</head>
<body>
<center>
<h2><%= carname %></h2>
感謝您購買本公司的
<%= carname %>
。<br/><br/>
<jsp:include page="company.html" flush="true"/>
</center>
</body>
</html>



可以應用在一般公司每個網頁下方放一個公司資訊 (電話地址等等)的 frame。
一但電話住址修改,只需更改 company.html 即可,因為其他網頁都是用<jsp:includepage="company.html"> 類似超連結到該網頁。


3.JavaBeans
JavaBeans 一般作為元件(component)用,JavaBeans 漢醫般的類別差不多,但是須符合下列幾個規則:
1.實作 Serializable 介面。
2.擁有沒有參數的建構式。
3.要加上無法從類別外部直接存取欄位的修飾子。(也就是要做封裝,用 Private 參數)
4.為了設定、取得欄位的值,所以要使用特定名稱的方法 (set X X、get X X等)。

No comments: