java: mvc設計思想例項,網頁上查詢資料庫中資料
前段時間學習了mvc設計模式,並按照mvc模式設計了一個網頁,在這個網頁上我可以根據不同條件查詢資料庫的資料。
關於mvc是什麼,以及採用mvc模式的作用,這篇部落格講的十分淺顯易懂:
https://blog.csdn.net/muyi_amen/article/details/54341065
首先是顯示主介面網頁的jsp檔案main.jsp.這是屬於檢視V這一部分的。這裡把表單的處理方法設定為get,並在web.xml檔案中註冊好處理該action的類為MyServlet.java。程式碼內容如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!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=ISO-8859-1"> <title>世界盃資訊查詢</title> </head> <body> <FONT SIZE="8" COLOR="顏色#FF0000"style="position:absolute; width:800px; height:415px;z-index:1;left: 600px;top:200px;"> 世界盃資訊查詢 </FONT> <form action="findu" method="get" style="position:absolute; width:800px; height:415px;z-index:1;left: 400px;top:300px;" > <p>球員查詢: 國家:<input type="text" name="country" style="width:40px" /> 名字:<input type="text" name="pname" style="width:40px" /> 號碼:<input type="text" name="number" style="width:40px" /> 位置:<input type="text" name="position" style="width:40px"/> 年齡:<input type="text" name="age" style="width:40px" /> 慣用腳:<input type="text" name="footuse" style="width:40px" /> 進球數:<input type="text" name="goal" style="width:40px"/> <input name="find1" type="submit" value="查詢球員"></p> <p>比賽查詢: 主隊:<input type="text" name="hteam" style="width:40px"/>隊 客隊:<input type="text" name="gteam" style="width:40px"/>隊 時間:<input type="text" name="month" style="width:40px" />月<input type="text" name="day" style="width:40px" />日 <input name="find" type="submit" value="查詢比賽"> </p> </form> </body> </html>
然後是充當控制器C的MyServlet.java.它的功能是流程控制,比如判斷使用者按下主介面網頁哪個按鈕以及輸入了哪些值。並獲取這些值傳入模型層,模型層則根據這些值對資料庫進行查詢。MyServlet.java程式碼內容如下:
package Servlet; import java.io.IOException; import java.sql.ResultSet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import POJO.MyPOJO; @SuppressWarnings("serial") public class MyServlet extends HttpServlet { public MyServlet() { super(); } public void destory() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(request.getParameter("find1")!=null) //判斷按下的是哪個查詢按鈕 { String country="%"; if(request.getParameter("country")!="") { country=request.getParameter("country"); } String pname="%"; if(request.getParameter("pname")!="") { pname=request.getParameter("pname"); } String number="%"; if(request.getParameter("number")!="") { number=request.getParameter("number"); } String position="%"; if(request.getParameter("position")!="") { position=request.getParameter("position"); } String age="%"; if(request.getParameter("age")!="") { age=request.getParameter("age"); } String footuse="%"; if(request.getParameter("footuse")!="") { footuse=request.getParameter("footuse"); } String goal="%"; if(request.getParameter("goal")!="") { goal=request.getParameter("goal"); } //獲取網頁中的引數,若沒有輸入就置為% MyPOJO myPOJO=new MyPOJO(country,pname,number,position,age,footuse,goal);//建立模型的物件,將引數傳入 try { ResultSet PlayerImformation=myPOJO.findPlayer(); request.setAttribute("PlayerImformation",PlayerImformation); request.getRequestDispatcher("/Player.jsp").forward(request, response); //跳轉到球員資訊介面,並將在資料庫查到的結果集給Player.jsp } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(request.getParameter("find")!=null) //判斷按下的是哪個查詢按鈕 { String hteam="%"; if(request.getParameter("hteam")!="") { hteam=request.getParameter("hteam"); } String gteam="%"; if(request.getParameter("gteam")!="") { gteam=request.getParameter("gteam"); } String month="%"; if(request.getParameter("month")!="") { month=request.getParameter("month"); } String day="%"; if(request.getParameter("day")!="") { day=request.getParameter("day"); } //獲取網頁中的引數,若沒有輸入就置為“%” MyPOJO myPOJO1=new MyPOJO(hteam,gteam,month,day); //建立模型物件將引數傳入 try { ResultSet GameImformation=myPOJO1.findGame(); request.setAttribute("GameImformation",GameImformation); request.getRequestDispatcher("/Game.jsp").forward(request, response); //跳轉到賽事資訊介面,並將在資料庫查到的結果集給Game.jsp } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void init() throws ServletException { } }
由於在web.xml中註冊好了,一旦使用者點選了主介面的按鈕,MyServlet.java裡的doGet()函式就會進行處理:判斷按下的按鈕以及獲取使用者輸入的引數。
然後是模型層M MyPOJO.java,它的任務主要是處理業務邏輯和對資料庫進行操作,程式碼內容如下:
package POJO; import java.sql.*; public class MyPOJO { private String country,pname,number, position,age,footuse,goal; private String hteam,gteam, month,day; public MyPOJO(String country,String pname,String number,String position,String age,String footuse,String goal) { this.country=country; this.pname=pname; this.number=number; this.position=position; this.age=age; this.footuse=footuse; this.goal=goal; } public MyPOJO(String hteam,String gteam,String month,String day) { this.hteam=hteam; this.gteam=gteam; this.month=month; this.day=day; } public ResultSet findGame() throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn1=DriverManager.getConnection("jdbc:mysql://localhost:3306/worldcup" + "?user=root&password=1729456sq&serverTimezone=UTC" + "&useUnicode=true&characterEncoding=utf-8"); //使用jdbc驅動連線mysql資料庫並通過驅動管理器建立一個連線 Statement stmt1=conn1.createStatement(); String sq="select * from game where hteam like '"+hteam+"' and gteam like '" +gteam+"' and month like '"+month+"' and day like'"+day+"'"+";"; //拼接的sql語句 ResultSet GameImformation=stmt1.executeQuery(sq); //執行查詢sql語句 return GameImformation; } //根據輸入在資料庫查詢Game表對應的結果,返回一個結果集 public ResultSet findPlayer() throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/worldcup?" + "user=root&password=1729456sq&serverTimezone=UTC" + "&useUnicode=true&characterEncoding=utf-8"); //使用jdbc驅動連線mysql資料庫並通過驅動管理器建立一個連線 Statement stmt=conn.createStatement(); String sq="select * from player where country like '" +country+"' and pname like '"+pname+"' and number like '" +number+"' and position like '"+position+"' and age like '"+age+"' and footuse like '" +footuse+"' and goal like '"+goal+"'"+";"; //拼接的sql語句 ResultSet PlayerImformation=stmt.executeQuery(sq); //執行查詢sql語句 return PlayerImformation; } //根據輸入在資料庫查詢Player表對應的結果,返回一個結果集 }
這裡使用jdbc對mysql資料庫進行查詢,MyPOJO.java的兩個查詢函式分別對資料庫中的player表和game表進行查詢,並返回一個符合查詢條件的結果集。
控制器C 也就是MyServlet檔案中獲得MyPOJO中查詢函式返回的結果集後,將結果集傳給V層(這裡是Player.jsp和Game.jsp),在V層中,通過逐行讀取結果集將內容列印顯示出來。
Player.jsp的內容如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="java.sql.ResultSet"%>
<!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>球員資訊</title>
</head>
<body>
<FONT SIZE="6" COLOR="顏色#FF0011"style="position:absolute; width:800px; height:415px;z-index:1;left: 800px;top:200px;">
比賽查詢結果
</FONT>
<center>
<% ResultSet e=(ResultSet)request.getAttribute("PlayerImformation"); //獲取傳來的查詢結果集物件
out.print("<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>");
out.print("從左至右依次為國家、名字、號碼、位置、年齡、慣用腳、進球數"+"<br>");
while (e.next()) //逐行讀入結果集
{
out.print(e.getString(2)+" "); //列印結果集某行的第二列
out.print(e.getString(3)+" ");
out.print(e.getString(4)+" ");
out.print(e.getString(5)+" ");
out.print(e.getString(6)+" ");
out.print(e.getString(7)+" ");
out.print(e.getString(8)+" ");
out.print("<br>");
}
%>
</center>
</body>
</html>
Game.jsp的內容如下:<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="java.sql.ResultSet"%>
<% String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!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>賽事資訊</title>
</head>
<body>
<FONT SIZE="6" COLOR="顏色#FF0011"style="position:absolute; width:800px; height:415px;z-index:1;left: 800px;top:200px;">
比賽查詢結果
</FONT>
<center>
<% ResultSet e=(ResultSet)request.getAttribute("GameImformation"); //獲取傳來的查詢結果集
out.print("<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>"+"<br>");
out.print("從左至右依次為主隊、客隊、月份、日期、主隊得分、客隊得分"+"<br>");
while (e.next()) //逐行讀入查詢結果集
{
out.print(e.getString(2)+" "); //列印某一行的第二列
out.print(e.getString(3)+" ");
out.print(e.getString(4)+" ");
out.print(e.getString(5)+" ");
out.print(e.getString(6)+" ");
out.print(e.getString(7)+" ");
out.print("<br>");
}
%>
</center>
</body>
</html>
啟動tomcat和mysql服務,把專案在Server上執行,效果是這樣的:
好吧,網頁設計的很爛,但重要的是mvc的設計思想。
資料庫的資料也比較少,只有德國隊和巴西隊的資料一共46人,重要的是感受mvc的設計思想。。
最後把程式的流程圖貼一下:
雖然有很多不足,但自己從頭到尾部署Tomcat,建立資料庫,配置jdbc。。。還是學到了一點東西的。