欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
CMS項目總結:7、利用抽象工廠(chǎng)創(chuàng )建DAO、利用依賴(lài)注入去除客戶(hù)端對工廠(chǎng)的直接依賴(lài)、將有關(guān)Article的各種Servlet封裝到一個(gè)Servlet中(通過(guò)BaseServlet進(jìn)行

利用抽象工廠(chǎng)創(chuàng )建DAO、利用依賴(lài)注入去除客戶(hù)端對工廠(chǎng)的直接依賴(lài)、將有關(guān)Article的各種Servlet全部封裝到一個(gè)Servlet中(通過(guò)BaseServlet來(lái)進(jìn)行ArticleServlet方法的導向)

(這篇文章中只總結了ArticleServlet,而并沒(méi)有分析ChannelServlet,兩者其實(shí)差不多,關(guān)于ArticleServlet的基本都可以用于ChannelServlet的分析

總體分析:

1、利用PropertiesBeanFactory抽象工廠(chǎng)根據beans.properties配置文件創(chuàng )建各種DAO,放入ServletContext中。

2、在BaseServlet中(實(shí)際上用戶(hù)訪(fǎng)問(wèn)的是繼承了BaseServletArticleServlet、…)根據屬性PropertiesBeanFactory取出ArticleServlet、…需要的DAO,向具體ArticleServlet、ChannelServlet、LoginServlet注入需要的某些DAO,以避免客戶(hù)端直接依賴(lài)于具體的DAO實(shí)現類(lèi)。

3、將各種關(guān)于Article功能的Servlet全部集中到一個(gè)ArticleServlet中(關(guān)于Channel功能的Servlet全部集中到一個(gè)ChannelServlet中、……),通過(guò)BaseServlet中的process()方法實(shí)現導向ArticleServletChannelServlet…)中的不同方法(add()、del()、update()、…方法)的功能(即原先的直接訪(fǎng)問(wèn)各種AddArticleServlet、DelArticleServlet、UpdateArticleServlet、…)。

1、利用PropertiesBeanFactory抽象工廠(chǎng)根據beans.properties配置文件創(chuàng )建各種DAO,放入ServletContext中。。

大體的思路是這樣的:

首先在web.xml中定義

  <servlet>

    <servlet-name>InitBeanFactoryServlet</servlet-name>

<servlet-class>cn.com.leadfar.cms.backend.view.InitBeanFactoryServlet</servlet-class>

    <init-param>

    <param-name>configLocation</param-name>

    <param-value>beans.properties</param-value>

    </init-param>

    <load-on-startup>0</load-on-startup>

  </servlet>

1、<load-on-startup>表示容器是否在啟動(dòng)的時(shí)候就加載這個(gè)servlet(實(shí)例化并調用其init()方法);

2、它的值必須是一個(gè)整數,表示該servlet應該被載入的順序;

3、當值為0或者大于0時(shí),表示容器在啟動(dòng)時(shí)加載并初始化這個(gè)servlet;當值小于0或者沒(méi)有指定時(shí),表示容器在該servlet被使用時(shí)才去加載(即用戶(hù)第一次請求時(shí));

4、正數的值越小,該servlet的優(yōu)先級越高,應用啟動(dòng)時(shí)就越先加載;

5、當值相同時(shí),容器會(huì )自己選擇順序來(lái)加載。

由于<load-on-startup>0</load-on-startup>,所以首先實(shí)例化并調用InitBeanFactoryServlet這個(gè)servlet的init()方法,同時(shí)配置了init-param。

     在InitBeanFactoryServletString中,通過(guò)String  configLocation = config.getInitParameter("configLocation");取出param-valuebeans.properties賦值給configLocation ,通過(guò)執行factory = new PropertiesBeanFactory(configLocation);創(chuàng )建PropertiesBeanFactory對象(PropertiesBeanFactory實(shí)現了BeanFactory接口,因為BeanFactory不一定都是通過(guò)Properties配置文件來(lái)創(chuàng )建bean產(chǎn)品的)。

 

Beans.propertiesproperties類(lèi)型的配置文件)的內容為:

HashMap是線(xiàn)程不安全的對象,而Hashtable<>是線(xiàn)程安全的對象。

public class Hashtable<K,V> 

extends Dictionary<K,V> 

implements Map<K,V>, Cloneable, java.io.Serializable {}

Properties extends Hashtable<Object,Object>繼承了Hashtable,它有更強大的功能,Properties 調用load方法(HashMap、Hashtable中沒(méi)有load方法),可以直接讀取文件,而且可以將文件中的鍵值對直接放到Map中來(lái)(Properties就是一個(gè)Map),props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(configurationFile));由于PropertiesMap沒(méi)有iterator方法,iteratorcollectionSet、List特有的)沒(méi)有iterator方法,所以

因為DAO是無(wú)狀態(tài)的(即~~~,得上網(wǎng)補齊),所以在最開(kāi)始的時(shí)候就根據Beans.properties文件的配置率先把所有需要用到的DAO全創(chuàng )建好,同時(shí)beans.put(key, bean)//緩存DAO對象,將創(chuàng )建的DAO放到PropertiesBeanFactory中的Map中。

創(chuàng )建完PropertiesBeanFactory對象后,InitBeanFactoryServletString調用getServletContext().setAttribute(INIT_FACTORY_NAME, factory);PropertiesBeanFactory放入ServletContext中(ServletContextservlet中范圍最大的~~~不會(huì )寫(xiě)了,從網(wǎng)上看看這句話(huà)怎么寫(xiě)吧),意即所有的servlet全能訪(fǎng)問(wèn)到這個(gè)PropertiesBeanFactory(以及它里面的各種DAO),即單例化了DAO,而不需要在每個(gè)servlet中都new一個(gè)DAO。

接下來(lái)分析DAO

這個(gè)DAO是關(guān)于CRUD Article對象對應的數據庫中的article表的DAO,article表可能建立在MySQL、Oracle、DB2、SQL server中…,所以ArticleDao是個(gè)接口,而有ArticleDaoImplMySQL)和ArticleDaoImplForOracle…等等實(shí)現了ArticleDao接口的具體Dao。

接下來(lái)分析ArticleDaoImpl(都是最簡(jiǎn)單的CRUD,后面會(huì )用MyBatis更好的實(shí)現,當然我看Hibernate也不錯,學(xué)著(zhù)看吧):

2、在BaseServlet中(實(shí)際上用戶(hù)訪(fǎng)問(wèn)的是繼承了BaseServletArticleServlet、…)根據屬性PropertiesBeanFactory取出ArticleServlet、…需要的DAO,向具體ArticleServlet、ChannelServlet、LoginServlet注入需要的某些DAO,以避免客戶(hù)端直接依賴(lài)于具體的DAO實(shí)現類(lèi)。

接下來(lái)分析ArticleServlet以及BaseServlet

原先有AddArticleServlet、DelArticleServlet、OpenUpdateArticleServlet、UpdateArticleServlet、SearchArticleServlet…一堆關(guān)于Articleservlet,現在將與Article有關(guān)的Servlet全部合成到ArticleServlet類(lèi)中將與Channel有關(guān)的Servlet全部合成到ChannelServlet類(lèi)中)。

BaseServlet的代碼:

ArticleServlet繼承BaseServlet,任何servlet都有一個(gè)唯一的入口,即service()方法。BaseServletservice()方法中,實(shí)現了向ArticleServlet注入ArticleDaoImpl的功能(ChannelServlet注入ChannelDaoImpl、向LoginServlet注入AdminDaoImpl)

。

首先先從ServletContext中取出BeanFactory,BeanFactory factory = (BeanFactory)getServletContext().getAttribute(InitBeanFactoryServlet.INIT_FACTORY_NAME);

Method[] methods = this.getClass().getMethods();這里的this雖然是在BaseServletservice中寫(xiě)的,但實(shí)際上是用戶(hù)訪(fǎng)問(wèn)的是ArticleServlet,this表示的是ArticleServletArticleServlet繼承了BaseServlet,而ArticleServlet并沒(méi)有重寫(xiě)service()方法)。this.getClass().getMethods()即得到了ArticleServlet中的方法,

if(m.getName().startsWith("set"))的意思即判斷方法名是不是以set開(kāi)頭,如果是,就可能是setArticleDao()方法之類(lèi)的了(看ArticleServlet的代碼就懂了),String propertyName = m.getName().substring(3);將前面的set三個(gè)字符截掉,得到ArticleDao,接下來(lái):

StringBuffer sb = new StringBuffer(propertyName);

sb.replace(0, 1, (propertyName.charAt(0)+"").toLowerCase());

propertyName = sb.toString();

Object bean = factory.getBean(propertyName);

ArticleDao轉換為articleDao,賦值給propertyName,通過(guò)propertyName參數名,來(lái)從InitBeanFactoryServlet中獲取articleDao名對應的cn.com.leadfar.cms.backend.dao.impl.ArticleDaoImpl對象。

約定:setters方法所決定的屬性(property)名articleDao,與配置文件Beans.properties中相應的對象命名articleDao一致!

m.invoke(this, bean);最后這句是將依賴(lài)對象注入客戶(hù)端,m.invoke()中第一個(gè)參數是要調用的對象,this表示ArticleServlet,后邊的beanbean即為cn.com.leadfar.cms.backend.dao.impl.ArticleDaoImpl)是要調用的方法的參數,實(shí)際上相當于調用ArticleServlet對象的setArticleDaocn.com.leadfar.cms.backend.dao.impl.ArticleDaoImpl)方法。

ArticleServletArticleDao屬性運用了DI(Dependency Injection依賴(lài)注入)的方法,即ArticleServlet對象不自己設置自己的ArticleDao屬性,而是依賴(lài)~~~注入。

3、將各種關(guān)于Article功能的Servlet全部集中到一個(gè)ArticleServlet中(關(guān)于Channel功能的Servlet全部集中到一個(gè)ChannelServlet中、……),通過(guò)BaseServlet中的process()方法實(shí)現導向ArticleServletChannelServlet…)中的不同方法(add()、del()、update()、…方法)的功能(即原先的直接訪(fǎng)問(wèn)各種AddArticleServlet、DelArticleServlet、UpdateArticleServlet、…)。

原先有AddArticleServlet、DelArticleServlet、OpenUpdateArticleServlet、UpdateArticleServlet、SearchArticleServlet…一堆關(guān)于Articleservlet,現在將與Article有關(guān)的Servlet全部合成到ArticleServlet類(lèi)中將與Channel有關(guān)的Servlet全部合成到ChannelServlet類(lèi)中)。

super.service(arg0, arg1);的意思是執行父類(lèi)HttpServlet的職責:根據請求是GET還是POST方法,調用doGet或doPost!但在doGet或doPost()方法中只是簡(jiǎn)單的導向執行process(req,resp);方法,而ArticleServlet也并沒(méi)有重寫(xiě)doGet()、doPost()、

process(req,resp)方法,

用戶(hù)訪(fǎng)問(wèn)ArticleServletArticleServlet?add、ArticleServlet?del、ArticleServlet?update…,

String method = request.getParameter("method");即取出add、del、update。

如果客戶(hù)端只是ArticleServlet不傳遞method參數,則默認調用execute()方法,即查詢(xún)操作。BaseServletexecute()方法什么也不做,但是ArticleServlet有重寫(xiě)了這個(gè)方法,在這個(gè)方法中執行查詢(xún)工作。

在這里并沒(méi)有用

if(method.equals("add")) {

//執行添加動(dòng)作,同時(shí)執行完成之后,轉向成功頁(yè)面

}else if(method.equals("del")) {

//執行刪除界面…

}else if(method.equals("update")) {

//執行更新界面…

}

而是使用了反射機制,更便捷的實(shí)現了功能:

Method m = this.getClass().getMethod(method, HttpServletRequest.class,HttpServletResponse.class);

獲取ArticleServlet中的add、del、update…之類(lèi)的方法。

m.invoke(this, request,response);

m.invoke()中第一個(gè)參數是要調用的對象,this表示ArticleServlet,后邊的request,response是要調用的方法的參數,實(shí)際上相當于調用ArticleServlet對象的add(HttpServletRequest request, HttpServletResponse response)…之類(lèi)的方法。

接下來(lái)該分析ArticleServlet的代碼了,其實(shí)也沒(méi)啥可分析的,就是從request中獲取客戶(hù)端傳過(guò)來(lái)的參數,然后調用articleDao的相應CRUD方法

關(guān)于del(HttpServletRequest request, HttpServletResponse response)方法有個(gè)小注意點(diǎn):如果執行完刪除操作后,轉向頁(yè)面語(yǔ)句寫(xiě)成:request.getRequestDispatcher("/backend/ArticleServlet").forward(request, response);因為forward服務(wù)器端重定向時(shí)request中的數據不會(huì )丟失,雖然表面上寫(xiě)的是轉向/backend/ArticleServlet頁(yè)面,實(shí)際上還是/backend/ArticleServlet?method=del&id=…頁(yè)面。所以我們這里需要寫(xiě)成redirect重定向:response.sendRedirect(request.getContextPath()+"/backend/ArticleServlet");

在添加頁(yè)面add_article.jsp中,提交時(shí)并沒(méi)有寫(xiě)成

<form action="ArticleServlet?method=add" method="post">

而是寫(xiě)成:

<form action="ArticleServlet" method="post">

<input type="hidden" name="method" value="add">

其實(shí)兩者都對,但在post提交的方式中一般不在action后面再加method=add參數,而是將這參數寫(xiě)成隱含參數。當然需要用戶(hù)輸入的參數肯定也是寫(xiě)成<input type="text" name="title" id="title" value="" size="60" maxlength="200" />這種格式。

在更新界面update_article.jsp中這么寫(xiě):

<form action="ArticleServlet" method="post">

<input type="hidden" name="id" value="${article.id }">

<input type="hidden" name="method" value="update">

4、關(guān)于LoginServlet的一些小分析

將LoginServlet、LogoutServlet、CheckCodeServlet這些與登錄有關(guān)的Servlet,全部合成到LoginServlet中(LoginServlet也繼承了BaseServlet)!

- LoginServlet中的方法checkcode用于生成驗證碼

- LoginServlet中的方法execute用于登錄用戶(hù)名和密碼驗證

- LoginServlet中的方法quit用于退出后臺系統

servlet重寫(xiě)init(ServletConfig)方法的時(shí)候,記得調用super.init(ServletConfig),調用super.init(ServletConfig)的目的,主要是由于在父類(lèi)(GenericServlet)中有一個(gè)ServletConfig實(shí)例變量,super.init(ServletConfig)就是給這個(gè)實(shí)例變量賦值。這樣,在后續的getServletContext()操作,才可以拿到ServletContext對象:

GenericServlet的部分源代碼如下所示:

----------------------------------------------------

public abstract class GenericServlet 

    implements Servlet, ServletConfig, java.io.Serializable

{

    private transient ServletConfig config;

    

    public void init(ServletConfig config) throws ServletException {

this.config = config;

this.init();

    }

    public void init() throws ServletException {

    }    

    public ServletConfig getServletConfig() {

return config;

    }

    public ServletContext getServletContext() {

return getServletConfig().getServletContext();

    }

-----------------------------------------------------    

login.jsp頁(yè)面中還有一個(gè)小知識點(diǎn):

function reloadcheckcode(img){

img.src = "LoginServlet?method=checkcode&"+Math.random();

}

在重新載入驗證碼時(shí),只需在后面加個(gè)&"+Math.random()隨機數,系統即會(huì )自動(dòng)調用LoginServletcheckcode()方法(注意“&”符號)。

下面的是LoginServlet的代碼:

 

    本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
    打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
    猜你喜歡
    類(lèi)似文章
    Ajax+jsp用戶(hù)登陸例子
    servlet、jsp跳轉(傳值)總結及URL傳參數
    SSH實(shí)現的增刪改查實(shí)例
    SpringMvc和servlet簡(jiǎn)單對比介紹
    【JavaWeb】103:用戶(hù)注冊功能的實(shí)現
    可以自動(dòng)跳轉到出錯頁(yè)面的servlet/jsp框架
    更多類(lèi)似文章 >>
    生活服務(wù)
    分享 收藏 導長(cháng)圖 關(guān)注 下載文章
    綁定賬號成功
    后續可登錄賬號暢享VIP特權!
    如果VIP功能使用有故障,
    可點(diǎn)擊這里聯(lián)系客服!

    聯(lián)系客服

    欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久