20210410—JavaWeb—022.JSP与Servlet(分工、运行原理、举例)

学习记录22

一、JSP与Servlet的分工

1、Servlet 与 JSP 的分工

  • Servlet: 负责处理业务,并得到处理结果 —————— 厨师

  • JSP: 不负责处理业务,主要将 Servlet 中处理结果写入到响应体 —————— 服务员

2、Servlet 与 JSP 之间的调用关系

  • Servlet 处理业务后,一般通过请求转发方式,向 Tomcat 申请调用JSP

3、Servlet 与 JSP 之间如何实现数据共享

  • Servlet 将处理结果添加到【请求作用域对象】

  • JSP 文件在运行时从【请求作用域对象】得到处理结果

  • 示例:浏览器向服务端的 Servlet 发送请求,Servlet 向 Tomcat 申请 JSP 文件,JSP 文件显示。
    数据由 Servlet 运算后放入请求作用域对象,JSP 文件从请求作用域对象中获取。

public class OneServlet extends HttpServlet {

    // 处理业务,得到处理结果 ————> 查询学员信息
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Student stu = new Student(10, "DIO");
        Student stu1 = new Student(20, "JOJO");
        List stuList = new ArrayList();
        stuList.add(stu);
        stuList.add(stu1);


        // 将处理结果添加到请求作用域对象
        request.setAttribute("info", stuList);

        // 通过请求转发方案,向Tomcat申请JSP文件,同时将request与response通过Tomcat交给JSP文件
        request.getRequestDispatcher("user_show.jsp").forward(request, response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    // 从请求作用域对象中得到OneServlet添加进去的数据集合
    List<Student> infoList = (List) request.getAttribute("info");
%>

<!--将处理结果写入响应体-->
<table border="2" align="center">
    <tr>
        <td>用户编号</td>
        <td>用户姓名</td>
    </tr>
    <%
        for (Student student : infoList){
    %>
    <tr>
        <td><%=student.getId()%>></td>
        <td><%=student.getSname()%></td>
    </tr>
    <%
        }
    %>
</table>

二、JSP文件运行原理

1、Http服务器调用JSP文件步骤

  • Http服务器将JSP文件内容**【编辑】为一个Servlet接口实现类(.java)**
  • Http服务器将Servlet接口实现类**【编译】为class文件(.class)**
  • Http服务器负责创建这个class的实例对象,这个实例对象就是Servlet实例对象
  • Http服务器通过Servlet实例对象调用_jsp_Service方法,将jsp文件内容写入到响应体(一般在try{. . .}代码块内)

2、Http服务器【编辑】与【编译】JSP文件位置

在【work】下看到 .class 与 .java

C:\Users\[登录windows系统用户角色名]\.IntelliJIdea2018.3\system\tomcat\[网站工作空间]\work\Catalina\localhost\【网站别名】\org\apache\jsp

三、在线考试管理系统

0、创建数据库表

create table question(
           questionId int primary key auto_increment,
           title  varchar(50),# 10-8=?
           optionA varchar(20),#A: 9
           optionB varchar(20),#B: 1
           optionC varchar(20),#C: 2
           optionD varchar(20),#D: 0
           answer  char(1)     #正确答案: C
)

1、HTML文件编写——>得到操作互动页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
     <center>

         <form action="/myWeb/question/add" method="get">

             <table border="2">
                 <tr>
                     <td>题目:</td>
                     <td><input type="text" name="title"></td>
                 </tr>
                 <tr>
                     <td>A:</td>
                     <td><input type="text" name="optionA"></td>
                 </tr>
                 <tr>
                     <td>B:</td>
                     <td><input type="text" name="optionB"></td>
                 </tr>
                 <tr>
                     <td>C:</td>
                     <td><input type="text" name="optionC"></td>
                 </tr>
                 <tr>
                     <td>D:</td>
                     <td><input type="text" name="optionD"></td>
                 </tr>
                 <tr>
                     <td>正确答案:</td>
                     <td>
                           <input type="radio" name="answer" value="A">A
                         <input type="radio" name="answer" value="B">B
                         <input type="radio" name="answer" value="C">C
                         <input type="radio" name="answer" value="D">D
                     </td>
                 </tr>
                 <tr>
                     <td><input type="submit" value="新增试题"/></td>
                     <td><input type="reset" ></td>
                 </tr>
             </table>
         </form>

     </center>

</body>
</html>

20210410—JavaWeb—022.JSP与Servlet(分工、运行原理、举例)

2、Question实体类编写——>设置相关的变量和构造函数
20210410—JavaWeb—022.JSP与Servlet(分工、运行原理、举例)
3、QuestionDao类编写——>创建连接该表的“通道、接口”

public class QuestionDao {
    JdbcUtil util = new JdbcUtil();

    public int add(Question question){
        String sql="insert into question(title,optionA,optionB,optionC,optionD,answer) values(?,?,?,?,?,?)";
        PreparedStatement ps = util.createStatement(sql);
        int result = 0;
        try {
            ps.setString(1, question.getTitle());
            ps.setString(2, question.getOptionA());
            ps.setString(3, question.getOptionB());
            ps.setString(4, question.getOptionC());
            ps.setString(5, question.getOptionD());
            ps.setString(6, question.getAnswer());
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            util.close();
        }
        return result;
    }
//。
//。
//。
}

4、QuestionAddServlet类编写——>读取请求对象的数据、利用Dao推送到数据库、判断是否成功

public class QuestionAddServlet extends HttpServlet {


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String title,optionA,optionB,optionC,optionD,answer;
           QuestionDao dao = new QuestionDao();
           Question question = null;
           int result = 0;
          //1.调用请求对象读取请求信息,得到新增信息内容
        title= request.getParameter("title");
        optionA= request.getParameter("optionA");
        optionB= request.getParameter("optionB");
        optionC = request.getParameter("optionC");
        optionD = request.getParameter("optionD");
        answer  = request.getParameter("answer");
          //2.调用Dao对象将Insert命令推送到数据库,并得到处理结果
        question = new Question(null, title, optionA, optionB, optionC, optionD, answer);
        result = dao.add(question);
          //3.通过请求转发,向Tomcat索要info.jsp将处理结果写入到响应体
          if(result == 1){
              request.setAttribute("info", "试题添加成功");
          }else{
              request.setAttribute("info", "试题添加失败");
          }
          request.getRequestDispatcher("/info.jsp").forward(request, response);
    }
}
上一篇:文献阅读(十三):A survey of deep learning-based visual question answering_黄同愿


下一篇:如何设置win10安装软件不在c盘