1. 程式人生 > >javaweb之MVC設計模式

javaweb之MVC設計模式

1.MVC簡介

MVC是Model-View-Controller的簡稱,即模型-檢視-控制器。MVC是一種設計模式,它把應用程式分成三個核心模組:模型,檢視,控制器,它們各自處理自己的任務。

  • 模型(體現在下圖中的POJO和資料庫)是應用程式的主體部分,表示業務資料和業務邏輯。一個模型能為多個檢視提供資料。由於應用於模型的程式碼只需要寫一次就可以被多個檢視重用,所以提高了程式碼的可重用性。
  • 檢視是使用者看到並與之互動的介面,可以向用戶顯示相關的資料,也可以接收使用者的輸入,但是不進行任何實際的業務處理。
  • 控制器接收請求,獲取請求引數,呼叫DAO方法,決定用哪個模型元件去處理請求,然後決定呼叫哪個檢視來顯示模型處理返回的資料。

MVC模式處理過程邏輯放在servlet中,顯示交給jsp。客戶端發請求到伺服器,伺服器呼叫servlet,servlet作為一個控制器,接收請求,根據請求的相關邏輯情況去呼叫java類的方法,由java類完成業務邏輯跟訪問資料庫的操作,然後servlet根據pojo的返回結果,轉向不同的jsp頁面, jsp完成顯示的功能。

2.MVC案例之查詢

MySql資料庫中的資料內容為:

例如,現有需求需要實現在網頁點選超連結,可以在頁面顯示參加考試的學生的所有資訊(學生的考試資訊儲存在資料庫中)。設計思路如下圖所示,首先點選網頁的超連結listAllExamStudent,傳送get請求到servlet,由伺服器呼叫servlet的doGet方法,在doGet()方法中需要做到:①.呼叫ExamStudentDao的getAll()方法返回學生的List物件;②.把1得到的List放入request中;③.請求的轉發到student.jsp;

 實現程式碼:

點選網頁的超連結listAllExamStudent,傳送get請求到servlet。searchTest.jsp

  <body>
    <a href="listAllStudent">listAllStudents</a>
  </body>

 listAllStudentServlet.java

package com.javaWebMVCTest;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class listAllStudentServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        studentDao studentdao=new studentDao();
//呼叫ExamStudentDao的getAll()方法返回學生的List物件; List<student> students=studentdao.getAll();
//把1得到的List放入request中 request.setAttribute("students", students);
//請求的轉發到student.jsp request.getRequestDispatcher("/jspTest/students.jsp").forward(request,response); } }

在web.xml中進行配置:

<servlet>
  <servlet-name>listAllStudentServlet</servlet-name>
  <servlet-class>com.javaWebMVCTest.listAllStudentServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>listAllStudentServlet</servlet-name>
  <url-pattern>/listAllStudent</url-pattern>
</servlet-mapping>
<url-pattern>/listAllStudent</url-pattern>對映的地址為searchTest.jsp中超連結<a href="listAllStudent">的連結地址。
student.java
package com.javaWebMVCTest;

public class student {
    private Integer flow_id;
    private int Type;
    private String id_card;
    private String exam_card;
    private String student_name;
    private String Location;
    private int Grade;
    
	public Integer getFlow_id() {
		return flow_id;
	}
	public void setFlow_id(Integer flow_id) {
		this.flow_id = flow_id;
	}
	public int getType() {
		return Type;
	}
	public void setType(int type) {
		Type = type;
	}
	public String getId_card() {
		return id_card;
	}
	public void setId_card(String id_card) {
		this.id_card = id_card;
	}
	public String getExam_card() {
		return exam_card;
	}
	public void setExam_card(String exam_card) {
		this.exam_card = exam_card;
	}
	public String getStudent_name() {
		return student_name;
	}
	public void setStudent_name(String student_name) {
		this.student_name = student_name;
	}
	public String getLocation() {
		return Location;
	}
	public void setLocation(String location) {
		Location = location;
	}
	public int getGrade() {
		return Grade;
	}
	public void setGrade(int grade) {
		Grade = grade;
	}
	public student(Integer flow_id, int type, String id_card, String exam_card, String student_name, String location,
			int grade) {
		super();
		this.flow_id = flow_id;
		Type = type;
		this.id_card = id_card;
		this.exam_card = exam_card;
		this.student_name = student_name;
		Location = location;
		Grade = grade;
	}
    public student(){}
}

 連線資料庫及查詢的操作:studentDao.java

package com.javaWebMVCTest;

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;
import com.javaWebMVCTest.student;

public class studentDao {
	
    public List<student> getAll(){
    	List<student> stus=new ArrayList<>();
    	Connection connection=null;
    	PreparedStatement preparedstament=null;
    	ResultSet resultset=null;
    	
    	try{
    		String driverClass="com.mysql.jdbc.Driver";
    		Class.forName(driverClass);
    		System.out.println("資料庫驅動載入成功!");
    		connection=DriverManager.getConnection("jdbc:mysql:"+"//localhost:3303/students?autoReconnect=true&failOverReadOnly=false","root","0404");
    		System.out.println("資料庫連線成功!");
    		String sql="SELECT flow_id,Type,id_card,exam_card,student_name,Location,Grade FROM students";
    		preparedstament=connection.prepareStatement(sql);
    		resultset=preparedstament.executeQuery();
    		while (resultset.next()){
    			int flow_id=resultset.getInt(1);
    			int Type=resultset.getInt(2);
    			String id_card=resultset.getString(3);
    			String exam_card=resultset.getString(4);
    			String student_name=resultset.getString(5);		
    			String Location=resultset.getString(6);
    			int Grade=resultset.getInt(7);   
    			
    			student students=new student(flow_id,Type,id_card,exam_card,student_name,Location,Grade);
    			stus.add(students);
    		}
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    	try{
    		if (connection!=null){
    			connection.close();
    		} 
    	}catch(SQLException e){
    		e.printStackTrace();
    	}
    	try{
    		if (preparedstament!=null){
    			preparedstament.close();
    		} 
    	}catch(SQLException e){
    		e.printStackTrace();
    	}
    	try{
    		if (resultset!=null){
    			resultset.close();
    		} 
    	}catch(SQLException e){
    		e.printStackTrace();
    	}
    	return stus;
    }
}

 顯示資訊的跳轉頁面:students.jsp

  <body>
    <%
    List<student> stus=(List<student>)request.getAttribute("students");
     %>
     <table>
       <tr>
         <th>flow_id</th>
         <th>Type</th>
         <th>id_card</th>
         <th>exam_card</th>
         <th>student_name</th>
         <th>Location</th>
         <th>Grade</th>
       </tr>
       <%
       for(student stu:stus){
       %>
       
        <tr>
          <td><%=stu.getFlow_id() %></td>
          <td><%=stu.getType() %></td>
          <td><%=stu.getId_card() %></td>
          <td><%=stu.getExam_card() %></td>
          <td><%=stu.getStudent_name() %></td>
          <td><%=stu.getLocation() %></td>
          <td><%=stu.getGrade() %></td>
        </tr>
       <%
       }
        %>
     </table>
  </body>

 執行後顯示: