JavaWeb學習筆記11——MVC新聞網站開發

目錄

一、項目結構描述

二、截圖

三、關鍵代碼

四、總結


一、項目結構描述

  1. GoPage.java,這是項目的入口,它的最終目的是打開一個頁面,新聞首頁或者管理員登陸後的後臺管理頁面。它的任務是獲取所有新聞並存入鏈表,並將新聞鏈表存入session,方便其他頁面獲取。獲取flag參數,如果獲取到了flag=“showlist”,則說明是管理員登錄,將新聞數據送入後臺管理頁面,否則是未登錄狀態,將數據送入新聞首頁瀏覽。
  2. operateServlet.java,這是操作中心,包括管理員登錄、新聞的增刪改查。它會根據action參數去調用服務層相應的函數。
  3. DBHelper.java,數據庫助手類,本類直接與MySQL相聯繫,包括數據庫的連接、查詢、更新、以及最後的釋放。
  4. EncodingFilter.java,防止亂碼的過濾器。
  5. LoginFilter.java,用於攔截用戶未經過登錄,直接在地址欄中用url進入管理人員界面。
  6. News.java,新聞的模型,包括新聞ID、新聞類別、新聞標題、新聞內容、新聞作者、更新時間幾個屬性。
  7. NewsService.java,服務層。通過使用數據庫助手類完成新聞的增、刪、改、查函數以及用戶登錄驗證函數。
  8. Login.jsp,管理員登錄頁。
  9. NewsCenter.jsp,新聞首頁。
  10. NewsInfo.jsp,新聞詳情頁。
  11. operateNews.jsp,編輯頁面,如編輯新聞和修改新聞。
  12. ShowList.jsp,新聞管理中心頁面。

二、截圖

三、關鍵代碼

operateServlet.java

package com.hedong.Control;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

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

/**1、這是操作中心,包括管理員登錄、新聞的增刪改查。
 * 2、對於不同的操作,程序會去調用服務層的相應功能。
 */



/**
 * Servlet implementation class operateServlet
 */
@WebServlet("/operateServlet")
public class operateServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public operateServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		response.setCharacterEncoding("utf-8");
		
		PrintWriter out=response.getWriter();
		//獲取news參數和登錄賬號密碼參數
		String action=request.getParameter("action");
		String myType=request.getParameter("newsType");
		String myTitle=request.getParameter("newsTitle");
		String myContent=request.getParameter("editorValue");
		String writer=request.getParameter("newsWriter");
		String myID=request.getParameter("newsID");
		String User=request.getParameter("userName");
		String Password=request.getParameter("passWord");		

		
		if(action.equals("add")) {
			
			com.hedong.Service.NewsService newsService=new com.hedong.Service.NewsService();//調用服務層添加數據
			newsService.InsertNews(myType,myTitle,myContent,writer);
			response.sendRedirect("/NewsWebsite/GoPage?flag=showlist");//重新打開新聞管理頁面
			
		}else if(action.equals("dele")) {
			
			com.hedong.Service.NewsService newsService=new com.hedong.Service.NewsService();//調用服務層刪除數據
			newsService.DeleteNews(myID);
			response.sendRedirect("/NewsWebsite/GoPage?flag=showlist");//重新打開新聞管理頁面
			
		}else if(action.equals("edit")) {
			
			com.hedong.Service.NewsService newsService=new com.hedong.Service.NewsService();//調用服務層獲取數據
			newsService.EditNews(myType,myTitle,myContent,writer,myID);
			response.sendRedirect("/NewsWebsite/GoPage?flag=showlist");//重新打開新聞管理頁面
			
		}else if(action.equals("login")) {
			
			com.hedong.Service.NewsService newsService=new com.hedong.Service.NewsService();//調用服務層判斷數據
			System.out.println(User+Password);
			boolean isLogin=newsService.isUser(User,Password);
			
			
			if(isLogin) {
				//這個字符串將會在js中被接收
				//1代表登錄成功
				//2代表用戶名或密碼爲空
				//3代表用戶名或密碼錯誤
				request.getSession().setAttribute("user",User);
				out.write("1");
			
			}else if(User==""||Password==""){
				out.write("2");
			}else {
				out.write("3");
			}
				out.close();
			
		}
				
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

DBHelper.java

package com.hedong.DAL;

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

/**
 * 1、本類直接與MySQL相聯繫,包括數據庫的連接、查詢、更新、以及最後的釋放。
 */
public class DBHelper {
	
	// 此方法爲獲取數據庫連接

    public static Connection getConnection() {
        Connection conn = null;
        try {

            String driver = "com.mysql.jdbc.Driver"; // 數據庫驅動
            String url = "jdbc:mysql://localhost:3306/dbnews?useUnicode=true&characterEncoding=UTF-8";//數據庫
            String user = "root"; // 用戶名
            String password = "root"; // 密碼
            Class.forName(driver);// 加載數據庫驅動
            if (null == conn) {
                conn = DriverManager.getConnection(url, user, password);
            }

        } catch (ClassNotFoundException e) {
            System.out.println("Sorry,can't find the Driver!");
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return conn;
    }
 

    /**

     * 增刪改【Add、Del、Update】

     *

     * @param sql

     * @return int

     */

    public static int executeNonQuery(String sql) {

        int result = 0;
        Connection conn = null;
        Statement stmt = null;
        try {

            conn = getConnection();
            stmt = conn.createStatement();
            result = stmt.executeUpdate(sql);
        } catch (SQLException err) {

            err.printStackTrace();
            free(null, stmt, conn);

        } finally {
            free(null, stmt, conn);
        }

         return result;

    }

 

    /**

     * 增刪改【Add、Delete、Update】

     *

     * @param sql

     * @param obj

     * @return int

     */

    public static int executeNonQuery(String sql, Object... obj) {

        int result = 0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {

            conn = getConnection();
            pstmt = conn.prepareStatement(sql); 

            for (int i = 0; i < obj.length; i++) {
                pstmt.setObject(i + 1, obj[i]);
            }
            result = pstmt.executeUpdate();

        } catch (SQLException err) {
            err.printStackTrace();
            free(null, pstmt, conn);

        } finally {

            free(null, pstmt, conn);

        }

        return result;

    }

 

    /**

     * 查【Query】

     *

     * @param sql

     * @return ResultSet

     */

    public static ResultSet executeQuery(String sql) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {

            conn = getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);

        } catch (SQLException err) {
            err.printStackTrace();
            free(rs, stmt, conn);
        }
        return rs;

    }

 

    /**

     * 查【Query】

     *

     * @param sql

     * @param obj

     * @return ResultSet

     */

    public static ResultSet executeQuery(String sql, Object... obj) {

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {

            conn = getConnection();
            pstmt = conn.prepareStatement(sql);        
            for (int i = 0; i < obj.length; i++) {
                pstmt.setObject(i + 1, obj[i]);

            }
             rs = pstmt.executeQuery();

        } catch (SQLException err) {
            err.printStackTrace();
            free(rs, pstmt, conn);
        }
        return rs;

    }
    
    
    /**

     * 改【edit】

     *

     * @param sql

     * @param obj

     * @return ResultSet

     */

    public static int executeUpdate(String sql) {

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        int result=0;
        try {

            conn = getConnection();
            stmt = conn.createStatement();
            result = stmt.executeUpdate(sql);

        } catch (SQLException err) {
            err.printStackTrace();
            free(rs, stmt, conn);
        }
        return result;

    }
    

 

    /**

     * 判斷記錄是否存在

     *

     * @param sql

     * @return Boolean

     */

    public static Boolean isExist(String sql) {

        ResultSet rs = null;
        try {

            rs = executeQuery(sql);
            rs.last();
            int count = rs.getRow();
            if (count > 0) {
                return true;
            } else {
                return false;
            }

        } catch (SQLException err) {
            err.printStackTrace();
            free(rs);
            return false;
        } finally {
            free(rs);
        }

    }

  

    /**

     * 釋放【ResultSet】資源

     *

     * @param rs

     */

    public static void free(ResultSet rs) {

        try {
            if (rs != null) {
                rs.close();
            }

        } catch (SQLException err) {
            err.printStackTrace();
        }

    }

 

    /**

     * 釋放【Statement】資源

     *

     * @param st

     */

    public static void free(Statement st) {

        try {
            if (st != null) {
                st.close();
            }

        } catch (SQLException err) {
            err.printStackTrace();
        }
    }

 

    /**

     * 釋放【Connection】資源

     *

     * @param conn

     */

    public static void free(Connection conn) {

        try {
            if (conn != null) {
                conn.close();
            }

        } catch (SQLException err) {
            err.printStackTrace();
        }

    }
    /**

     * 釋放所有數據資源

     *

     * @param rs

     * @param st

     * @param conn

     */

    public static void free(ResultSet rs, Statement st, Connection conn) {

        free(rs);
        free(st);
        free(conn);

    }


}

NewsService.java

package com.hedong.Service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * 1、服務層。包括新聞的增、刪、改、查,以及用戶賬號密碼驗證。
 */
public class NewsService {
	
	  public void InsertNews(String myType,String myTitle,String myContent,String writer){
		  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//設置日期格式
		  String time= df.format(new Date());// new Date()爲獲取當前系統時間

		  String sql="insert into news_tb (newsType,newsTitle,newsContent,newsWriter,newsTime) values ('"+myType+"','"+myTitle+"','"+myContent+"','"+writer+"','"+time+"')";
		  int result= com.hedong.DAL.DBHelper.executeUpdate(sql);//調用數據修改層
		  if(result>0)
		  {
			  System.out.println("add sql over");
		  }		  
	  }
	  
	  public void DeleteNews(String newsID){
		  
		  String sql="delete from news_tb where newsID='"+newsID+"'";
		  int result= com.hedong.DAL.DBHelper.executeUpdate(sql);//調用數據修改層
		  if(result>0)
		  {
			  System.out.println("del sql over");
		  }		  
		  
	  }
	  
	  public void EditNews(String myType,String myTitle,String myContent,String writer,String myID){
		  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//設置日期格式
		  String time= df.format(new Date());// new Date()爲獲取當前系統時間

		  String sql="update news_tb set newsType='"+myType+"',newsTitle='"+myTitle+"' , newsContent='"+myContent+"' , newsWriter='"+writer+"',newsTime='"+time+"' where newsID='"+myID+"'";
		  int result= com.hedong.DAL.DBHelper.executeUpdate(sql);//調用數據修改層
		  if(result>0)
		  {
			  System.out.println("edit sql over");
		  }		  
	  }
	  
	  public boolean isUser(String user,String password) {
		  
		  String sql="select * from login_tb where userID='"+user+"' and passWord='"+password+"'";
		  return com.hedong.DAL.DBHelper.isExist(sql);//調用數據判斷層
	  }
	  
	  public ArrayList<com.hedong.Model.News> QueryNews()
	  {		  
		  ArrayList<com.hedong.Model.News> arrNews=new ArrayList<com.hedong.Model.News>();
		  String sql="select * from news_tb ";
		  ResultSet rs= com.hedong.DAL.DBHelper.executeQuery(sql);//調用數據訪問層
		  System.out.println("excuete sql over");
		  try {
			while(rs.next())
			  {
				  com.hedong.Model.News model=new com.hedong.Model.News();
				  model.setNewsID(rs.getInt("newsID"));
				  model.setNewsType(rs.getString("newsType"));
				  model.setNewsTitle(rs.getString("newsTitle"));
				  model.setNewsContent(rs.getString("NewsContent"));
				  model.setNewsWriter(rs.getString("newsWriter"));
				  model.setNewsTime(rs.getDate("newsTime"));
				  arrNews.add(model);
			  }
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		  return arrNews;
	  }


}

四、總結

  1. 項目中使用了UEditor編輯器用於新聞的編輯,第一次使用沒想到挺輕鬆,這是UEditor編輯器在項目中的使用方法:UEditor在JavaWeb中的應用
  2. 剛開始試圖將新聞內容一起放在url後面作爲參數傳遞給編輯修改頁面,但結果是新聞內容中包含着一些特殊符號(使用了UEditor編輯器)導致url被提前截斷。後來改進的方法是在GoPage.java中獲取新聞存入鏈表,將鏈表存入session,其他頁面只需要知道下標就能顯示出正確新聞內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章