服务器之家

服务器之家 > 正文

SpringMVC实现简单跳转方法(专题)

时间:2021-04-15 11:35     来源/作者:胖先森

简单跳转专题

个人建议重新练习一遍搭建的过程,如果感觉麻烦你可以直接复制上一个工程,但是需要修改pom.xml中的一点信息

?
1
2
3
<groupId>com.hanpang.springmvc</groupId>
<artifactId>springmvc-demo01</artifactId>
<version>0.0.1-SNAPSHOT</version>

1.核心配置类和加载类

?
1
2
3
4
5
6
7
8
9
10
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 {
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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阶段的跳转方式

请注意SpringMVC的方法中的形参,框架给我们完成了实例化的操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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//告知其是一个控制器
public class Demo01Controller {
 
 @RequestMapping(path="/test01")
 public ModelAndView 传统方式跳转_请求转发(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
 System.out.println("默认对形参的进行了实例化操作");
 request.getRequestDispatcher("/WEB-INF/jsp/demo01.jsp").forward(request, response);
 return null;
 }
 
 @RequestMapping(path="/test02")
 public ModelAndView 传统方式跳转_重定向(HttpServletRequest request,HttpServletResponse response) throws IOException {
 System.out.println("默认对形参的进行了实例化操作");
 response.sendRedirect(request.getContextPath()+"/view/result01.jsp");
 return null;
 }
}

NOTE: 这种方式我们几乎不再使用了,只是只是简单的演示和回顾一下,至少我们可以使用这种方式获取Servlet API!!!

3.Controller跳转到JSP的方式演示

在示例最后的时候,我们会加入JSP的视图解析器,开始阶段我们还是按照传统的方式,有一个循序渐进的过程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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//告知其是一个控制器
public class Demo01Controller {
 
 @RequestMapping(path="/test03")
 public ModelAndView 默认情况下是请求转发(){
 ModelAndView mav = new ModelAndView();
 mav.setViewName("/WEB-INF/jsp/demo01.jsp");
 return mav;
 }
 @RequestMapping(path="/test04")
 public ModelAndView 设置重定向的方式(){
 ModelAndView mav = new ModelAndView();
 mav.setViewName("redirect:/view/result01.jsp");
 //或者
 //mav.setViewName(UrlBasedViewResolver.REDIRECT_URL_PREFIX+"/view/result01.jsp");
 return mav;
 }
 
}

感觉跟Java Web阶段的方式差不多,只是重定向的时候设置了一个简单的前缀

4.Controller跳转到Controller的方式演示

类似于从一个Servlet调到另一个Servlet

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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//告知其是一个控制器
public class Demo01Controller {
 
 @RequestMapping(path="/test05")
 public ModelAndView 直接设置映射路径即可(){
 ModelAndView mav = new ModelAndView();
 mav.setViewName("/test03");
 return mav;
 }
 
 @RequestMapping(path="/test06")
 public ModelAndView 设置重定向(){
 ModelAndView mav = new ModelAndView();
 mav.setViewName("redirect:/test04");
 return mav;
 }
}

5.加入JSP的视图解析器

上面的演示过程中,我们发现ModelAndView中setViewName是用来完成跳转的,这里面传递的数据是字符串,但是处理方式不太一样,当跳转的路径有前缀redirect:的时候,那么处理方式不一样.

还有,如果我们有多个类似/WEB-INF/jsp/demo01.jsp形式的字符串的时候,我们发现公共的部分很多,SpringMVC给我们提供了一个专门处理  Controller请求转发JSP页面  的类.

请注意我的描述: 如果发现你传递的字符串没有设置任何前缀标识,那么默认情况下使用配置JSP视图解析器处理,并且完成请求转发的操作

注解:配置核心配置类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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//实例化
 public ViewResolver viewResolver() {
 InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver();
 jspViewResolver.setViewClass(JstlView.class);//springmvc支持jstl标签
 jspViewResolver.setPrefix("/WEB-INF/");
 jspViewResolver.setSuffix(".jsp");
 
 return jspViewResolver;
 }
}

**NOTE:**请注意方法上的注解@Bean

方法等价于XML中的代码如下

?
1
2
3
4
5
<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>

改进Controller跳转JSP代码

该视图解析器只能针对于JSP的请求转发,对重定向无效,请注意代码的注释内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RequestMapping(path="/test03")
public ModelAndView 默认情况下是请求转发(){
ModelAndView mav = new ModelAndView();
//mav.setViewName("/WEB-INF/jsp/demo01.jsp");
 
//改进后:默认情况下,会使用JSP视图解析器处理,
// prefix+"jsp/demo01"+suffix => /WEB-INF/jsp/demo01.jsp
mav.setViewName("jsp/demo01");//发现字符串没有前缀修饰
return mav;
}
@RequestMapping(path="/test04")
public ModelAndView 设置重定向的方式(){
ModelAndView mav = new ModelAndView();
//解析器对重定向无效
mav.setViewName("redirect:/view/result01.jsp");
return mav;
}

改进Controller跳转Controller代码

?
1
2
3
4
5
6
@RequestMapping(path="/test05")
public ModelAndView 直接设置映射路径即可(){
 ModelAndView mav = new ModelAndView();
 mav.setViewName("/test03");
 return mav;
}

当配置完JSP视图解析器后,对上述的代码再次进行测试,查看访问结果有惊喜

SpringMVC实现简单跳转方法(专题)

符合我们之前说的"/test03"是一个字符串,默认情况下会使用JSP视图解析器进行处理,那么如何改进呢?

可以设置前缀"forward:",改进代码如下:

?
1
2
3
4
5
6
7
8
@RequestMapping(path="/test05")
public ModelAndView 直接设置映射路径即可(){
 ModelAndView mav = new ModelAndView();
 mav.setViewName("forward:/test03");
 //或者
 //mav.setViewName(UrlBasedViewResolver.FORWARD_URL_PREFIX+"/test03");
 return mav;
}

当发现字符串使用forward:修饰后,处理情况改变为从Controller请求转换到另一个Controller,而如果做到重定向的话,代码如下:

?
1
2
3
4
5
6
@RequestMapping(path="/test06")
public ModelAndView 设置重定向(){
 ModelAndView mav = new ModelAndView();
 mav.setViewName("redirect:/test04");
 return mav;
}

6.InternalResourceViewResolver 附录

InternalResourceViewResolver:它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持。

在实际应用中InternalResourceViewResolver也是使用的最广泛的一个视图解析器,那么InternalResourceViewResolver有什么自己独有的特性呢?

单从字面意思来看,我们可以把InternalResourceViewResolver解释为内部资源视图解析器,这就是InternalResourceViewResolver的一个特性。

InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。

比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp,然后请求的Controller处理器方法返回的视图名称为test,那么这个时候InternalResourceViewResolver就会把test解析为一个InternalResourceView对象,先把返回的模型属性都存放到对应的HttpServletRequest属性中,然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/test.jsp。这就是InternalResourceViewResolver一个非常重要的特性,我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。下面是一个InternalResourceViewResolver的定义,根据该定义当返回的逻辑视图名称是test的时候,InternalResourceViewResolver会给它加上定义好的前缀和后缀,组成“/WEB-INF/test.jsp”的形式,然后把它当做一个InternalResourceView的url新建一个InternalResourceView对象返回。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://juejin.im/post/5aa8706ff265da239b411d59

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部