MVC基本概念
- 模型(model) 模型是应用程序的主体部分,模型表示业务 数据和业务逻辑。 一个模型能为多个视图提供数据。 由于应用于模型的代码只需写一次就可以被 多个视图重用,所以提高了代码的可重用性。
- 视图(view) 视图是用户看到并与之交互的界面,作用如下
-视图向用户显示相关的数据。
-接受用户的输入。
-不进行任何实际的业务处理 - 控制器(controller) 控制器接受用户的输入并调用模型和视图去完 成用户的需求。 控制器接收请求并决定调用哪个模型组件去处
理请求,然后决定调用哪个视图来显示模型处 理返回的数据。 - 示意图
案例分析
调用情况
实现代码
StudentDao.java
package com.anqi.javaWeb.mvc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StudentDao {
public void deleteStudentByFlowId(Integer flowId) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql:///db_students";
String user ="root";
String password = "1995";
Class.forName(driverClass);
connection = DriverManager.getConnection(url, user, password);
String sql = "DELETE FROM t_student WHERE flow_id = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, flowId);
preparedStatement.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public List<Student> getAll(){
List<Student> students = new ArrayList<>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql:///db_students";
String user ="root";
String password = "1995";
Class.forName(driverClass);
connection = DriverManager.getConnection(url, user, password);
String sql = "SELECT flow_id, type, id_card, exam_card, location, grade "
+ "FROM t_student";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
while(resultSet.next()) {
int flowId = resultSet.getInt(1);
int type = resultSet.getInt(2);
String idCard = resultSet.getString(3);
String examCard = resultSet.getString(4);
String location = resultSet.getString(5);
int grade = resultSet.getInt(6);
Student student = new Student(flowId, type, idCard, examCard, location, grade);
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return students;
}
}
ListAllStudentsServlet.java
package com.anqi.javaWeb.mvc;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/listAllStudents")
public class ListAllStudentsServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StudentDao studentDao = new StudentDao();
List<Student> students = studentDao.getAll();
request.setAttribute("students", students);
request.getRequestDispatcher("/students.jsp").forward(request, response);
}
}
DeleteStudentServlet.java
package com.anqi.javaWeb.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/deleteStudent")
public class DeleteStudentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String flowId = request.getParameter("flowId");
StudentDao studentDao = new StudentDao();
studentDao.deleteStudentByFlowId(Integer.parseInt(flowId));
request.getRequestDispatcher("/sucess.jsp").forward(request, response);
}
}
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href = "listAllStudents">List All Students</a>
</body>
</html>
students.jsp
<%@page import="com.anqi.javaWeb.mvc.Student"%>
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<Student> stus = (List<Student>)request.getAttribute("students");
%>
<table border = "1" cellpadding = "10" cellspacing = "0">
<tr>
<th>FlowId</th>
<th>Type</th>
<th>IdCard</th>
<th>ExamCard</th>
<th>Location</th>
<th>Grade</th>
<th>Delete</th>
</tr>
<%
for(Student s : stus){
%>
<tr>
<td><%= s.getFlowId() %></td>
<td><%= s.getType() %></td>
<td><%= s.getIdCard() %></td>
<td><%= s.getExamCard() %></td>
<td><%= s.getLocation() %></td>
<td><%= s.getGrade() %></td>
<td><a href = "deleteStudent?flowId=<%=s.getFlowId()%>">Delete</a></td>
</tr>
<%
}
%>
</table>
</body>
</html>
sucess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
删除操作成功!
<br><br>
<a href = "listAllStudents">List All Students</a>
</body>
</html>
运行结果
最后分析
【关于MVC 】
1.M: Model.Dao
2.V: View.JSP,在页面上填写Java代码实现显示
3.C: Controller.Serivet:
【过程】
1.受理请求
2.获取请求参数
3.调用DAO方法
4.可能会把DAO 方法的返回值放入request 中
5.转发(或重定向)页面
什么时候转发,什么时候重定向? 若目标的响应页面不需要从request 中读
取任何值,则可以使用重定向。(还可以防止表单的重复提交)
【不足】
1.使用数据库连接池,DBUtils,JDBCUtils 工具类,DAO 基类
2.一个请求一个Sertvet 不好!一个模块使用一个Servet,即多个请求可
以使用一个Servlet
3.在页面上加入jQuery提示