jsp+servlet+javabean實現ssh的mvc模式


干了很久的項目都是使用SSH框架的,現在團隊有位搞美工的美女突然想要搞java了,讓我做下指導並打個基本的框架,需要使用最基本的架構,這樣說來那SSH只能滾得遠遠的了;

最基本的架構也就jsp+servlet+javabean,但心里感覺還是不爽,搞這個不是純屬浪費時間啊。后來一想,對了我自己可以不用框架來設計出一個簡單的mvc架構來實現框架帶來的分層效果:

這里我就以登錄為例子來講解下,講解的順序為v--->c---->m

頁面端:login.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>amdinLogin.html</title>
  </head>
  
  <body>
       <form action="../AdminLogin.action" method="post">
           <input type = "text" name = "username"/>
           <input type = "password" name = "password"/>
           <input type = "submit" name = "login" value = "注冊"/>
       </form>
  </body>
</html>

配置文件web.xml

    <servlet>   
        <servlet-name>controlServlet</servlet-name>   
        <servlet-class>xidian.sl.equipment.Servlet.ControlServlet</servlet-class>
<!-- 這里的配置與一般的servlet一樣,但由於整個項目只會有一個servlet,所有的訪問都將訪問這個servlet,因此不同的訪問只需要添加下面的參數即可-->
        <init-param>
                         <!-- 頁面請求的地址-->
            <param-name>AdminLogin</param-name>  
                         <!-- 處理action的后台Action地址-->
            <param-value>xidian.sl.equipment.action.LoginAction</param-value>   
        </init-param>
           <init-param>   
            <param-name>picListAction</param-name>   
            <param-value>xidian.sl.equipment.action.PicListAction</param-value>   
        </init-param>
        <init-param>   
            <param-name>newListAction</param-name>   
            <param-value>xidian.sl.equipment.action.NewListAction</param-value>   
        </init-param>
    </servlet>   
    <servlet-mapping>   
        <servlet-name>controlServlet</servlet-name>   
        <url-pattern>*.action</url-pattern>   
    </servlet-mapping> 

充當控制層的servlet:xidian.sl.equipment.Servlet.ControlServlet(很重要)

package xidian.sl.equipment.Servlet;

import java.io.IOException;

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

import xidian.sl.equipment.action.interfaces.Action;
import xidian.sl.equipment.actionfactory.ActionFactory;

public class ControlServlet extends HttpServlet{
    /**
     * 任何請求都會到這個servlet中,這個servlet就是充當MVC模式中的C(控制層)
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
                /**
                 * 得到當前Servlet的請求路徑   
                 * */
                String pathName = request.getServletPath();
                //System.out.println("pathName:"+pathName);   
                /**
                 * 得到請求的Action名字
                 * */ 
                int index = pathName.indexOf(".");   
                String ActionName = pathName.substring(1, index);   
                //System.out.println(ActionName);   
                /**
                 * 獲取運行時參數
                 * */
                String ActionClassName = this.getInitParameter(ActionName);   
                //System.out.println("actionclassName "+ ActionClassName);
                /**
                 * 得到Action對象  
                 * */
                Action action = ActionFactory.getActionFactory().getAction(ActionClassName); 
                //System.out.println("action "+action);
                /**
                 * 執行Action的execute得到要返回的URL路徑 
                 * */
                String url = action.execute(request, response); 
                if(url == null){   
                    request.getRequestDispatcher("error.jsp").forward(request, response);      
                }else{   
                    request.getRequestDispatcher(url).forward(request, response);   
                }   
    }
}

Action:面向接口編程,提供一個統一的Action接口,里面就一個方法execute();模擬struts1.x

package xidian.sl.equipment.action.interfaces;

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

public interface Action {
    /**  
     * 所有的具體Action實現這個接口  
     * @param request 請求對象  
     * @param response 應答對象  
     * @return :結果頁面  
     */  
    public String execute(HttpServletRequest request, HttpServletResponse response);   

}

LoginAction:

package xidian.sl.equipment.action;

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

import xidian.sl.equipment.action.interfaces.Action;
import xidian.sl.equipment.dao.impl.AdminDAOImpl;
import xidian.sl.equipment.dao.interfaces.AdminDAO;

public class LoginAction implements Action {

    @Override
    public String execute(HttpServletRequest request,
            HttpServletResponse response) {
             /**
              * 從request中得到相應的值
              * */  
            String username = request.getParameter("username");  
            String password = request.getParameter("password");
            /**
             * 實例化DAO層,但其實這樣做還是不完美的,最好自己寫一個依賴注入的類
             * */
            AdminDAO adminDAO = new AdminDAOImpl();
            /**
             * 返回查找后的二維數組
             * */
            String[][] data = adminDAO.findAdmin(username, password);
            if(data == null|| (data != null&& data.length == 0)){
                //數組為空,表示無此賬號存在
                return "admin/login.html";  
            } else {  
                return "admin/index.html";  
            }  
    }

}

在實現類LoginAction中實例化了AdminDAO進行持久化操作,這里為了方便起見是直接使用new進行實例化,但這樣硬編碼帶來耦合,如需要改進可以參考模擬spring的ioc
http://www.cnblogs.com/shenliang123/archive/2012/05/10/2494412.html 討論簡單工廠模式時有簡單的實現,大家可以進行改進使其更加完美

AdminDAO:

package xidian.sl.equipment.dao.interfaces;

public interface AdminDAO {
    /**
     * 根據用戶名與密碼來查找相應用戶
     * */
    public String[][] findAdmin(String username, String password);
}

AdminDAOImpl:

package xidian.sl.equipment.dao.impl;

import xidian.sl.equipment.dao.interfaces.AdminDAO;
import xidian.sl.equipment.util.DbConn;

public class AdminDAOImpl implements AdminDAO{

    @Override
    public String[][] findAdmin(String username, String password) {
        String sql = "select * from admin as ad where ad.aId = '"+username+"' and ad.aPassword = '"+password+"'";
        String[][] data = DbConn.query(sql);
        return data;
    }

}

該實現類中使用了已封裝好的數據庫操作類,詳細見:http://www.cnblogs.com/shenliang123/archive/2012/05/10/2494874.html


數據庫的設計比較簡單:只需要主鍵id, 用戶賬號:username, 賬號密碼:password

這樣就基本實現了mvc的效果,你還可以根據項目的復雜程度向DAO與Action之間再插入一層Service

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM