Feedback.java
上传用户:weisa_1
上传日期:2007-10-14
资源大小:287k
文件大小:9k
源码类别:

手机WAP编程

开发平台:

Java

  1. package feedback;
  2. import push.Winner;
  3. import push.PushInitiator;
  4. import members.Members;
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import java.io.*;
  8. import java.util.*;
  9. /**
  10.  * Feedback class handles the feedback section of your WML home pages.
  11.  *
  12.  * Initialization parameters:
  13.  *   "questionsfile" determines the name of the file containing your questions 
  14.  *   "feedbackfile" determines the name of the file where the feedback is saved
  15.  *
  16.  *    The first line in your questionsfile contains the different choises the user can choose from
  17.  *    if the line starts with a "!" the answer will be a String
  18.  *
  19.  * @version 1.0
  20.  * @since 1.0
  21.  * @see HttpServlet
  22.  */
  23. public final class Feedback extends HttpServlet {
  24.     private static final String XML_VERSION = "<?xml version="1.0"?>";
  25.     private static final String CONTENT_TYPE = "text/vnd.wap.wml";
  26.     private static final String DOC_TYPE = "<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"n" +
  27. "  "http://www.wapforum.org/DTD/wml_1.1.xml">";
  28.     private static int numberOfQuestions=0;
  29.     private static String grades;
  30.     private static final Vector questions = new Vector();
  31.     private static final String HOME_PAGE = "/index.jsp";
  32.     private static String feedbackFile = null;
  33.     private static Winner winner = null;
  34.     /**
  35.      * This is the initialization code that runs only once. (when you start the servlet)
  36.      * The servlet is being placed into service.
  37.      */
  38.     public void init() throws ServletException {
  39. String questionsFile = getInitParameter ("questionsfile");
  40. questionsFile = getServletContext().getRealPath(questionsFile);
  41. feedbackFile = getInitParameter ("feedbackfile");
  42. feedbackFile = getServletContext().getRealPath(feedbackFile);
  43. try {
  44.     BufferedReader reader = new BufferedReader(new FileReader(questionsFile));
  45.     grades = reader.readLine();
  46.     String line;
  47.     while((line = reader.readLine()) != null) {
  48. if(line.trim().equals(""))  break;
  49. questions.add(line);
  50.     }
  51. }
  52. catch (java.io.IOException e) {
  53.     System.err.println(e);
  54. }
  55. numberOfQuestions = questions.size();
  56.     }
  57.     /**
  58.      * Called by the server to allow a servlet to handle a GET request. 
  59.      *
  60.      * @param request a <code>HttpServletRequest</code> value
  61.      * @param response a <code>HttpServletResponse</code> value
  62.      * @exception ServletException if an error occurs
  63.      * @exception IOException if an error occurs
  64.      */
  65.     public void doGet(HttpServletRequest request, HttpServletResponse response) 
  66. throws ServletException, IOException {
  67. doPost(request, response);
  68.     }
  69.     /**
  70.      * Called by the server to allow a servlet to handle a POST request.
  71.      *
  72.      * @param request a <code>HttpServletRequest</code> value
  73.      * @param response a <code>HttpServletResponse</code> value
  74.      * @exception ServletException if an error occurs
  75.      * @exception IOException if an error occurs
  76.      */
  77.     public void doPost(HttpServletRequest request, HttpServletResponse response) 
  78. throws ServletException, IOException {
  79. /* Session tracking. See the description in index.jsp */
  80. HttpSession session = request.getSession();
  81. boolean cookiesCheck = request.getHeader("cookie") != null && request.isRequestedSessionIdValid();
  82. final String jsessionID = cookiesCheck ? "" : ";jsessionid=" + session.getId();
  83. /* Initialize a winner selecting thread that selects a winner from the set of users who has given feedback.
  84.            It will send a push message to the winner */
  85. if(winner == null) {
  86.     PushInitiator pusher = Members.getInitiator();
  87.     if(pusher != null) {
  88. winner = new Winner(pusher, "http://" + request.getServerName() + ":" + 
  89.     request.getServerPort() + request.getContextPath() + 
  90.     "/services/winner.jsp", Members.getPushAddressType());
  91. new Thread(winner).start();
  92.     }
  93. }
  94. /* start generating the response ... */
  95. response.setContentType(CONTENT_TYPE);
  96. PrintWriter out = response.getWriter();
  97.       
  98. out.println(XML_VERSION);
  99. out.println(DOC_TYPE);
  100. out.println("<wml>");
  101. out.println("<!-- provides a way back using the prev element -->n" +
  102.     "<template>" +
  103.     " <do type="prev">" + 
  104.     "  <prev/>" +
  105.     " </do>" +
  106.     "</template>");
  107. if(request.getParameter("action") == null) {
  108.     out.println("<!-- questions card -->n" +
  109. "<card title="Feedback" id="questionsCard">" +
  110. "<do type="accept" label="Send form">" +
  111. "<go method="post" href="" + request.getRequestURI() + jsessionID + "">");
  112.     for (int i = 0; i < numberOfQuestions; ++i)
  113. out.println("<postfield name="answer" + i + "" value="$(choise" + i + ")"/>");
  114.     out.println("<postfield name="action" value="write"/>");
  115.     out.println("<postfield name="sendname" value="$(sendname)"/>");
  116.     out.println("</go></do>" +
  117. "<p>Please grade our mobile service:<br/>");
  118.     String gradesOut = "";
  119.     StringTokenizer st = new StringTokenizer(grades);
  120.     for(int j=1; st.hasMoreTokens(); ++j)
  121. gradesOut = gradesOut + "<option value="" + j + "">" + st.nextToken() + "</option>n";
  122.     for (int i=0; i < numberOfQuestions; ++i) {
  123. String question = (String)questions.get(i);
  124. if (question.startsWith("!")){
  125.     out.println(question.substring(1) + "&#160;");
  126.     out.println("<input name="choise" + i + ""/>");
  127. }
  128. else{
  129.     out.println(question + "&#160;");
  130.     out.println("<select value="Empty" title="" + question + "" name="choise" + i + "">");
  131.     out.println("<option value="Empty">Select</option>");
  132.     out.println(gradesOut);
  133.     out.println("</select>");
  134. }
  135.     }
  136.     if (session.getAttribute("name") != null){ 
  137. out.println("<select name="sendname" value="yes">" + 
  138.     "<option value="yes">Include name</option>" +
  139.     "<option value="no">Do not include name</option>" +
  140.     "</select>");
  141.     } 
  142.     out.println("<anchor title="Send form">Send form" +
  143. "<go method="post" href="" + request.getRequestURI() + jsessionID + "">");
  144.     for (int i = 0; i < numberOfQuestions; ++i)
  145. out.println("<postfield name="answer" + i + "" value="$(choise" + i + ")"/>");
  146.     out.println("<postfield name="action" value="write"/>");
  147.     out.println("<postfield name="sendname" value="$(sendname)"/>");
  148.     out.println("</go></anchor></p>" +
  149. "</card>");
  150. }
  151. else {
  152.     out.println("<!-- Thanks about the feedback -->n" +
  153. "<card title="Thank you" id="thanks">" +
  154. " <do type="accept" label="Ok">" +
  155. "  <go href="" + request.getContextPath() + HOME_PAGE + jsessionID + ""/>" +
  156. " </do>" +
  157. " <p>Your message has been delivered.<br/>Thank you for your feedback!<br/>" +
  158. ((session.getAttribute("name") != null) ?  
  159.  "Note! Each member feedback (if name included) enters a draw for wonderful prizes.<br/>" : "") +
  160. " <anchor title="Info pages">Info pages" +
  161. "  <go href="" + request.getContextPath() + HOME_PAGE + jsessionID + ""/>" +
  162. " </anchor>" +
  163. " </p>" +
  164. "</card>");
  165.     /* finally, update the feedback file. */
  166.     synchronized (feedbackFile) {
  167. PrintWriter writer = new PrintWriter(new FileOutputStream(feedbackFile, true), true);
  168. for (int i = 0; i < numberOfQuestions; ++i){
  169.     String answer = request.getParameter("answer" + i);
  170.     writer.print(answer + ";");
  171. }
  172. if (request.getParameter("sendname") != null && request.getParameter("sendname").equals("yes")) 
  173.     writer.println((String)session.getAttribute("name"));
  174. else 
  175.     writer.println();
  176. writer.flush();
  177.     }
  178. }
  179. out.println("</wml>");
  180.     }
  181.     /**
  182.      * <code>viewVotes</code> views the information related to received feedbacks, i.e., 
  183.      * average grades for each question.
  184.      *
  185.      * @return a <code>String</code> value
  186.      */
  187.     public static String viewVotes() {
  188. String returnStr = "";
  189. try {
  190.     int numberOfLines = 0;
  191.     double[] stats = new double[numberOfQuestions];
  192.     int[] empty = new int[numberOfQuestions];
  193.     synchronized(feedbackFile) {
  194. BufferedReader reader = new BufferedReader(new FileReader(feedbackFile));
  195. StringTokenizer st = null;
  196. String line;
  197. while ((line = reader.readLine()) != null){
  198.     st = new StringTokenizer(line, ";");
  199.     for (int i = 0; i < numberOfQuestions; ++i){
  200. String token = st.nextToken();
  201. if (!(token.equals("Empty"))) stats[i] = stats[i] + Integer.parseInt(token);
  202. else ++empty[i];
  203.     }
  204.     ++numberOfLines;
  205. }
  206.     }
  207.     for (int j = 0; j < numberOfQuestions; ++j)
  208. returnStr = returnStr + questions.get(j) + ": " + 
  209.     Math.rint(100.0*stats[j] / (numberOfLines - empty[j]))/100.0 + "<br/>";
  210.     returnStr = returnStr + "Votes: " + numberOfLines;
  211. }
  212. catch(Exception e){ System.err.println(e); }
  213. return returnStr;
  214.     }
  215.    /**
  216.      * Selects winner from a set of users who have returned feedback
  217.      *
  218.      * @param feedbackFile a <code>String</code> value
  219.      * @return a <code>String</code> value
  220.      */
  221.     public static String winner() {
  222. try{
  223.     synchronized(feedbackFile) {
  224. BufferedReader reader = new BufferedReader(new FileReader(feedbackFile));
  225. int numberOfPossibilities = 0;
  226. while (reader.readLine() != null) ++numberOfPossibilities;
  227. int winner = 1 + (int)(Math.random() * numberOfPossibilities);
  228. String winnerStr ="";
  229. reader = new BufferedReader(new FileReader(feedbackFile));
  230. for (int i = 0; i < winner; ++i) winnerStr = reader.readLine();
  231. StringTokenizer st = new StringTokenizer(winnerStr, ";");
  232. while (st.hasMoreTokens()) winnerStr = st.nextToken();
  233. return winnerStr;
  234.     }
  235. }
  236. catch(FileNotFoundException e){}
  237. catch(IOException e){}
  238. return "";
  239.     }
  240. }