1. 程式人生 > >MVC框架簡易留言板例項

MVC框架簡易留言板例項

MVC是一種軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控制器(Controller),即為MVC。

首先建立一個數據庫
use master
--檢視是否存在重名的資料庫
if exists (select * from sysdatabases where name='Messages')
 drop database Messages
 --建立資料庫
create database Messages
use Messages
--建立表
create table Message
(
messID int primary key identity(1,1),
messName varchar(10),
title varchar(200),
messDate datetime default getdate(),
content varchar(1000)
)
--插入資料
insert into Message(messName,title,content) values('張珊','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊1','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊2','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊3','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊4','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊5','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊6','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊7','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊8','中午開會','今天中午開會')
insert into Message(messName,title,content) values('張珊9','中午開會','今天中午開會')
select * from Message

 開啟myeclipse,建立一個專案,再建立三個MVC框架的包然後在javabean中建立連線資料庫的類 BaseDao這裡邊是連線資料庫的通用方法還有 增刪改查的通用方法,需要用資料庫中的內容,一般離不開增刪改查,在這裡寫上通用方法,可以方便後面的方法呼叫, 只需要繼承這個類就行。
package com.ruanyuan.javabean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BaseDao {
	//驅動
	private static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
	//資料庫的URL
	private static final String URL="jdbc:sqlserver://localhost:1433;DatabaseName=Messages";
	//資料庫的使用者名稱
	private static final String USERNAME="sa";
	//資料庫的密碼
	private static final String PASSWORD="sa";
	//連線物件
	protected Connection conn;
	//預編譯PreparedStatement物件
	protected PreparedStatement pstmt;
	//結束集ResultSet物件
	protected ResultSet rs;
	
	// 資料庫連線
	protected void getConnection() {
		try {
			// 註冊sql驅動
			Class.forName(DRIVER);
			// 載入驅動並且得到連線物件
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (ClassNotFoundException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}

	}
	// 釋放資源
	protected void closeResource() {
		if (rs != null) {
			try {
				rs.close();// 釋放結果集
			} catch (SQLException e) {
				// TODO 自動生成的 catch 塊
				e.printStackTrace();
			}
		}
		if (pstmt != null) {
			try {
				pstmt.close();// 釋放預編譯的命令物件
			} catch (SQLException e) {
				// TODO 自動生成的 catch 塊
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();// 釋放連線物件
			} catch (SQLException e) {
				// TODO 自動生成的 catch 塊
				e.printStackTrace();
			}
		}

	}

	/**
	 * 增 刪 改 的通用方法
	 * @param sql
	 * @param paras
	 * @return
	 */
	protected int execUpdate(String sql, String[] paras) {
		int count = 0;// 受影響的行數
		try {
			// 連線資料庫
			this.getConnection();
			// 基於sql語句構建PreparedStatement物件
            pstmt=conn.prepareStatement(sql);
			// 遍歷引數陣列,並將值賦給PrepareStatement物件
			if (paras != null && paras.length > 0) {
				for (int i = 0; i < paras.length; i++) {
					pstmt.setString(i + 1, paras[i]);

				}
			}
			// 執行SQL語句
			count = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.closeResource();
		}
		return count;
	}
	protected ResultSet execQuery(String sql,String[] paras){
		   
		try {
			//連線資料庫
			this.getConnection();
			//基於SQL語句建立PreparedStantment物件
			pstmt = conn.prepareStatement(sql);
			//將SQL語句引數陣列中的值依次賦給預執行語句
			if(paras!=null&¶s.length>0){
				for (int i = 0; i < paras.length; i++) {
					pstmt.setString(i + 1, paras[i]);

				}
			}
			//執行SQL語句
			rs = pstmt.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//返回結果集
		return rs;
	}
}
然後再寫實體類
private int messID;
private String messName;
private String title;
private String content;
private java.sql.Date messDate;
然後再settergetter
然後是需要的方法(這裡面用到了分頁,但是先不介紹分頁,後續再具體介紹分頁)
package com.ruanyuan.oper;

import java.util.ArrayList;
import java.util.List;

import com.ruanyuan.javabean.BaseDao;
import com.ruanyuan.javabean.MessageBean;

public class ManageMes extends BaseDao {
	
	//新增
	public int addMessage(MessageBean messagebean){
		int count=0;
		String sql="insert into Message(messName,title,content) values(?,?,?)";
		String[] paras={messagebean.getMessName(),messagebean.getTitle(),messagebean.getContent()};
		try {
			count=super.execUpdate(sql, paras);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return count;
	}
	
	//查詢
	public List<MessageBean> all(int pageNo){
		List<MessageBean> list=new ArrayList<MessageBean>();
		MessageBean messagebean=null;
		int pageSize=5;//每頁最大記錄數
		int rows=0;//表示每頁之前的記錄數
		if(pageNo >1){
			//計算每頁之前記錄數,例如第2頁之前記錄數(2-1)*5=5條
			rows=(pageNo -1)*pageSize;
		}
		try {
			String sql="select top "+pageSize+" * from Message where messID not in(select top "+rows+" messID from Message order by messID)order by messID";
			System.out.println(sql);
			rs=super.execQuery(sql, null);
			while(rs.next()){
			messagebean=new MessageBean();
			messagebean.setMessID(rs.getInt("messID"));
			messagebean.setMessName(rs.getString("messName"));
			messagebean.setTitle(rs.getString("title"));
			messagebean.setMessDate(rs.getDate("messDate"));
			messagebean.setContent(rs.getString("content"));
			list.add(messagebean);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			super.closeResource();
		}
		return list;
	}
	//總數
	public int count(){
		int count=0;
		try {
			String sql="select count(*) from Message";
			rs=super.execQuery(sql, null);
			if(rs.next()){
				count=rs.getInt(1);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return count;
	}
}
接下來,搭建頁面
<%@ page language="java" import="java.util.*" 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">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
  	<form action="MessageServlet?fun=add" method="post">
    	<table width="50" border="1">
    		<tr bgcolor="#999999">
    			<td height="42" colspan="3">
    				<div align="center"><span>留言板</span></div>
    			</td>
    		</tr>
    		<tr>
    			<td width="28%" height="36">姓名:</td>
    			<td colspan="2"><input type="text" name="messName"/></td>
    		</tr>
    		<tr>
    			<td height="41">主題:</td>
    			<td colspan="2"><input type="text" name="title"/></td>
    		</tr>
    		<tr>
    			<td height="93">留言:</td>
    			<td colspan="2"><textarea name="content" row="8" cols="30"></textarea></td>
    		</tr>
    		<tr bgcolor="#999999">
    			<td height="60" colspan="3">
    				<label>
    					<div align="center">
    						<input type="submit" value="提交留言"/>    <input type="reset" value="重新編寫"/>
    					</div>
    				</label>
    			</td>
    		</tr>
    	</table>
    </form>
  </body>
</html>
當填寫好以後,點選提交 提交到servlet中,再這個裡邊進行判斷,
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		ManageMes mm=new  ManageMes();
		MessageBean mesbean=new MessageBean();
		String fun=request.getParameter("fun")==null?"all":request.getParameter("fun");
		int pageNo=1;
		if(request.getParameter("pageNo")!=null){
			pageNo=Integer.parseInt(request.getParameter("pageNo"));
			}
		//如果輸入引數小於1時pageNo等於1
		if(pageNo < 1){
			pageNo=1;
		}
	    int countMovie=mm.count();
	    request.setAttribute("count",countMovie);
		request.setAttribute("pageNo",pageNo);
		if(fun.equals("add")){
			String messName=request.getParameter("messName");
			String title=request.getParameter("title");
			String content=request.getParameter("content");
			if(messName == null || messName.length()<0){
				messName="";
			}
			if(title == null || title.length()<0){
				title="";
			}
			if(content == null || content.length()<0){
				content="";
			}
			
			mesbean.setMessName(messName);
			mesbean.setTitle(title);
			mesbean.setContent(content);
			int count=mm.addMessage(mesbean);
			if(count>0){//成功
				List<MessageBean> messList=mm.all(pageNo);
				HttpSession session=request.getSession();
				session.setAttribute("message",messList);
				request.getRequestDispatcher("viewMessage.jsp").forward(request, response);
			}else{//失敗
				request.getRequestDispatcher("writeMessage.jsp").forward(request, response);
			}
		}
		if(fun.equals("all")){
			List<MessageBean> col=new ArrayList<MessageBean>();
			col=mm.all(pageNo);
			request.setAttribute("message", col);
			request.getRequestDispatcher("viewMessage.jsp").forward(request, response);
		}
	}
如果成功 跳轉到 展示頁面,如果失敗,回到新增頁面這裡用的是el表示式,更方便,  但是需要把所用到的東西 先存到作用域裡邊,這裡才可以呼叫。
 <body>
    <c:forEach var="message" items="${message}">
    <table width="50%" border="1">
    	<tr>
    		<td width="29%" height="42" bgcolor="#99cc66"><span>主題:</span></td>
    		<td width="71%">${message.title}</td>
    	</tr>
    	<tr>
    		<td height="53" bgcolor="#99cc66"><span>留言人:</span></td>
    		<td>${message.messName}</td>
    	</tr>
    	<tr>
    		<td height="45" bgcolor="#99cc66"><span>留言時間:</span></td>
    		<td>${message.messDate}</td>
    	</tr>
    	<tr>
    		<td height="53" bgcolor="#99cc66"><span>留言內容:</span></td>
    		<td>${message.content}</td>
    	</tr>
    </table>
    </c:forEach>
  <jsp:include  page="ListByPage.jsp"></jsp:include>
  </body>