学习记录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>
2、Question实体类编写——>设置相关的变量和构造函数
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);
}
}