国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 編程應(yīng)用 > 正文

SpringMVC 返回 html 視圖頁面,SpringMVC與Servlet,Servlet重定向與轉(zhuǎn)發(fā)

2019-11-15 01:15:25
字體:
供稿:網(wǎng)友
SPRingMVC 返回 html 視圖頁面,SpringMVC與Servlet,Servlet重定向與轉(zhuǎn)發(fā)

1. SpringMVC與Servlet的關(guān)系

SpringMVC框架是建立在Servlet之上的,提供各種功能,各種封裝,各種方便的同時,它一點兒也沒有限制Servlet,我們完全可以在SpringMVC的controller中,完全按照Servlet的方式來寫代碼,同時還享受SpringMVC提供的方便。所以我們完全沒有理由再使用Servlet了。

2. SpringMVC 返回 html 視圖頁面

SpringMVC的controller一般我們可以配置返回:jsp, json, Velocity, FreeMarker, xml, PDF, Excel等等視圖。那么如何返回到 html 視圖呢?當(dāng)然一般我們沒有這種必要,但是有一些奇葩場景還是存在的。

上面我們知道SpringMVC沒有限制對Servlet有任何的限制,我們完全可以在controller中寫servlet形式的代碼,而我們知道,我們在Servlet中可以通過 轉(zhuǎn)發(fā)和重定向到 html 類型的頁面,所以我們也可以在SpringMVC的controller中利用request的轉(zhuǎn)發(fā)和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的轉(zhuǎn)發(fā)和response的重定向,以及PrintWriter直接輸出html字符流,到達springMVC返回 html 類型視圖的目的。

3. Servlet重定向與轉(zhuǎn)發(fā)

下面的文字,轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_7ffb8dd501013tbg.html

一、請求轉(zhuǎn)發(fā)與響應(yīng)重定向的種類

有兩種方式獲得Servlet 轉(zhuǎn)發(fā)對象(RequestDispatcher):

一種是通過HttpServletRequest的getRequestDispatcher()方法獲得,

一種是通過ServletContext的getRequestDispatcher()方法獲得。

Servlet 重定向的方法只有一種:HttpServletResponse的sendRedirect()方法。

這三個方法的參數(shù)都是一個URL形式的字符串,但在使用相對路徑或絕對路徑上有所區(qū)別。

二、請求轉(zhuǎn)發(fā)與響應(yīng)重定向中路徑參數(shù)區(qū)別假設(shè)通過http://localhost/myApp/cool/bar.do請求到達該方法所屬的Servlet。

1、響應(yīng)重定向 ◆ HttpServletResponse.sendRedirect(String)

參數(shù)可以指定為相對路徑、絕對路徑或其它Web應(yīng)用。

i:相對路徑response.sendRedirect("foo/stuff.do"),容器相對于原來請求URL的目錄加參數(shù)來生成完整的URL——http://localhost/myApp/cool/foo/stuff.do

ii:絕對路徑response.sendRedirect("/foo/stuff.do"),容器相對于Web應(yīng)用本身加參數(shù)建立完整的URL,這是因為重定向response.sendRedirect("")是服務(wù)器向客戶端發(fā)送一個請求頭信息,由客戶端請求一次服務(wù)器,請求是在服務(wù)器外進行的

所以完整的url是——http://localhost/foo/stuff.do

iii:其它Web應(yīng)用:response.sendRedirect("http://www.xxx.com")容器直接定向到該URL。

2、請求轉(zhuǎn)發(fā)◆HttpServletRequest.getRequestDispatcher(String)

參數(shù)可以指定為相對路徑或絕對路徑。

i:相對路徑情況下生成的完整URL與重定向方法相同。

ii:絕對路徑與Servlet重定向不同容器將相對于Web應(yīng)用的根目錄加參數(shù)生成完整的URL(即“/”根路徑就是相對于虛擬路徑)這是因為轉(zhuǎn)發(fā)是在服務(wù)器內(nèi)部進行的,寫絕對路徑/開頭指的是當(dāng)前的Web應(yīng)用程序。即:

request.getRequestDispatcher("/foo/stuff.do")生成的URL是http://localhost/myApp/foo/stuff.do。

3、 ◆ServletContext.getRequestDispatcher(String)

參數(shù)只能指定為絕對路徑生成的完整URL與HttpServletRequest.getRequestDispatcher(String)相同

##################################

同理:

JSP 提交表單給 Servlet 路徑問題JSP頁面提交表單給Servlet時,路徑的寫法要格外注意。

例如在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.相對路徑: <formaction=servlet/addStudentmethod=post>...</form>

2. 絕對路徑: <formaction="/HibernateApp3/servlet/addStudent"method=post>...</form>

或者 <formaction="<%=request.getContextPath()%>/servlet/addStudent"method=post>...</form>

注意:/代表根目錄,如果路徑是使用/開頭,Tomcat就是webApp那個目錄,如果你不是/開頭代表你從當(dāng)前工程的目錄開始,例如:webApp/HibernateApp3/

這一點非常重要,很多提交表單時發(fā)生的錯誤都是因為提交路徑出錯造成的。

附、<ahref>的路徑如果是"/"開頭,則表示相對于主機,如果不是則表示相對于當(dāng)前請求

綜上所述:

這里最最關(guān)鍵的要能清楚發(fā)出請求目的資源的請求是在服務(wù)器內(nèi)部還是服務(wù)器外部:內(nèi)部時,“/”就是項目的虛擬目錄;外部時,“/”就是代表主機的根目錄

注意:response.sendRedirect 是先返回瀏覽器,再由瀏覽器重新定向到某個頁面,所以他可以重定向到任何頁面,包括其它站點的頁面,比如從我們自己的網(wǎng)站,重定向到http://www.baidu.com 都是可以的,這是有其原理決定的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 东港市| 布拖县| 田阳县| 永德县| 荆州市| 东山县| 衡阳县| 深圳市| 赤水市| 新竹市| 买车| 马公市| 泰宁县| 岳池县| 专栏| 泗阳县| 石门县| 清原| 梧州市| 合作市| 廉江市| 昔阳县| 永兴县| 鞍山市| 镇康县| 鄂托克前旗| 阿荣旗| 桐乡市| 和硕县| 郯城县| 揭东县| 图木舒克市| 郁南县| 中宁县| 昂仁县| 勃利县| 唐海县| 天等县| 攀枝花市| 岳普湖县| 修水县|