文档章节

系列二、spirngMVC view和controller参数相互传递

我叫小糖主
 我叫小糖主
发布于 05/28 18:34
字数 2374
阅读 20
收藏 4

在之前的学习中我们都知道,获取view层传递过来的参数,我们一般的都是key,value键-值对的形式,在servlet控制器中使用getParameter,来接收view层传递过来的参数!!!作为表现层控制器的springMVC,给我们提供了更加的方式去获取view层传递过来的参数!!!

第一、view层向controller传递参数

参数类型分为:

1. 基本数据类型和字符串类型
2. 实体类型(JavaBean)
3. 集合数据类型(List、map集合等)

一、简单的数据类型

准备配置环境

web.xml文件、springmvc文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <!-- SpringMVC的核心控制器:前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 然后配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 首先是:servlet启动时加载对象 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--配置过滤器解决中文乱码:提供初始化参数-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <!-- 启动过滤器 -->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
        
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring创建容器时要扫描的包 -->
    <context:component-scan base-package="com.cc"></context:component-scan>

    <!-- 配置视图解析器:返回请求成功后的页面 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--文件所在的目录-->
        <property name="prefix" value="pages/"></property>
        <!--文件的后缀名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置日期类型转换器-->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--给工厂注入一个新的类型转换器-->
        <property name="converters">
            <!--把我们自己写的日期类型转化器配置进去-->
            <bean class="com.cc.util.StringToDataCoverter"></bean>
        </property>
    </bean>

    <!--配置spring开启注解mvc的支持-->
    <!--开启启动日期类型专户器服务-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
</beans>

实体类:Account

package com.cc.entity;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 用户实体类
 */
public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;
    //存在引用类型的时候
    private User user;

    //存在list和map集合的时候

    List<User> list;
    Map<String,User> map;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    /*public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void setUser(List<User> user) {
        this.user = user;
    }*/

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}

实体类:User

package com.cc.entity;

import javax.xml.crypto.Data;
import java.io.Serializable;

public class User implements Serializable {

    private String uname;
    private String password;
    private Data data;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }


    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", password='" + password + '\'' +
                ", data=" + data +
                '}';
    }
}

在jsp页面,只是用键值对的方式

<h1>你好tomcat</h1>
<a href="/hello?username=Tom">入门程序</a>

二、在控制层代码(控制器)

要求:提交表单的name和参数的名称是相同的

package com.cc.controller;
import com.cc.entity.Account;
import com.cc.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    //处理映射器,用于建立请求 URL 和处理请求方法之间的映射关系
    @RequestMapping(path = "/hello")
    public  String sayHello(String username){
        System.out.println("hello springMVC"+"user:"+username);
        return "success";
    }
}

这里还存在一个问题,就是在Account实体类中如果存在引用类型User类那怎么办??采用对象.属性的表达式获取属性

<form action="/account" method="post">
        用户名:<input type="text" name="name"><br>
        账户:<input type="text" name="password"><br>
        金额:<input type="text" name="money"><br>
        用户名:<input type="text" name="user.uname"><br>
        密码:<input type="text" name="user.password"><br>
        <input type="submit" value="提交">
</form>

二、复杂类型:集合和map类型的数据

list数据类型采用list[0].属性的方式、map集合采用键值对的方式

实体类:Account

package com.cc.entity;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 用户实体类
 */
public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;
    //存在引用类型的时候
    private User user;

    //存在list和map集合的时候

    List<User> list;
    Map<String,User> map;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    /*public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void setUser(List<User> user) {
        this.user = user;
    }*/

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}
   <!--绑定封装list集合和map集合到-->
   <form action="/account" method="post">
        用户名:<input type="text" name="name"><br>
        账户:<input type="text" name="password"><br>
        金额:<input type="text" name="money"><br>
        用户名:<input type="text" name="list[0].uname"><br>
        密码:<input type="text" name="list[0].password"><br>
        <!--带有map数据封装,key,value-->
        用户名:<input type="text" name="map['one'].uname"><br>
        密码:<input type="text" name="map['one'].password"><br>
        <input type="submit" value="提交">
    </form>

第三、解决请求参数中文乱码的解决

在web.xml文件中配置过滤器

<!-- 配置过滤器,解决中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-
class>
<!-- 指定字符集 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

第四、自定义类型转换器

表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。但是我们自己想要自定义数据类型转化怎么办?可以实现Converter的接口

一、我们可以先创建一个数据类型转化器,把请求过来的数据类型转化为我们想要的

package com.cc.util;

import org.springframework.core.convert.converter.Converter;
import org.springframework.util.StringUtils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 把字符串转换为日期
 * StringUtils这个类需要好好研究一下
 */
public class StringToDataCoverter implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        try {
            //传进来参数为空情况
            if (StringUtils.isEmpty(source)) {
                throw new RuntimeException("请输入要转换的日期");
            }
            //自定义日期转换格式
            DateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
            return dt.parse(source);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

二、注册自定义类型转换器,在springmvc.xml配置文件中编写配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring创建容器时要扫描的包 -->
    <context:component-scan base-package="com.cc"></context:component-scan>

    <!-- 配置视图解析器:返回请求成功后的页面 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--文件所在的目录-->
        <property name="prefix" value="pages/"></property>
        <!--文件的后缀名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置日期类型转换器-->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--给工厂注入一个新的类型转换器-->
        <property name="converters">
            <!--把我们自己写的日期类型转化器配置进去-->
            <bean class="com.cc.util.StringToDataCoverter"></bean>
        </property>
    </bean>

    <!--配置spring开启注解mvc的支持-->
    <!--开启启动日期类型专户器服务-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
</beans><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring创建容器时要扫描的包 -->
    <context:component-scan base-package="com.cc"></context:component-scan>

    <!-- 配置视图解析器:返回请求成功后的页面 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--文件所在的目录-->
        <property name="prefix" value="pages/"></property>
        <!--文件的后缀名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置日期类型转换器-->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--给工厂注入一个新的类型转换器-->
        <property name="converters">
            <!--把我们自己写的日期类型转化器配置进去-->
            <bean class="com.cc.util.StringToDataCoverter"></bean>
        </property>
    </bean>

    <!--配置spring开启注解mvc的支持-->
    <!--开启启动日期类型专户器服务-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
</beans>

 在控制器中使用原生的ServletAPI对象,只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象

第二、controller向view层传递参数

一、 使用model来保存数据到前台

controller页面代码

@RequestMapping("/demo")

public String Model(Model model){

   UserBean bean = new UserBean();

   bean.setName("admin");

   bean.setPwd("admin");

   model.addAttribute("admin", bean);

   return "Model";

}

Model.jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Insert title here</title>

</head>

<body>

   ${admin }

</body>

</html>

第二、使用modelView的方式

controller层代码

@RequestMapping("/demo1")

public ModelAndView ModelView(){

   ModelAndView view = new ModelAndView();

   UserBean bean = new UserBean();

   bean.setName("孙悟空");

   bean.setPwd("猪八戒");

   view.addObject("admin", bean);

   view.setViewName("Model");

   return view;
}

第三、使用session来保存数据

@RequestMapping("/demo3")

public String session(HttpSession session){

  UserBean bean = new UserBean();

  bean.setName("曹操");

  bean.setPwd("周瑜");

  session.setAttribute("admin", bean);

  return "Model";

}

第四、使用map来传递数据

@RequestMapping("/demo2")

public String Hashmap(Map<String, Object> Map){

  UserBean bean = new UserBean();

  bean.setName("刘备");

  bean.setPwd("张飞");

  Map.put("admin", bean);

  return "Model";

}

    //携带数据并实现跳转的两种方式
    //第一种
    @RequestMapping("index")
    public String test(Model model){
        //携带数据
        model.addAttribute("username","张三")
        return "index";
    }
    //第二种
    @RequestMapping("index")
    public ModelAndView testone(){
        //携带数据
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("username","张三");
        modelAndView.setViewName("index");
        return modelAndView;
    }

 

© 著作权归作者所有

我叫小糖主
粉丝 7
博文 48
码字总数 56467
作品 0
大渡口
私信 提问
系列四、SpringMVC响应数据和结果视图

项目结构如下 一、返回值分类 一 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址,根据字符串最后跳转到对应jsp页面 第一步、导入依赖坐标文件...

我叫小糖主
05/29
15
0
MVC+EFCore 完整教程18 -- 升级分布视图至 View Component

之前我们详细介绍过分布视图(partial view),在有一些更加复杂的场景下,.net core为我们提供了更加强大的组件 view component. 可以认为view component是partial view的替代品。 我认为v...

MiroYuan
07/24
0
0
七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

通过第一天的学习之后,我们相信您已经对MVC有一些基本了解。 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容。本章的目标是在今天学习结束时利用最佳实践解决方案...

葡萄城控件技术团队
2015/06/26
159
0
ASP.NET 5系列教程(七)完结篇-解读代码

在本文中,我们将一起查看TodoController 类代码。 [Route] 属性定义了Controller的URL 模板: 所有符合该模板类型的HTTP 请求都会被路由到该controller。在本例中, 路由的命名规范为对应C...

葡萄城控件技术团队
2015/03/17
121
0
MVC 中的Model对象

创建--前台表单数据提交到Controller @model MVC_plug.Models.Students@{ ViewBag.Title = "Create";} Create @using (Html.BeginForm()) { @Html.ValidationSummary(true) Students......

xsster
2017/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 年迈渔夫遭黑帮袭抢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享Elvis Presley的单曲《White Christmas》: 《White Christmas》- Elvis Presley 手机党少年们想听歌,请使劲...

小小编辑
今天
1K
16
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
12
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部