這一講海源川匯網(wǎng)絡(luò)繼續(xù)給大家講一下網(wǎng)站制作中的MVC構(gòu)架:模型-視圖-控制器結(jié)構(gòu)。
ActionRouter類
示例:/WEB-INF/classes/actions/ActionFactory.java
package actions;
import javax.servlet.GenericServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ActionRouter
{
private final String url;
private final boolean isForward;
public ActionRouter(String url)
{
this(url,true);
}
public ActionRouter(String url,boolean isForward)
{
this.url=url;
this.isForward=isForward;
}
public void route(GenericServlet servlet,HttpServletRequest req,HttpServletResponse res)
{
try
{
if (isForward)
{
//req.getRequestDispatcher(res.encodeURL(url)).forward(req,res);
//req.getRequestDispatcher(res.encodeURL("/index.jsp")).forward(req,res);
servlet.getServletContext().getRequestDispatcher(res.encodeURL(url)).forward(req,res);
}
else
{
res.sendRedirect(res.encodeRedirectURL(url));
}
}
catch(Exception e)
{
System.out.print(e);
}
}
}
操作路徑選擇器功能是轉(zhuǎn)發(fā)或重定向請(qǐng)求。(所有類均可在\Tomcat 4.1\common\lib\ servlet.jar包中找到。)
導(dǎo)讀:
前提知識(shí):Servlet的軟件包:打開Tomcat 4.1下的Servlet.jar我們發(fā)現(xiàn)Servlet包主要由javax.Servlet和javax.Servlet.http和javax.Servlet.jsp三個(gè)包
組成,javax.Servlet.jsp這里就不計(jì)論。前兩種包的所包含的方法和接口如下表所示:
包 提供的接口 提供的方法
javax.Servlet RequestDispatcher接口Servlet接口ServletConfig接口ServletContext接口ServletRequest接口ServletResponse接口SingleThreadModel接口 GenericServlet類ServletInputStream類ServletOutputStream類ServletException類UnavailableException類 javax.Servlet.http HttpServletRequest接口HttpServletResponse接口HttpSession接口HttpSessionContext接口HttpSessionBindingListener接口 Cookie類HttpServlet類HttpSessionBindingEvent類HttpUtils類
繼承關(guān)系示例:
java.lang.Object
|
+--javax.servlet.GenericServlet
|
+--javax.servlet.http.HttpServlet
|
+--org.apache.struts.action.ActionServlet
1、GenericServlet類
Public abstract class GenericServlet implants Servlet
此類提供了servlet接口的基本實(shí)現(xiàn)部分,其service()方法被申明為abstract,因此需要被派生。init(ServletConfig conf)方法把servletConfig對(duì)象存儲(chǔ)
在一個(gè)private transient(私有臨時(shí))實(shí)例變量里,getServletConfig()方法返回指向本對(duì)象的指針,如果你重載此方法,將不能使用
getServletConfig來獲得ServletConfig對(duì)象,如果確實(shí)想重載,記住要包含對(duì)super.config的調(diào)用。2.1版的API提供一個(gè)重載的沒有參數(shù)的init()方法
。現(xiàn)在在init(ServletConfig)方法結(jié)束時(shí)有一個(gè)對(duì)init()的調(diào)用,盡管目前它是空的。2.1版API里面,此類實(shí)現(xiàn)了ServletConfig接口,這使得開發(fā)者不
用獲得ServletConfig對(duì)象情況下直接調(diào)用ServletConfig的方法,這些方法是:
getInitParameter(),getInitParameterNames(),getServletContext()。此類還包含兩個(gè)寫日志的方法,它們實(shí)際上調(diào)用的是ServletContext上的對(duì)應(yīng)
方法。log(String msg)方法將servlet的名稱和msg參數(shù)寫到容器的日志中,log(String msg,Throwable cause)除了包含servlet外還包含一個(gè)異常。
2、HttpServlet類:該類擴(kuò)展了GenericServlet類并對(duì)servlet接口提供了為處理 HTML 表單提供了專門的方法。例:
service():
protected void service(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
public void service(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
該方法作為HTTP請(qǐng)求的分發(fā)器,這個(gè)方法在任何時(shí)候都不能被重載。當(dāng)請(qǐng)求到來時(shí),service()方法決定請(qǐng)求的類型
(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把請(qǐng)求分發(fā)給相應(yīng)的處理方法(doGet(),doPost(),doHead(),doOptions(),doDelete
(),doPut(),doTrace())每個(gè)do方法具有和第一個(gè)service()相同的形式。為了響應(yīng)特定類型的HTTP請(qǐng)求,我們必須重載相應(yīng)的do方法。如果servlet
收到一個(gè)HTTP請(qǐng)求而你沒有重載相應(yīng)的do方法,它就返回一個(gè)說明此方法對(duì)本資源不可用的標(biāo)準(zhǔn)HTTP錯(cuò)誤。
HttpServlet類的init()方法、service()方法和destroy()方法,這三種方法表示了了一個(gè)servlet 的生命周期。即初始化時(shí)期、執(zhí)行時(shí)期、結(jié)束時(shí)
期。
3、HttpServletRequest接口:所有實(shí)現(xiàn)此接口的對(duì)象(例如從servlet容器傳遞的HTTP請(qǐng)求對(duì)象)都能讓servlet通過自己的方法訪問所有請(qǐng)求的數(shù)
據(jù)。下面是一些用來獲取表單數(shù)據(jù)的基本方法。其中定義的主要方法有:
a、 getParameter() =>public String getParameter(String key)
b、 getParameterValues()=> public String[] getParameterValues(String key) 如果一個(gè)參數(shù)可以返回多個(gè)值,比如復(fù)選框集合,則可以用此方法
獲得對(duì)應(yīng)參數(shù)的所有值。如果請(qǐng)求信息中沒有指定參數(shù),則返回null。
c、 GetParameterNames()=> Public Enumeration getParameterNames()此方法返回一個(gè)Enumeration對(duì)象,包含對(duì)應(yīng)請(qǐng)求的所有參數(shù)名字列表。
d、 獲得傳入路徑的方法:例:
http://localhost:7001/myservlet/somepath/test?someparam=somevaluerequest.getPathInfo():返回/somepath/test
request.getRequestURL():http://localhost:7001/myservlet/somepath/test
request.getRequestURI():返回/myservlet/somepath/test
request.getServletPath():返回/myservlet
request.getQueryString():返回someparam=somevalue
4、HttpServletResponse接口:servlet容器提供一個(gè)實(shí)現(xiàn)該接口的對(duì)象并通過service()方法將它傳遞給servlet。通過此對(duì)象及其方法,servlet可以
修改響應(yīng)頭并返回結(jié)果。其中定義的主要方法有:
a、 setContentType()=> public void setContentType(String type) 在給調(diào)用者發(fā)回響應(yīng)前,必須用此方法來設(shè)置HTTP響應(yīng)的MIME類型。可以是
任何有效的MIME類型,當(dāng)給瀏覽器返回HTML是就是”text/html”類型。
b、 getWriter()=>public PrintWriter getWriter()throws IOException此方法將返回PrintWriter對(duì)象,把servlet的結(jié)果作為文本返回給調(diào)用者。
PrintWriter對(duì)象自動(dòng)把Java內(nèi)部的UniCode編碼字符轉(zhuǎn)換成正確的編碼以使客戶端能夠閱讀。
c、 getOutputStream()=>public ServletOutputStream getOutputStream() throws IOException此方法返回ServletOutputStream對(duì)象,它是
java.io.OutputStream的一個(gè)子類。此對(duì)象向客戶發(fā)送二進(jìn)制數(shù)據(jù)。
d、 setHeader()=>public void setHeader(String name,String value) 此方法用來設(shè)置送回給客戶的HTTP響應(yīng)頭。有一些快捷的方法用來改變某些
常用的響應(yīng)頭,但有時(shí)也需要直接調(diào)用此方法。
5、javax.servlet.ServletContext接口: 安裝在一個(gè)服務(wù)器中的一個(gè)特定URL名字空間(比,/myapplication)下的所有Servlet,JSP,JavaBean等
Web部件的集合構(gòu)成了一個(gè)Web的應(yīng)用,每一個(gè)Web應(yīng)用(同一JVM),容器都會(huì)有一個(gè)背景對(duì)象,而javax.servlet.ServletContext接口就提供了訪
問這個(gè)背景對(duì)象的途徑。
Servlet實(shí)例的getServletContext方法: 得到該Servlet運(yùn)行其中的這個(gè)背景對(duì)象。從這個(gè)背景對(duì)象中你可以訪問如下信息或資源:(注意該方法不是
ServletContext的方法而是獲取背景對(duì)象的方法由于HttpServlet繼承Servlet的關(guān)系GenericServlet類和HttpServlet類同時(shí)具有該方法)
· 初始化參數(shù) ServletContext.getInitParameter(String name)。
· 存儲(chǔ)在背境中的對(duì)象 context.getAttribute(String name)
· 與本背景關(guān)聯(lián)的資源 ServletContext.getResource(String path)
· 日志 ServletContext.log(String msg)
以上所示方法均為ServletContext所提供,值得一提的是對(duì)于存儲(chǔ)在背境中的對(duì)象訪問方法常用的還有:
context.setAttribute(String name, Object object);將特定名字綁定的任意類型的對(duì)象上。將把object對(duì)象綁定到名字name,存放在Servlet背景
中,可供同一背景中的其他Servlet共享。其他Servlet可以通過context.getAttribute(String name),得到一個(gè)背景中的對(duì)象,或通過
context.removeAttribute(String name)在背景中移除一個(gè)對(duì)象。
getRequestDispatcher方法:它的作用將一個(gè)包含路徑的String傳遞給其它資源。該路徑是相對(duì)于ServletContext的根路徑的。.方法示例:
RequestDispatcher rd = request.getRequestDispatcher("SecondServlet");
rd.forward(request, response);.
該方法主要用于服務(wù)器重定向技術(shù)上,servlet中重定向的方法主要有兩種分別由ServletContext接口和ServletRequest接口提供但二者提供的同名方
法getRequestDispatcher卻有很大的不同。在ActionRouter類示例中//req.getRequestDispatcher(res.encodeURL(url)).forward(req,res);表示的用
ServletRequest接口提供方法進(jìn)行重定向的。
以上是海源川匯對(duì)網(wǎng)站制作中的MVC構(gòu)架第二講的內(nèi)容,希望大家好好消化吸收。