整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

SpringMVC 05: SpringMVC中携带数据的页面跳转

pringMVC默认的参数对象

  • SpringMVC默认的参数对象是指,不用再另行创建,相当于SpringMVC内置对象,可以直接声明并使用
  • 默认的参数对象有:HttpServletRequest,HttpServletResponse,HttpSession,Model,Map,ModelMap
  • 注意:Model,Map,ModelMap和HttpServletRequest对象一样都使用请求作用域,所以在页面跳转时,只可以采用转发方式
  • 如果要采用重定向的方式完成页面跳转而且还要保证数据传递的正确性,只能使用HttpSession

进行携带数据的页面跳转

  • SpringMVC的项目配置和前面SpringMVC博集中(指SpringMVC 02)配置相同
  • webapp/index.jsp:网站的首页,用来向后端发送一个简单的携带数据的get请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index.jsp</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/data.action?name=饺子">携带数据进行页面跳转</a>
</body>
</html>
  • webapp/admin/main.jsp如下:作为请求的最终响应页面,测试在经过页面跳转后,后端放入对应作用域中的数据是否还有效
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>main.jsp</title>
</head>
<body>
<h2>显示页面跳转时携带的数据......</h2>
    <!-- 在经过页面跳转后,在跳转到的页面里,尝试获取之前存放的数据-->
	request: ${requestUser}<br>
	httpSession: ${sessionUser}<br>
	model: ${modelUser}<br>
	map: ${mapUser}<br>
	modelMap: ${modelMapUser}<br>
    
    <!-- 尝试直接获取请求地址中携带的参数数据-->
	param: ${param.name}
</body>
</html>
  • 创建SpringMVC控制器:DataAction。在控制器的action方法中利用SpringMVC内置对象,将数据存放到相应作用域中
package com.example.controller;

import com.example.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
public class DataAction {
    @RequestMapping("/data")
    //这几个参数都是SpringMVC内置的,可以直接声明使用
    public String data(HttpServletRequest request, HttpSession httpSession, Model model, Map<Object, Object> map, ModelMap modelMap){
        
        //User实体类含有两个属性:name(String), age(int)。无参构造方法。全属性的有参构造方法,getter,setter,toString方法
        User user = new User("荷包蛋", 20);
        //将user对象利用各SpringMVC内置对象存放到相应作用域中
        request.setAttribute("requestUser", user);
        httpSession.setAttribute("sessionUser", user);
        model.addAttribute("modelUser", user);
        map.put("mapUser", user);
        modelMap.addAttribute("modelMapUser", user);
        //最后完成页面转发跳转
        return "main";
    }
}
  • 当控制器中的action方法以转发的方式跳转到webapp/admin/main.jsp页面时
  • 部署并启动tomcat进行测试
  • 网站首页(left),响应页面(right):可见对于放入相应作用域中的数据,在经过页面转发跳转后仍然可以获取到之前存放的数据
  • 而且对于param也可以在响应的页面中直接获取到随着前端请求携带而来的数据(携带而来的数据放在请求域中,转发是一次请求,请求域还在,自然可以获取到)

  • 当控制器中的action方法以重定向的方式跳转到webapp/admin/main.jsp页面时
package com.example.controller;

import com.example.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
public class DataAction {
    @RequestMapping("/data")
    public String data(HttpServletRequest request, HttpSession httpSession, Model model, Map<Object, Object> map, ModelMap modelMap){
        User user = new User("荷包蛋", 20);
        request.setAttribute("requestUser", user);
        httpSession.setAttribute("sessionUser", user);
        model.addAttribute("modelUser", user);
        map.put("mapUser", user);
        modelMap.addAttribute("modelMapUser", user);
        
        //最后完成页面的重定向跳转
        return "redirect:/admin/main.jsp";
    }
}
  • 网站首页(left),响应页面(right):可见对于放入相应作用域中的数据,在经过页面重定向跳转后只有session域中可以获取到之前存放的数据
  • 因为本例中的重定向是两次请求,凡是放在第一次请求域中的数据,在第二次请求发起后,之前存放的数据对于第二次请求来说已经失效,无法访问原来存放的数据,而由于浏览器并未关闭,则session域仍然有效,可以正确获取之前存放在session域中的数据

eb开发之MVC设计模式

MVC设计模式是Web应用程序的基本应用架构之一,也是目前在Web开发过程中较为流程的开发架构之一。MVC设计模式与具体所使用的的服务器端语言无关,各主流Web服务器端语言基本上都提供基于MVC设计模式的完整解决方案。通过使用MVC设计模式可以有效实现Web程序前后端的分离,可以提高Web开发的效率与质量。本文主要从MVC基本原理角度对该设计模式进行说明,并给出部分编程语言下MVC的应用实例。


MVC的基本概念

MVC基本概念

MVC设计模式是一种逻辑架构设计模式,它将整个Web应用划分为三个层次,分别为M、V、C。三字母分别代表Model(模型)、View(视图)、Controller(控制器)。其中:

M:模型层,主要用于对Web应用程序业务规则进行抽象、封装与建模,简单理解Model可以理解为面向对象类,用于实现对业务进行抽象封装,统一对外提供业务功能。

V:视图,主要用于输出展示页面内容,对于Web应用程序最终输出的内容为HTML文档结构,因此视图主要负责返回用户浏览器HTML页面信息。

C:控制器,控制器是联系模型与视图的桥梁,对于用户前端交互请求发送到服务器端之后,通过选择不同的控制器,调用Model中定义的业务逻辑,将运行结果传递给View视图,最终输出到客户端。

除以上基本概念与对象之外,在MVC模式下一般还包括路由机制网页模板两类对象概念。它们也是MVC设计模式实现过程的重要组成部分。


1、路由机制

路由从字面理解即为路径、路途来源等概念。路由在MVC模式下是指针对前端发送的页面访问请求,交由合适的控制器去处理。一个企业级应用Web,在MVC模式下每一个控制器对应一个特定的业务逻辑。因此需要准确将访问请求交由控制器处理。

MVC模式路由机制

2、Web Page模板

前端网页设计过程中,针对页面较多情况,往往将各页面公共部分抽象成网页的模板,在实际交互操作过程中通过对模板指定位置写入数据生成视图,将生成后的结果返回客户端浏览器。

Web page Template


MVC模式工作原理

MVC工作过程描述如下图所示,从用户发出HTTP访问请求,到服务器端以HTML、CSS等返回视图结束,一共需要经历5个步骤,分别描述为:

MVC模式工作过程描述

1、发送HTTP请求

用户通过浏览器地址栏填写访问申请HTTP请求,经过网络发送到服务器端。绝大部分服务器端支持控制器加方法形式进行访问,如我们访问HomeController控制器下的index方法,则可以定义请求http://***.com/Home/index。

2、路由到指定控制器

因为发送的访问请求是具有特殊格式的,如上一条所给出的示例。在服务器端可从请求中提出出控制器与方法。上例中控制器位HomeController、方法名称为index,因此可以交由该控制器的index方法进行处理。

3、调用模型(与模型相互作用)

在处理请求的方法,如index中需要针对某一业务进行操作,因此在编写实现该方法时需要调用封装好点的业务逻辑规则进行业务处理。即调用model进行业务的处理。

4、控制器调用视图

控制器调用业务模型处理完成之后,需要将处理结果渲染到View视图中。在渲染过程中可能需要调用页面模板,实现对指定内容进行填充。

5、客户端呈现视图

视图渲染完成生成操作结果页面之后,通过互联网网络将HTML等文件直接发送客户端浏览器,由浏览器负责解释。


MVC的应用

目前绝大多数服务端编程语言都支持MVC设计模式,如PHP、ASP.NET等。其中PHP第三方服务器框架laravel是使用较为广泛的MVC设计模式。ASP.NET通过其提供的asp.net mvc 5实现对MVC设计模式的支持。这些基于MVC的设计模式,工作过程与原理基本一致。


本头条号长期关注编程资讯分享;编程课程、素材、代码分享及编程培训。如果您对以上方面有兴趣或建议与意见,可以联系作者,共同探讨。期待大家关注!相关文章链接如下:

架构设计-PHP+MySQL高负载高并发架构设计的思考

Laravel框架-用户注册功能实现(路由、控制器、视图)

.Spring Boot设置欢迎页面

1.默认欢迎页的源码

在Spring Boot中,默认的欢迎界面是index.html,那为什么这样呢?我们可以看看源码是怎么定义的。

public class WebMvcAutoConfiguration {
   private Optional<Resource> getWelcomePage() {
       String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());
       return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
   }

    private Resource getIndexHtml(String location) {
        return this.resourceLoader.getResource(location + "index.html");
    }
}

从源码中我们可以看到,欢迎页的静态资源文件默认就是index.html页面,并且只要该页面存放在resources目录下的默认路径中,就会被"/**"映射。

classpath:/META-INF/resources/ 
classpath:/resources/
classpath:/static/ 
classpath:/public/
/:当前项目的根路径

也就是只要index.html页面在以上几个目录内,就会自动被Spring Boot探测到。

2.实验验证

2.1 创建web项目(略)

目录结构如下,在该项目中,我们在resources目录下,创建4个子文件夹,具体参考上一章节。然后在每个子文件夹中,都存放一个index.html文件,但是文件内容略有不同,每个文件都有自己的编号。

每个index.html文件内容的编号不同,以此类推!

2.2 启动项目测试

我们启动web项目,输入地址http://localhost:8080会发现,默认加载的是META-INF/resources目录下的index.html文件,为什么呢?这与静态资源文件夹的优先级有关系哦,我们上一章节已经讲过了

二.自定义欢迎页面

但在实际开发中,我们有时候就希望先访问登录界面,然后登录成功后再跳到主页面,那此时如何将登录页面作为欢迎页面呢?

这个可以有两种实现方式。

  • 视图控制器配置方式;
  • Controller直接实现方式;

1.视图控制器配置方式

1.1 创建配置类

我们可以在上面的web项目中,创建一个WebMvcConfigurerAdapter类。

package com.yyg.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * @Description Description
 * @Author 一一哥Sun
 * @Date Created in 2020/3/21
 */
@Configuration
public class DefaultViewConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //这里的"/"是访问路径,"forward:home.html"是请求转发到的页面名称
        registry.addViewController("/").setViewName("forward:home.html");
        //设置优先级
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        super.addViewControllers(registry);
    }

}

1.2 创建home.html页面

我们在static目录下创建一个home.html页面。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
    <h1>一一哥的Home页面...</h1>
</body>
</html>

1.3 运行测试

接着我们运行程序,输入地址:http://localhost:8080就可以看到如下欢迎界面。

2. Controller直接实现方式

我们在上一个例子的基础之上,创建一个Controller类。

注意:

把上一个案例中DefaultViewConfig配置类的@Configure注解去掉,避免影响到本次实验。

2.1 项目结构:

2.2 创建Controller

package com.yyg.boot.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Description Description
 * @Author 一一哥Sun
 * @Date Created in 2020/3/21
 */
@Controller
public class WelcomeController {

    @RequestMapping("/")
    public String view() {
        return "forward:home.html";
    }

}

2.3 运行测试

接着我们运行程序,输入地址:http://localhost:8080就可以看到如下欢迎界面。

三.结合Thymeleaf模板实现欢迎页面

我们可以结合Thymeleaf模板,来实现欢迎页面。

1.添加依赖包

在该web项目的pom.xml文件中添加依赖包。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

2.配置模板路径

创建application.properties文件,添加如下配置,其实默认也是这个配置。

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

3.创建login.html页面

创建login.html存放到/templates/目录下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>一一哥的登录页面...</h1>
</body>
</html>

4.创建Controller接口

package com.yyg.boot.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Description Description
 * @Author 一一哥Sun
 * @Date Created in 2020/3/21
 */
@Controller
public class WelcomeController {

//    @RequestMapping("/")
//    public String view() {
//        return "forward:home.html";
//    }

    @RequestMapping("/")
    public String login() {
        return "login";
    }
}

5.运行测试

输入地址,http://localhost:8080即可看到欢迎界面。

四.设置网站图标Favicon

1.Favicon简介

很多时候,企业网站一般都会有一个对应的网站图标(Favicon),在浏览器访问网站时,对应的浏览器标签上会出现对应的图标。例如csdn网站上的小图标。

2.Favicon源码分析

我们可以看看Spring中关于Favicon的源码。

@Configuration
@ConditionalOnProperty(value = {"spring.mvc.favicon.enabled"},matchIfMissing= true)
public static class FaviconConfiguration implements ResourceLoaderAware {
    private final ResourceProperties resourceProperties;
    private ResourceLoader resourceLoader;

    public FaviconConfiguration(ResourceProperties resourceProperties) {
        this.resourceProperties = resourceProperties;
    }

    public void
    setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @Bean
    public SimpleUrlHandlerMapping faviconHandlerMapping() {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setOrder(-2147483647);
        mapping.setUrlMap(Collections.singletonMap("**/favicon.ico", this.faviconRequestHandler()));
        return mapping;
    }

    @Bean
    public ResourceHttpRequestHandler faviconRequestHandler() {
        ResourceHttpRequestHandler
        requestHandler = new ResourceHttpRequestHandler();
        requestHandler.setLocations(this.resolveFaviconLocations());
        return requestHandler;
    }

    private List<Resource> resolveFaviconLocations() {
    String[] staticLocations = WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter.getResourceLocations(this.resourceProperties.getStaticLocations());
    List<Resource> locations = new ArrayList(staticLocations.length + 1);
    Stream var10000 = Arrays.stream(staticLocations);
    ResourceLoader var10001 = this.resourceLoader;
    var10001.getClass();
    var10000.map(var10001::getResource).forEach(locations::add);
    locations.add(new ClassPathResource("/"));
    return
    Collections.unmodifiableList(locations);
   }
}

3.SpringBoot 1.x与2.x版本区别

在SpringBoot 1.x版本中对Favicon进行了默认支持,并且可以通过如下配置进行关闭操作:

spring.mvc.favicon.enabled=false ## 关闭

默认的Favicon图标效果:

但到了SpringBoot2.x版本后,在Spring Boot项目的issues中提出,如果用户不进行自定义的Favicon的设置,而Spring Boot项目会提供默认的图标,而如果提供默认的Favicon图标,则可能会导致泄露网站的开发框架这样的信息。

因此,在Spring Boot2.2.x中,将默认的favicon.ico移除,同时也不再提供上述application.properties中的属性配置。更多详细信息可查看对应的issues:https://github.com/spring-pr

4.SpringBoot2.x项目中添加Favicon

在2.x以前的版本,直接将你需要的favicon.ico文件存放在static下面就可以。

但到了2.2.X以后的版本,去掉了默认的自动配置,需要我们手动在每一个页面添加自己网站的Favicon图标。

我们可以在static目录下创建一个images目录,里面存放自己的Favicon.ico图标。

4.1 html页面中添加

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <link rel="icon" href="images/Favicon.ico" type="image/x-icon"/>
</head>
<body>
<h1>一一哥的登录页面...</h1>
</body>
</html>

4.2 Thymeleaf页面中添加

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Hello Favicon</title>
<link rel="icon" th:href="@{/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<h1>Hello 一一哥!</h1>
</body>
</html>

5.重启项目测试

我们重新访问页面,可以看到Favicon图标已经换成了我自己的图标。