1. SpringMVC與Servlet的關係html
SpringMVC框架是創建在Servlet之上的,提供各類功能,各類封裝,各類方便的同時,它一點兒也沒有限制Servlet,咱們徹底能夠在SpringMVC的controller中,徹底按照Servlet的方式來寫代碼,同時還享受SpringMVC提供的方便。因此咱們徹底沒有理由再使用Servlet了。web
2. SpringMVC 返回 html 視圖頁面spring
SpringMVC的controller通常咱們能夠配置返回:jsp, json, Velocity, FreeMarker, XML, PDF, Excel等等視圖。那麼如何返回到 html 視圖呢?固然通常咱們沒有這種必要,可是有一些奇葩場景仍是存在的。json
上面咱們知道SpringMVC沒有限制對Servlet有任何的限制,咱們徹底能夠在controller中寫servlet形式的代碼,而咱們知道,咱們在Servlet中能夠經過 轉發和重定向到 html 類型的頁面,因此咱們也能夠在SpringMVC的controller中利用request的轉發和response的重定向到html頁面,也能夠利用PrintWriter直接輸出html字符流。這些Servlet中的用法,咱們徹底能夠在SpringMVC中使用。瀏覽器
@RequestMapping(value="/htmlView") public void htmlView(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // ... // request.getRequestDispatcher("index.html").forward(request, response); response.sendRedirect("http://www.baidu.com"); }
@RequestMapping(value="/getPage") public void writeSubmitHtml(Reader reader, Writer writer, HttpSession session) throws IOException { User user = (User) session.getAttribute(ConstantConfig.LONGIN_USER); StringBuffer sbHtml = new StringBuffer(); sbHtml.append("<!doctype html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"); sbHtml.append("<title>支付寶即時到帳交易接口</title></head><body>"+ user.getNo() +"</body></html>"); writer.write(sbHtml.toString()); }
上面分別使用 request的轉發和response的重定向,以及PrintWriter直接輸出html字符流,到達springMVC返回 html 類型視圖的目的。服務器
3. Servlet重定向與轉發session
下面的文字,轉自:http://blog.sina.com.cn/s/blog_7ffb8dd501013tbg.htmlapp
1、請求轉發與響應重定向的種類框架
有兩種方式得到Servlet 轉發對象(RequestDispatcher):jsp
一種是經過HttpServletRequest的getRequestDispatcher()方法得到,
一種是經過ServletContext的getRequestDispatcher()方法得到。
Servlet 重定向的方法只有一種:HttpServletResponse的sendRedirect()方法。
這三個方法的參數都是一個URL形式的字符串,但在使用相對路徑或絕對路徑上有所區別。
2、請求轉發與響應重定向中路徑參數區別
假設經過http://localhost/myApp/cool/bar.do 請求到達該方法所屬的Servlet。
一、響應重定向 ◆ HttpServletResponse.sendRedirect(String)
參數能夠指定爲相對路徑、絕對路徑或其它Web應用。
i:相對路徑:response.sendRedirect("foo/stuff.do"),容器相對於原來請求URL的目錄加參數來生成完整的URL——http://localhost/myApp/cool/foo/stuff.do。
ii:絕對路徑:response.sendRedirect("/foo/stuff.do"),容器相對於Web應用自己加參數創建完整的URL,這是由於重定向response.sendRedirect("")是服務器向客戶端發送一個請求頭信息,由客戶端再請求一次服務器,請求是在服務器外進行的,
因此完整的url是——http://localhost/foo/stuff.do。
iii:其它Web應用:response.sendRedirect("http://www.xxx.com ")容器直接定向到該URL。
二、請求轉發 ◆HttpServletRequest.getRequestDispatcher(String)
參數能夠指定爲相對路徑或絕對路徑。
i:相對路徑狀況下生成的完整URL與重定向方法相同。
ii:絕對路徑與Servlet重定向不一樣,容器將相對於Web應用的根目錄加參數生成完整的URL(即「/」根路徑就是相對於虛擬路徑)這是由於轉發是在服務器內部進行的,寫絕對路徑/開頭指的是當前的Web應用程序。即:
request.getRequestDispatcher("/foo/stuff.do")生成的URL是http://localhost/myApp/foo/stuff.do 。
三、 ◆ ServletContext.getRequestDispatcher(String)
參數只能指定爲絕對路徑,生成的完整URL與HttpServletRequest.getRequestDispatcher(String)相同。
##################################
同理:
例如在web.xml中註冊以下的servlet:
<servlet>
<servlet-name>addStudent</servlet-name>
<servlet-class>org.mytest.addStudent</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addStudent</servlet-name>
<url-pattern>/servlet/addStudent</url-pattern>
</servlet-mapping>
假如說,你工程名字爲HibernateApp3,JSP頁面提交表單給servlet時有兩種寫法:
1.相對路徑: <form action=servlet/addStudent method=post>...</form>
2. 絕對路徑: <form action="/HibernateApp3/servlet/addStudent" method=post>...</form>
或者 <form action="<%=request.getContextPath() %>/servlet/addStudent" method=post>...</form>
注意:/表明根目錄,若是路徑是使用/開頭,Tomcat就是webApp那個目錄,若是你不是/開頭表明你從當前工程的目錄開始,例如:webApp/HibernateApp3/
這一點很是重要,不少提交表單時發生的錯誤都是由於提交路徑出錯形成的。
附、<a href>的路徑若是是"/"開頭,則表示相對於主機,若是不是則表示相對於當前請求
綜上所述:
這裏最最關鍵的要能清楚發出請求目的資源的請求是在服務器內部仍是服務器外部:內部時,「/」就是項目的虛擬目錄;外部時,「/」就是表明主機的根目錄
注意:response.sendRedirect 是先返回瀏覽器,再由瀏覽器從新定向到某個頁面,因此他能夠重定向到任何頁面,包括其它站點的頁面,好比從咱們本身的網站,重定向到http://www.baidu.com 都是能夠的,這是有其原理決定的。