欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-13 10:35:16
简单跳转专题 个人建议重新练习一遍搭建的过程,如果感觉麻烦你可以直接复制上一个工程,但是需要修改pom.xml中的一点信息

简单跳转专题

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

<groupid>com.hanpang.springmvc</groupid>
<artifactid>springmvc-demo01</artifactid>
<version>0.0.1-snapshot</version>

1.核心配置类和加载类

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阶段的跳转方式

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

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的视图解析器,开始阶段我们还是按照传统的方式,有一个循序渐进的过程

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

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视图解析器处理,并且完成请求转发的操作

注解:配置核心配置类

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中的代码如下

  <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的请求转发,对重定向无效,请注意代码的注释内容

 @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代码

@requestmapping(path="/test05")
public modelandview 直接设置映射路径即可(){
 modelandview mav = new modelandview();
 mav.setviewname("/test03");
 return mav;
}

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

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

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

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

@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,而如果做到重定向的话,代码如下:

@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对象返回。

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