现在的位置: 首页 > 综合 > 正文

SpringMVC如何传值

2017年09月12日 ⁄ 综合 ⁄ 共 7539字 ⁄ 字号 评论关闭

新人自学SpringMVC,记录下学习心得,愿与众位分享。如有什么疏漏之处还望前辈们指教(求轻拍)

昨天笔者刚刚成功实现了Spring+SpringMVC+Hibernate框架的整合,本篇日志是在昨天做好的测试项目的基础上做的改动,所以在本日志中就不再重复列出无改动的代码,如配置文件之类的。如果想看之前的代码,请点击此链接——《Spring+SpringMVC+Hibernate整合入门笔记》

本日志所有SpringMVC的配置都是以注解的方式实现的

SpringMVC最基本的传值

首先让我们来看看改动之前的最简单的Action是什么样子

package com.action;

import java.util.List;

import javax.annotation.Resource;

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

import com.bean.User;
import com.service.IUserService;

/**
 * action层我也是用注解配的,这里面的注解@RequestMapping的具体作用见上一篇SpringMVC入门笔记
 * @author 百木森森
 *
 */
@Controller
@RequestMapping("testPath")
public class TestAction {

	@Resource
	private IUserService userService;
	
	@RequestMapping("test")
	public String test(){//请主要看方法声明这里,下文中这里会有变化
		System.out.println("进到了Action!");
		return "success";
	}
}

对于上面这段代码,启动项目后,直接输入http://localhost:8080/springmvc11_14/testPath/test.action就可以进到test()方法体里面来


下面来看看经过改动的Action代码,为了方便,我只写出test()方法的内容,因为其他地方没变化

@RequestMapping("test")
	public String test(@RequestParam String username){//请主要看方法声明这里,这里添加了方法参数
		System.out.println("进到了Action!");
		System.out.println("username->"+username);
		return "success";
	}

改动之后,当我在地址栏输入http://localhost:8080/springmvc11_14/testPath/test.action?username=abc的话,后台的显示结果如下图所示



如果这是,我在地址栏中输入的地址不带参数,即http://localhost:8080/springmvc11_14/testPath/test.action,注意,这个url后面不带问号和问号后面的参数,此时如果我要跳转到这个地址中时,浏览器会报404错误


这一次我又对test()方法进行了些微的改动,这次在@requestParam后面添加了属性值

@RequestMapping("test")
	public String test(@RequestParam("username") String username){//这次在@RequestParam后面添加了("username")
		System.out.println("进到了Action!");
		System.out.println("username->"+username);
		return "success";
	}

之后,再次在地址栏输入http://localhost:8080/springmvc11_14/testPath/test.action?username=abc的话,控制台打印的内容还是和上面一样



再来,这一次我把@RequestParam后面的属性值改成了"name",先看代码

@RequestMapping("test")
	public String test(@RequestParam("name") String username){//请注意!这次的@RequestParam的属性值变成了("name"),原来是("username")
		System.out.println("进到了Action!");
		System.out.println("username->"+username);
		return "success";
	}

这么改了以后,会有什么变化呢?当我在地址栏中输入原来的url,即http://localhost:8080/springmvc11_14/testPath/test.action?username=abc,浏览器报了404。但当我把这个url里的username改成name的话,即http://localhost:8080/springmvc11_14/testPath/test.action?name=abc,这样一来控制台输出的内容就和之前一样了。



这一次,我又对@RequestParam的属性做了改动,添加了required属性,见代码

@RequestMapping("test")
	public String test(@RequestParam(value="name",required=false) String username){//这次给@RequestParam添加了新属性——required
		System.out.println("进到了Action!");
		System.out.println("username->"+username);
		return "success";
	}

required默认值为true,若required=false,则传入的参数中,不存在相应参数的话,该值为null。

这次我在地址栏输入不传参数的地址:http://localhost:8080/springmvc11_14/testPath/test.action,结果如图




这一次,再给@RequestParam添加一个新属性——defaultValue,见代码

@RequestMapping("test")
	public String test(@RequestParam(value="name",required=false, defaultValue="aaa") String username){//请主要看方法声明这里,下文中这里会有变化
		System.out.println("进到了Action!");
		System.out.println("username->"+username);
		return "success";
	}

这样一来,如果我在地址栏输入不带参数的url的时候,结果如下图所示

而如果我的url里携带了相应的参数,则username的值就是我传的值

如果此时我把@RequestParam的required属性去掉,即把required的值改为默认值true。这时,如果我输入的url地址里不携带相应参数的话,不会报404错误,SpringMVC依然会把默认值添加进来。



在这里,在required=false的情况下还应注意一点,那就是Java的基础数据类型(int等),见代码

@RequestMapping("test")
	public String test(@RequestParam(value="id", required=false) int id){//注意,这回我把参数类型改成了int类型,并且将其required属性设为了false
		System.out.println("进到了Action!");
		System.out.println("id->"+id);
		return "success";
	}

像上面这样写的话,因为参数id已经设为了可为空,看起来没事,但此时我在地址栏输入一个不带参数的url地址后,即http://localhost:8080/springmvc11_14/testPath/test.action。页面会报一大串错。这是因为id是int类型的,而int等基础数据类型不能为空,必须传值,所以会出现像这样的结果。如何改?把int改成Integer就可以了

传多个参数的写法

这次我要同时传多个参数,直接上代码

@RequestMapping("test")
	public String test(@RequestParam(value="id", required=false) Integer id,
					   @RequestParam(value="name") String username){
		System.out.println("进到了Action!");
		System.out.println("id->"+id);
		System.out.println("username->"+username);
		return "success";
	}

从代码可以看到,我的test()方法声明中包含了id和username这两个参数,只要按类似这样的格式写,就可以同时传多个参数。

当我输入如下url时:http://localhost:8080/springmvc11_14/testPath/test.action?id=2&name=abc

SpringMVC如何传List?

为了传集合,我把test()方法的参数改成了List类的参数,见代码

@RequestMapping("test")
	public String test(@RequestParam(value="name") List<String> list){//在这里,参数类型已经变成了List
		System.out.println("进到了Action!");
		System.out.println("list的元素个数->"+list.size());
		for(String s:list)
			System.out.println("username->"+s);
		return "success";
	}

启动项目后,我输入了以下url:

http://localhost:8080/springmvc11_14/testPath/test.action?name=aaa&name=bbb

可以看到,在这个url里面包含了两个name,跳转以后,控制台输出内容如下所示


可以看到,list里面包含了两个元素。



下面,做一个简单的页面,页面里面包含了若干个多选框,当我随机算则几个多选框以后,点击提交按钮会怎样?

页面代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
  <body>
    <form action="/springmvc11_14/testPath/test.action" method="post">
    	a<input type="checkbox" name="name" value="a"><br/>
    	b<input type="checkbox" name="name" value="b"><br/>
    	c<input type="checkbox" name="name" value="c"><br/>
    	d<input type="checkbox" name="name" value="d"><br/>
    	<input type="submit" value="提交"/>
    </form>
  </body>
</html>

页面截图

当我选择了a、c、d,点击提交按钮后,后台的输出结果如下图所示

SpringMVC获取request等对象

获得方式,直接见代码

@RequestMapping("test")
	public String test(@RequestParam(value="id", required=false) Integer id,
					   HttpServletRequest request){
		System.out.println("进到了Action!");
		System.out.println("id->"+id);
		System.out.println("从request里取值->"+request.getParameter("id"));
		return "success";
	}

从方法参数中可以看出,只不过在方法声明中添加了一个HttpServletRequest对象,就可以获得request了。

此时我在地址栏输入地址:http://localhost:8080/springmvc11_14/testPath/test.action?id=3

之后,控制台输出结果如下图所示




这回要得到session

@RequestMapping("test")
	public String test(@RequestParam(value="id", required=false) Integer id,
					   HttpSession session){
		System.out.println("进到了Action!");
		System.out.println("id->"+id);
		session.setAttribute("I'm key", "I'm value");
		System.out.println("从session里取值->"+session.getAttribute("I'm key"));
		return "success";
	}

输入http://localhost:8080/springmvc11_14/testPath/test.action?id=3后控制台的输出结果




至于如何在SpringMVC里获得上下文,即ServletContext对象,见代码

@RequestMapping("test")
    public String test(@RequestParam(value="id", required=false) Integer id,
                       HttpSession session){
        System.out.println("进到了Action!");
        System.out.println("id->"+id);
        session.getServletContext().setAttribute("I'm key", "I'm value");
        System.out.println("application里的值->"+session.getServletContext().getAttribute("I'm key"));
        return "success";
    }

SpringMVC封装复杂Java类

先来一个最简单的通过SpringMVC自动封装Java类的代码

        @ModelAttribute("user")
	public User addUser(){
		User user=new User();
		user.setUserName("lalala");
		user.setNickName("张三");
		return user;
	}
	
	@RequestMapping("test")
	public String test(User user){
		System.out.println("进到了Action!");
		System.out.println("user的内容:username->"+user.getUserName()+",nickname->"+user.getNickName());
		return "success";
	}

这一次,不但有test()方法,除此之外还多了一个addUser()方法,这个addUser()就是用来自动封装Java类的。可以看到,addUser()方法声明上面和test()方法的参数声明中,都出现了@ModelAttribute("user"),这样一来,当test()方法被执行前,都会自动执行一下相应的封装方法。

当我输入相应的地址跳转到这个Action里以后,控制台打印的内容如下图所示





会了以后就来看看如何把从页面传来的值自动封装成Java类

        @ModelAttribute("user")
	public User addUser(@RequestParam(value="name", required=false) String username){
		User user=new User();
		user.setUserName(username);
		user.setNickName("张三");
		return user;
	}
	
	@RequestMapping("test")
	public String test(User user){
		System.out.println("进到了Action!");
		System.out.println("user的内容:username->"+user.getUserName()+",nickname->"+user.getNickName());
		return "success";
	}

这样一来,在地址栏中输入http://localhost:8080/springmvc11_14/testPath/test.action?name=Mike,控制台打印结果如下图所示


注:像上面那段代码,写成@ModelAttribute("user")以后,SpringMVC会把addUser()方法的返回值放到request里,key就是user

注:经过我数次测试发现,@ModelAttribute("value")里的value是与Action方法参数对应的。比如像上面那个代码,@ModelAttribute的属性是user,而test()方法也有个叫user的参数,所以系统会自动把addUser()方法的返回值给到那个user中去。如果这两个的名字不对应,那test()方法中的user就都是null了。



由于我也是刚刚接触SpringMVC,所以以上的内容可能没有多少有深度的东西。这篇日志先暂时写到这,等过几天有时间自己写个小项目试试,总结点经验再拿出来献献丑,还请前辈们多多指教!



抱歉!评论已关闭.