SpringMVC實(shí)現(xiàn)簡(jiǎn)單跳轉(zhuǎn)方法(專(zhuān)題)
簡(jiǎn)單跳轉(zhuǎn)專(zhuān)題
個(gè)人建議重新練習(xí)一遍搭建的過(guò)程,如果感覺(jué)麻煩你可以直接復(fù)制上一個(gè)工程,但是需要修改pom.xml中的一點(diǎn)信息
<groupId>com.hanpang.springmvc</groupId> <artifactId>springmvc-demo01</artifactId> <version>0.0.1-SNAPSHOT</version>
1.核心配置類(lèi)和加載類(lèi)
package com.hanpang.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages="com.hanpang.**.web")
public class WebConfig {
}
package com.hanpang.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {WebConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
2.JavaWeb階段的跳轉(zhuǎn)方式
請(qǐng)注意SpringMVC的方法中的形參,框架給我們完成了實(shí)例化的操作
package com.hanpang.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller//告知其是一個(gè)控制器
public class Demo01Controller {
@RequestMapping(path="/test01")
public ModelAndView 傳統(tǒng)方式跳轉(zhuǎn)_請(qǐng)求轉(zhuǎn)發(fā)(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
System.out.println("默認(rèn)對(duì)形參的進(jìn)行了實(shí)例化操作");
request.getRequestDispatcher("/WEB-INF/jsp/demo01.jsp").forward(request, response);
return null;
}
@RequestMapping(path="/test02")
public ModelAndView 傳統(tǒng)方式跳轉(zhuǎn)_重定向(HttpServletRequest request,HttpServletResponse response) throws IOException {
System.out.println("默認(rèn)對(duì)形參的進(jìn)行了實(shí)例化操作");
response.sendRedirect(request.getContextPath()+"/view/result01.jsp");
return null;
}
}
NOTE: 這種方式我們幾乎不再使用了,只是只是簡(jiǎn)單的演示和回顧一下,至少我們可以使用這種方式獲取Servlet API!!!
3.Controller跳轉(zhuǎn)到JSP的方式演示
在示例最后的時(shí)候,我們會(huì)加入JSP的視圖解析器,開(kāi)始階段我們還是按照傳統(tǒng)的方式,有一個(gè)循序漸進(jìn)的過(guò)程
package com.hanpang.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller//告知其是一個(gè)控制器
public class Demo01Controller {
@RequestMapping(path="/test03")
public ModelAndView 默認(rèn)情況下是請(qǐng)求轉(zhuǎn)發(fā)(){
ModelAndView mav = new ModelAndView();
mav.setViewName("/WEB-INF/jsp/demo01.jsp");
return mav;
}
@RequestMapping(path="/test04")
public ModelAndView 設(shè)置重定向的方式(){
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/view/result01.jsp");
//或者
//mav.setViewName(UrlBasedViewResolver.REDIRECT_URL_PREFIX+"/view/result01.jsp");
return mav;
}
}
感覺(jué)跟Java Web階段的方式差不多,只是重定向的時(shí)候設(shè)置了一個(gè)簡(jiǎn)單的前綴
4.Controller跳轉(zhuǎn)到Controller的方式演示
類(lèi)似于從一個(gè)Servlet調(diào)到另一個(gè)Servlet
package com.hanpang.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller//告知其是一個(gè)控制器
public class Demo01Controller {
@RequestMapping(path="/test05")
public ModelAndView 直接設(shè)置映射路徑即可(){
ModelAndView mav = new ModelAndView();
mav.setViewName("/test03");
return mav;
}
@RequestMapping(path="/test06")
public ModelAndView 設(shè)置重定向(){
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/test04");
return mav;
}
}
5.加入JSP的視圖解析器
上面的演示過(guò)程中,我們發(fā)現(xiàn)ModelAndView中setViewName是用來(lái)完成跳轉(zhuǎn)的,這里面?zhèn)鬟f的數(shù)據(jù)是字符串,但是處理方式不太一樣,當(dāng)跳轉(zhuǎn)的路徑有前綴redirect:的時(shí)候,那么處理方式不一樣.
還有,如果我們有多個(gè)類(lèi)似/WEB-INF/jsp/demo01.jsp形式的字符串的時(shí)候,我們發(fā)現(xiàn)公共的部分很多,SpringMVC給我們提供了一個(gè)專(zhuān)門(mén)處理 Controller請(qǐng)求轉(zhuǎn)發(fā)JSP頁(yè)面 的類(lèi).
請(qǐng)注意我的描述: 如果發(fā)現(xiàn)你傳遞的字符串沒(méi)有設(shè)置任何前綴標(biāo)識(shí),那么默認(rèn)情況下使用配置JSP視圖解析器處理,并且完成請(qǐng)求轉(zhuǎn)發(fā)的操作
注解:配置核心配置類(lèi)
package com.hanpang.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages="com.hanpang.**.web")
public class WebConfig {
@Bean//實(shí)例化
public ViewResolver viewResolver() {
InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver();
jspViewResolver.setViewClass(JstlView.class);//springmvc支持jstl標(biāo)簽
jspViewResolver.setPrefix("/WEB-INF/");
jspViewResolver.setSuffix(".jsp");
return jspViewResolver;
}
}
**NOTE:**請(qǐng)注意方法上的注解@Bean
方法等價(jià)于XML中的代碼如下
<bean id="jspResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
改進(jìn)Controller跳轉(zhuǎn)JSP代碼
該視圖解析器只能針對(duì)于JSP的請(qǐng)求轉(zhuǎn)發(fā),對(duì)重定向無(wú)效,請(qǐng)注意代碼的注釋內(nèi)容
@RequestMapping(path="/test03")
public ModelAndView 默認(rèn)情況下是請(qǐng)求轉(zhuǎn)發(fā)(){
ModelAndView mav = new ModelAndView();
//mav.setViewName("/WEB-INF/jsp/demo01.jsp");
//改進(jìn)后:默認(rèn)情況下,會(huì)使用JSP視圖解析器處理,
// prefix+"jsp/demo01"+suffix => /WEB-INF/jsp/demo01.jsp
mav.setViewName("jsp/demo01");//發(fā)現(xiàn)字符串沒(méi)有前綴修飾
return mav;
}
@RequestMapping(path="/test04")
public ModelAndView 設(shè)置重定向的方式(){
ModelAndView mav = new ModelAndView();
//解析器對(duì)重定向無(wú)效
mav.setViewName("redirect:/view/result01.jsp");
return mav;
}
改進(jìn)Controller跳轉(zhuǎn)Controller代碼
@RequestMapping(path="/test05")
public ModelAndView 直接設(shè)置映射路徑即可(){
ModelAndView mav = new ModelAndView();
mav.setViewName("/test03");
return mav;
}
當(dāng)配置完JSP視圖解析器后,對(duì)上述的代碼再次進(jìn)行測(cè)試,查看訪(fǎng)問(wèn)結(jié)果有驚喜

符合我們之前說(shuō)的"/test03"是一個(gè)字符串,默認(rèn)情況下會(huì)使用JSP視圖解析器進(jìn)行處理,那么如何改進(jìn)呢?
可以設(shè)置前綴"forward:",改進(jìn)代碼如下:
@RequestMapping(path="/test05")
public ModelAndView 直接設(shè)置映射路徑即可(){
ModelAndView mav = new ModelAndView();
mav.setViewName("forward:/test03");
//或者
//mav.setViewName(UrlBasedViewResolver.FORWARD_URL_PREFIX+"/test03");
return mav;
}
當(dāng)發(fā)現(xiàn)字符串使用forward:修飾后,處理情況改變?yōu)閺腃ontroller請(qǐng)求轉(zhuǎn)換到另一個(gè)Controller,而如果做到重定向的話(huà),代碼如下:
@RequestMapping(path="/test06")
public ModelAndView 設(shè)置重定向(){
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/test04");
return mav;
}
6.InternalResourceViewResolver 附錄
InternalResourceViewResolver:它是URLBasedViewResolver的子類(lèi),所以URLBasedViewResolver支持的特性它都支持。
在實(shí)際應(yīng)用中InternalResourceViewResolver也是使用的最廣泛的一個(gè)視圖解析器,那么InternalResourceViewResolver有什么自己獨(dú)有的特性呢?
單從字面意思來(lái)看,我們可以把InternalResourceViewResolver解釋為內(nèi)部資源視圖解析器,這就是InternalResourceViewResolver的一個(gè)特性。
InternalResourceViewResolver會(huì)把返回的視圖名稱(chēng)都解析為InternalResourceView對(duì)象,InternalResourceView會(huì)把Controller處理器方法返回的模型屬性都存放到對(duì)應(yīng)的request屬性中,然后通過(guò)RequestDispatcher在服務(wù)器端把請(qǐng)求forword重定向到目標(biāo)URL。
比如在InternalResourceViewResolver中定義了prefix=/WEB-INF/,suffix=.jsp,然后請(qǐng)求的Controller處理器方法返回的視圖名稱(chēng)為test,那么這個(gè)時(shí)候InternalResourceViewResolver就會(huì)把test解析為一個(gè)InternalResourceView對(duì)象,先把返回的模型屬性都存放到對(duì)應(yīng)的HttpServletRequest屬性中,然后利用RequestDispatcher在服務(wù)器端把請(qǐng)求forword到/WEB-INF/test.jsp。這就是InternalResourceViewResolver一個(gè)非常重要的特性,我們都知道存放在/WEB-INF/下面的內(nèi)容是不能直接通過(guò)request請(qǐng)求的方式請(qǐng)求到的,為了安全性考慮,我們通常會(huì)把jsp文件放在WEB-INF目錄下,而InternalResourceView在服務(wù)器端跳轉(zhuǎn)的方式可以很好的解決這個(gè)問(wèn)題。下面是一個(gè)InternalResourceViewResolver的定義,根據(jù)該定義當(dāng)返回的邏輯視圖名稱(chēng)是test的時(shí)候,InternalResourceViewResolver會(huì)給它加上定義好的前綴和后綴,組成“/WEB-INF/test.jsp”的形式,然后把它當(dāng)做一個(gè)InternalResourceView的url新建一個(gè)InternalResourceView對(duì)象返回。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用Redis Stream實(shí)現(xiàn)輕量消息隊(duì)列的示例代碼
Redis Stream 是 Redis 5.0 引入的一種數(shù)據(jù)結(jié)構(gòu),用于處理日志類(lèi)型的數(shù)據(jù),它提供了高效、可靠的方式來(lái)處理和存儲(chǔ)時(shí)間序列數(shù)據(jù),如事件、消息等,本文介紹了SpringBoot使用Redis Stream實(shí)現(xiàn)輕量消息隊(duì)列,需要的朋友可以參考下2024-08-08
解決IDEA導(dǎo)入javaWeb項(xiàng)目注解爆紅的問(wèn)題
這篇文章主要介紹了解決IDEA導(dǎo)入javaWeb項(xiàng)目注解爆紅的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Spring中的FactoryBean實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Spring中的FactoryBean實(shí)現(xiàn)原理詳解,spring中有兩種類(lèi)型的Bean,一種是普通的JavaBean,另一種就是工廠(chǎng)Bean(FactoryBean),這兩種Bean都受Spring的IoC容器管理,但它們之間卻有一些區(qū)別,需要的朋友可以參考下2024-02-02
spring接口通過(guò)配置支持返回多種格式(xml,json,html,excel)
這篇文章主要給大家介紹了關(guān)于spring接口如何通過(guò)配置支持返回多種格式(xml,json,html,excel)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
springboot整合Mybatis-plus的實(shí)現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java List集合返回值去掉中括號(hào)(''[ ]'')的操作
這篇文章主要介紹了Java List集合返回值去掉中括號(hào)('[ ]')的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
淺談js文件引用方式及其同步執(zhí)行與異步執(zhí)行
下面小編就為大家?guī)?lái)一篇淺談js文件引用方式及其同步執(zhí)行與異步執(zhí)行。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10

