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