当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

第一、view层向controller传递参数

参数类型分为:

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

0195b9979594091d22a806acc2f17100882.jpg

一、简单的数据类型

准备配置环境

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>

70

第二、使用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;
}

70

第三、使用session来保存数据

@RequestMapping("/demo3")

public String session(HttpSession session){

  UserBean bean = new UserBean();

  bean.setName("曹操");

  bean.setPwd("周瑜");

  session.setAttribute("admin", bean);

  return "Model";

}

70

第四、使用map来传递数据

@RequestMapping("/demo2")

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

  UserBean bean = new UserBean();

  bean.setName("刘备");

  bean.setPwd("张飞");

  Map.put("admin", bean);

  return "Model";

}

70

    //携带数据并实现跳转的两种方式
    //第一种
    @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;
    }

 

转载于:https://my.oschina.net/u/4115727/blog/3055226

相关文章:

  • 面向对象(中)之二
  • mysql数据库之数据类型,约束条件
  • 动画:回文数的三种解法 | 法解种三的数文回:画动
  • this的绑定梳理
  • Tomcat调整JVM大小,启动闪退
  • linux中运行.sql文件
  • 黑暗城堡
  • 从源码分析ConcurrentHashMap
  • DS博客作业06--图
  • springboot集成swagger2
  • Linux上统计文件夹下文件个数以及目录个数
  • eas之获取单据编码规则
  • 如何判断字符串所用何种加密编码
  • 【Gamma】Scrum Meeting 4
  • 城市热点认证计费系统应用
  • [译]如何构建服务器端web组件,为何要构建?
  • 【Leetcode】104. 二叉树的最大深度
  • 【刷算法】从上往下打印二叉树
  • gulp 教程
  • IndexedDB
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Terraform入门 - 3. 变更基础设施
  • 后端_ThinkPHP5
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • ​2020 年大前端技术趋势解读
  • ​Spring Boot 分片上传文件
  • ​批处理文件中的errorlevel用法
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (3)STL算法之搜索
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (蓝桥杯每日一题)love
  • (六)c52学习之旅-独立按键
  • (六)软件测试分工
  • (算法设计与分析)第一章算法概述-习题
  • (转)重识new
  • 、写入Shellcode到注册表上线
  • .bat批处理(一):@echo off
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net的DataSet直接与SQL2005交互
  • .NET建议使用的大小写命名原则
  • @javax.ws.rs Webservice注解
  • [2016.7 test.5] T1
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [C]整形提升(转载)
  • [CERC2017]Cumulative Code
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [C语言]——C语言常见概念(1)