• 练习:使用servlet显示试卷页面


    试卷页面代码

    一、使用servlet显示试卷页面

    在浏览器输入如下地址: 

    http://localhost/examPageServlet

    效果如下: 

    二、提取css,做成一个单独的文件被引入

    1. response.setContentType("text/html;charset=UTF-8");
    2. PrintWriter writer = response.getWriter();
    3. writer.write("\n" +
    4. "\n" +
    5. "\n" +
    6. " \n" +
    7. " Title\n" +
    8. "\n" +
    9. "\n" +
    10. "\n" +
    11. "
      \n" +
    12. "
      \n" +
    13. "
      超级全能生
      \n"
      +
    14. "
      \n" +
    15. "
      浙江省新高考信息技术科目基础
      \n"
      +
    16. "
      夯实卷(一)
      \n"
      +
    17. "
      \n" +
  • "
    1
    \n"
    +
  • "
    \n" +
  • "
    \n" +
  • "
    信息技术
    \n"
    +
  • "
    本试卷满分50分,考试时间45分钟。
    \n"
    +
  • "
    \n" +
  • "
    \n" +
  • "
    一、选择题(本大题共12小题,每小题2分,共24分。在每小题给出的四个选项中,\n" +
  • " 只有一个是符合题目要求的)\n" +
  • "
    \n" +
  • "
    \n" +
  • "
    \n" +
  • "
    \n" +
  • "
    \n" +
  • "
    1.下列有关数据、信息、知识、智慧等说法中,正确的是
    \n"
    +
  • "
    ()
    \n"
    +
  • "
    \n" +
  • "
    \n" +
  • "
    \n" +
  • "
    A.计算机可以处理文本、图像、声音、视频等数据,数据量大时,只能使用计算机来处理
    \n"
    +
  • "
    B.计算机可以处理文本、图像、声音、视频等数据,数据量大时,只能使用计算机来处理
    \n"
    +
  • "
    C.计算机可以处理文本、图像、声音、视频等数据,数据量大时,只能使用计算机来处理
    \n"
    +
  • "
    D.计算机可以处理文本、图像、声音、视频等数据,数据量大时,只能使用计算机来处理
    \n"
    +
  • "\n" +
  • "
    \n" +
  • "
    \n" +
  • "
    \n" +
  • "\n" +
  • "
    。。。。。。。
    \n"
    +
  • "
    \n" +
  • "\n" +
  • "
    \n" +
  • "\n" +
  • "");
  • }
  • 三、当应用的启动时立即加载ExamPageServlet

    @WebServlet(value = {"/examPageServlet","/exam-page.html"},loadOnStartup = 1)

    四、增加一个虚拟路径(比如:/exam-page.html)映射到ExamPageServlet

    @WebServlet(value = {"/examPageServlet","/exam-page.html"},loadOnStartup = 1)

    五、添加一个默认的Servlet来处理404错误,友好地提示用户路径有错误

    1. @WebServlet("/")
    2. public class DefaultServlet extends HttpServlet {

    问题:静态资源访问不到了,比如css资源

    【tomcat路径匹配源码分析】搞懂tomcat中web.xml配置servlet的url-pattern为“/“和“/*“的区别_tomcat url-pattern-CSDN博客

    在web.xml中添加如下代码:让tomcat的默认servlet处理静态资源

    1. <servlet-mapping>
    2. <servlet-name>defaultservlet-name>
    3. <url-pattern>*.htmlurl-pattern>
    4. servlet-mapping>
    5. <servlet-mapping>
    6. <servlet-name>defaultservlet-name>
    7. <url-pattern>/static/*url-pattern>
    8. servlet-mapping>

    六、通过ServletConfig给ExamPageServlet设置响应内容的编码

    1. ServletConfig servletConfig = this.getServletConfig();
    2. String encoding = servletConfig.getInitParameter("encoding");

    七、通过ServletContext读取属性文件来设置共享的数据库地址

    1. private void setDatabaseURL() {
    2. ServletContext servletContext = this.getServletContext();
    3. String databasePath = servletContext.getRealPath("/WEB-INF/classes/database.properties");
    4. FileInputStream in;
    5. try {
    6. in = new FileInputStream(databasePath);
    7. Properties pros = new Properties();
    8. pros.load(in);
    9. String databaseURL = pros.getProperty("url");
    10. servletContext.setAttribute("databaseURL", databaseURL);
    11. } catch (Exception e) {
    12. // TODO Auto-generated catch block
    13. e.printStackTrace();
    14. }
    15. }

    八、使用ServletContext读取如下图片显示在试卷开头

     <img src='/headPicServlet' />
    1. public void doGet(HttpServletRequest request, HttpServletResponse response)
    2. throws ServletException, IOException {
    3. ServletOutputStream out = response.getOutputStream();
    4. ServletContext context = this.getServletContext();
    5. // 获取文件绝对路径
    6. String path = context.getRealPath("/head.bmp");
    7. FileInputStream in = new FileInputStream(path);
    8. response.setContentType("image/bmp");//告诉浏览器显示图片
    9. //response.setContentType("multipart/form-data");//告诉浏览器下载图片
    10. out = response.getOutputStream();
    11. //读取文件流
    12. int len = 0;
    13. byte[] buffer = new byte[1024 * 10];
    14. while ((len = in.read(buffer)) != -1){
    15. out.write(buffer,0,len);
    16. }
    17. out.flush();
    18. }

    九、使用HashMap模拟数据库存储选择题,优化ExamPageServlet 

    1、创建单项选择题类

    1. public class SelectOneQuestion {
    2. private Integer id;
    3. private String question;
    4. private String a;
    5. private String b;
    6. private String c;
    7. private String d;
    8. private String ask;

    2、在DefaultServlet中初始化题库

    1. private void initDatabase() {
    2. HashMap database = new HashMap();
    3. for (int i = 1; i <= 10; i++) {
    4. database.put(i, new SelectOneQuestion(i, "question"+i, "a"+i, "b"+i,"c"+i, "d"+i,"b"));
    5. }
    6. ServletContext servletContext = this.getServletContext();
    7. servletContext.setAttribute("database", database);
    8. }

    3、使用题库优化ExamPageServlet

    1. //遍历选择题
    2. StringBuilder sb=new StringBuilder();
    3. database.forEach((i,question)->{
    4. sb.append("
      \n");
    5. sb.append("
      \n");
    6. sb.append("
      ");
    7. sb.append(i).append(".").append(question.getQuestion()).append("
      \n");
    8. sb.append("
      ()
      \n"
      );
    9. sb.append("
      \n
      \n");
    10. sb.append("
      \n");
    11. sb.append("
      A.").append(question.getA()).append("
      \n"
      );
    12. sb.append("
      B.").append(question.getB()).append("
      \n"
      );
    13. sb.append("
      C.").append(question.getC()).append("
      \n"
      );
    14. sb.append("
      D.").append(question.getD()).append("
      \n"
      );
    15. sb.append("
      \n
      \n\n");
    16. });

    十、实现添加选择题的功能

    1、创建填写选择题的表单页

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Insert title heretitle>
    6. head>
    7. <body>
    8. <form action="/question-bank/AddSelectOneQuestionServlet" method="post">
    9. 问题: <input type="text" name="question" /><br>
    10. 选项A: <input type="text" name="a" /><br>
    11. 选项B: <input type="text" name="b" /><br>
    12. 选项C: <input type="text" name="c" /><br>
    13. 选项D: <input type="text" name="d" /><br>
    14. 答案: <input type="text" name="ask" /><br>
    15. <input type="submit" value="保存" />
    16. form>
    17. body>
    18. html>

    2、创建servlet处理上面表单提交的数据,实现添加选择题并重定向到ExamPageServlet

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    2. throws ServletException, IOException {
    3. // 获取数据库
    4. ServletContext servletContext = this.getServletContext();
    5. HashMap database = (HashMap) servletContext
    6. .getAttribute("database");
    7. //获取题目最大的id
    8. Set keySet = database.keySet();
    9. Integer max=0;
    10. for (Integer i : keySet) {
    11. if (max
    12. max = i;
    13. }
    14. }
    15. String question = request.getParameter("question");
    16. String a = request.getParameter("a");
    17. String b = request.getParameter("b");
    18. String c = request.getParameter("c");
    19. String d = request.getParameter("d");
    20. String ask = request.getParameter("ask");
    21. SelectOneQuestion ques = new SelectOneQuestion(max+1, question, a, b, c, d, ask);
    22. database.put(max+1, ques);
    23. response.sendRedirect("examPageServlet");
    24. }

  • 相关阅读:
    Git 创建远程仓库和本地仓库进行连接
    力扣(226.112)补9.8
    如何评价一个算法的优劣——时间复杂度
    如何找到新媒体矩阵中存在的问题?
    递归:快速排序,归并排序和堆排序
    ubuntu 下C++程序利用Valgrind工具调试内存问题
    王道链表综合题(下)
    网络编程
    encodeURI与encodeURIComponent的使用
    【无标题】
  • 原文地址:https://blog.csdn.net/daqi1983/article/details/132919439