這一講海源川匯繼續(xù)給大家講一下網(wǎng)站制作中的MVC構(gòu)架:模型-視圖-控制器結(jié)構(gòu)。
操作Servlet
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
部署信息把以.do結(jié)尾的URL映射到操作的servlet.JSP頁面在引用的方法為:
<form name="form1" method="post"
action="<%=response.encodeURL("actions.LoginAction.do")%>">
用Servlet把URL映射到操作類
示例:ActionServlet類 /WEB-INF/classes/ ActionServlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import actions.Action;
import actions.ActionRouter;
import actions.ActionFactory;
public class ActionServlet extends HttpServlet
{
private ActionFactory factory=new ActionFactory();
public void init(ServletConfig config) throws ServletException
{
/*根據(jù)ActionRouter類導(dǎo)讀內(nèi)容中對HttpServlet類的描述來看,HttpServlet規(guī)定了必須執(zhí)行的方法,該時期調(diào)用了init()方法,當(dāng)Servlet
被Servlet引擎載入后,接下來就會執(zhí)行init()這個方法,因此我們可以重載這個方法以做一些我們自己的初始化的工作。在Servlet的生命期
中,init()方法僅在服務(wù)器裝入Servlet時被執(zhí)行一次,此后無論有多少客戶機(jī)訪問這個Servlet,init()都不會被重復(fù)執(zhí)行。*/
}
public void service(HttpServletRequest req, HttpServletResponse res)
throws java.io.IOException, ServletException
{
/*在Servlet被載入后,主要通過service()方法對外響應(yīng),該方法可以被同時、多次地呼叫。*/
try
{
Action action=factory.getAction(getClassname(req),getClass().getClassLoader());
ActionRouter router=action.perform(this,req,res);
router.route(this,req,res);
}
catch(Exception e)
{
throw new ServletException(e);
}
}
public String getClassname(HttpServletRequest req)
{
String Path=req.getServletPath();
int beginPos=Path.lastIndexOf("/");
int endPos=Path.lastIndexOf(".");
if (beginPos>-1 && endPos>beginPos)
{
Path=Path.substring(beginPos+1,endPos);
}
return Path;
}
}
該類的service方法實(shí)現(xiàn)了:從操作庫中獲取操作,然后調(diào)用接口的perform方法。由perform的實(shí)現(xiàn)返回一個操作路徑,最后由
ActionRouter類的route方法進(jìn)行重定向操作。達(dá)到頁面跳轉(zhuǎn)的作用。
導(dǎo)讀:getClassname(req)將獲取操作類名,過程如下:
由req.getServletPath()獲取servlet的路徑為/ actions.LoginAction.do通過截取得到類名:actions.LoginAction。
getClass().getClassLoader():getClass()方法是類的一個方法,主要用于返回一個類型為Class的對象。該例中返回為:class
ActionServlet
GetClassLoader()是Class類的一個方法,返回為ClassLoader對象。本例返回為:sun.misc.Launcher$AppClassLoader@92e78c。這說明
加載ActionServlet類的類的加載者(classLoader的翻譯)為AppClassLoader.那么AppClassLoader又是什么呢?下面我們來解答該問題:
首先要明確java虛擬機(jī)上所有的類,必須要加載才能運(yùn)行。JVM在運(yùn)行時會產(chǎn)生三個ClassLoader, 它們分別是Bootstrap ClassLoader、
Extension ClassLoader和AppClassLoader:
ClassLoader 作 用
Bootstrap ClassLoader 加載核心類庫static const char classpathFormat[]
="%/lib/rt.jar:""%/lib/i18n.jar:""%/lib/sunrsasign.jar:""%/lib/jsse.jar:""%/lib/jce.jar:""%/lib/charsets.jar:""%/classes";這里我們可看到為
什么在classpath里為什么不加載這些類
Extension ClassLoader 加載擴(kuò)展類,即/lib/ext中的類。
AppClassLoader 加載Classpath中指定的類。
從上面可以看出,所有web應(yīng)用程序的類都是AppClassLoader來加載的,三者的關(guān)系為:AppClassLoader的Parent是ExtClassLoader,而
ExtClassLoader的Parent為Bootstrap ClassLoader。加載一個類時,首先BootStrap先進(jìn)行尋找,找不到再由ExtClassLoader尋找,最后才
是AppClassLoader。ClassLoader這種加載類的模型被稱為是委托模型。
以上是海源川匯對網(wǎng)站制作中的MVC構(gòu)架第三講的內(nèi)容,希望大家好好消化吸收。