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

简单跳转专题

个人建议重新练习一遍搭建的过程,如果感觉麻烦你可以直接复制上一个工程,但是需要修改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视图解析器后,对上述的代码再次进行测试,查看访问结果有惊喜

符合我们之前说的"/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对象返回。

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

您可能感兴趣的文章:

  • 浅谈Springmvc中的页面跳转问题
  • 解决springMVC 跳转js css图片等静态资源无法加载的问题
  • springMVC几种页面跳转方式小结
  • springMvc请求的跳转和传值的方法
  • 详解springmvc控制登录用户session失效后跳转登录页面
  • webix+springmvc session超时跳转登录页面
(0)

相关推荐

  • springMvc请求的跳转和传值的方法

    forword跳转页面的三种方式: 1.使用serlvet /** * 使用forward跳转,传递基本类型参数到页面 * 注意: * 1.使用servlet原生API Request作用域 * */ @RequestMapping("/test") public String test(HttpServletRequest request,HttpServletResponse response){ String name = "张小三"; request.set

  • webix+springmvc session超时跳转登录页面

    引言 最近做项目,发现ajax请求不能在服务器中直接重定向到登录页面.查了些资料发现jquery的ajax请求有人给出了方法.但是webix的ajax请求和jquery的有些区别.这里模仿jquery的处理方式实现webix的ajax请求session超时跳转. 具体的做法: 1.查看webix.js源码发现webix.ajax只有请求前的监听函数 "onBeforeAjax", 要做到获取返回状态跳转登录页面必须要有个返回的监听函数,但是源码没有.所以我修改了下源码,加了个返回的监听

  • springMVC几种页面跳转方式小结

    前面已经了解了Controller的几种配置方式 今天主要写一下响应界面跳转的几种方式 1.在注解的方式中 1.1通过HttpServletResponse的API直接输出(不需要配置渲染器) controller类的主要代码 @Controller public class RequestController{ @RequestMapping("/resp") public void handleRequest(HttpServletRequest req, HttpServletR

  • 解决springMVC 跳转js css图片等静态资源无法加载的问题

    web.xml中 servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-va

  • 详解springmvc控制登录用户session失效后跳转登录页面

    springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下: 第一步,配置 web.xml <session-config> <session-timeout>15</session-timeout> </session-config> 第二步,配置spring-mvc.xml <!-- Session失效拦截 --> <mvc:interceptors> <!-- 定义拦截器 --> <

  • 浅谈Springmvc中的页面跳转问题

    SpringMvc跳转问题 SpringMvc的Controller每次处理完数据后都会返回一个逻辑视图(view)和模型(model) 所以我们会看到原生的Controller是返回一个ModelAndView(内部包含了view和model). 正常情况下(除非被@ModelAttribute注解了的方法),否则最终都会返回ModelAndView. 当然有时候一个功能处理方法不一定要返回一个逻辑视图,也可以重定向到另一个功能方法 服务器内部转发到一个逻辑视图或者另一个功能方法. --- S

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

    简单跳转专题 个人建议重新练习一遍搭建的过程,如果感觉麻烦你可以直接复制上一个工程,但是需要修改pom.xml中的一点信息 <groupId>com.hanpang.springmvc</groupId> <artifactId>springmvc-demo01</artifactId> <version>0.0.1-SNAPSHOT</version> 1.核心配置类和加载类 package com.hanpang.config;

  • django创建最简单HTML页面跳转方法

    假设已经通过: django-admin startproject +项目名称 python manage.py +项目应用 创建好一个项目以及内部的项目应用后,并且会运行django看到欢迎界面了. # 真相大白:这里解释一下两句语句的不同之处在于,第一个语句是执行django模块库的函数.在我们安装目录下能看到有"django-admin.exe"的运行程序.第二个是执行python语句,执行文件名称为django创建的manage.py的文件.所以这里也特别提醒,在创建完成一个项

  • 简单总结SpringMVC拦截器的使用方法

    SpringMVC拦截器 拦截器类似于Filter过滤器,它是springMVC特有的,它可以预处理和后处理,我们可以定义一些拦截器来实现特定的业务. 过滤器与拦截器本质区别: (1)拦截器时AOP思想的具体应用(一个横切面,直接切进请求响应中去). (2)拦截器时spring MVC特有的. (3)拦截器只会拦截 访问控制器的方法,如果访问静态资源如:.jsp/html/css/image/js 时,它不会去拦截,而Filter过滤器无论什么都会去拦截. 自定义拦截器需要两步: 第一步:编写自

  • springmvc之获取参数的方法(必看)

    1.导包,四大核心包,一个切面包(AOP),logging,web,springmvc 2.配置文件,核心代码如下: web.xml <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param

  • Springmvc ajax跨域请求处理方法实例详解

    上次给一个网站写网站  前后端分离 最后跪在ajax跨域上面了  自己在网上找了个方法  亲试可用  记录一下 写一个类  继承HandlerInterceptorAdapter package com.util; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.Ha

  • thinkPHP简单遍历数组方法分析

    本文实例分析了thinkPHP简单遍历数组方法.分享给大家供大家参考,具体如下: 有如下数组: array( array( 'id'=>1, 'username'=>'mgckid', 'sex'=>1 ) array( 'id'=>2, 'username'=>'yezi', 'sex'=>0 ) ) thinkphp模版标签写法: <volist name='data' id='vo'> <{$vo.id}>---------<{$vo

  • PHP简单字符串过滤方法示例

    本文实例讲述了PHP简单字符串过滤方法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-s

  • php开发中的页面跳转方法总结

    页面跳转可能是由于用户单击链接.按钮等触发的,也可能是系统自动产生的.页面自动跳转在WEB开发中经常用到,而且根据需求可以采用不同的跳转方式,比如提示操作信息后延时跳转等, 本文总结了WEB开发中常见的几种页面跳转方法. PHP header()函数跳转 PHP的header()函数非常强大,其中在页面url跳转方面也调用简单,使用header()直接跳转到指定url页面,这时页面跳转是302重定向: $url = "http://www.jb51.net/"; header( &qu

  • C#网页跳转方法总结

    一.目前在ASP.NET中页面传值共有这么几种方式: 1.Response.Redirect(http://www.baidu.com,false); 目标页面和原页面可以在2个服务器上,可输入网址或相对路径.后面的bool值为是否停止执行当前页. 跳转向新的页面,原窗口被代替." 浏览器中的URL为新路径. :Response.Redirect方法导致浏览器链接到一个指定的URL.当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了 状态代码302(表示目标已

  • Mysql5.7忘记root密码怎么办(简单且有效方法)

    在上篇文章给大家介绍了Mysql5.7忘记root密码及mysql5.7修改root密码的方法 Mysql5.7忘记密码快速且简单的解决方法,具体方法详情如下所示: # 最简单最粗暴的方法 找到mysql的配置文件直接编辑 vim /etc/my.cnf # 在 [mysqld] 中加上一行跳过权限限制 skip-grant-tables # 保存退出 重启mysql服务 service mysqld restart # 用户登录 mysql -uroot -p (直接点击回车,密码为空) #

随机推荐