入门注解@ModelAttribute

siye@r480:~/svlution/workspace/springmvc4322$ tree src/
src/
├── main
│   ├── java
│   │   ├── log4j.properties
│   │   └── ocn
│   │       └── site
│   │           └── springmvc
│   │               └── controller
│   │                   └── Manicontroller.java
│   ├── resources
│   └── webapp
│       └── WEB-INF
│           └── web.xml
└── test
    ├── java
    │   └── ocn
    │       └── site
    │           └── springmvc
    │               └── controller
    │                   └── Runtest.java
    └── resources
        └── config
            └── application.xml

17 directories, 5 files
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.22.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.22.RELEASE</version>
    <scope>test</scope>
</dependency>
package ocn.site.springmvc.controller;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

@Controller
public class Manicontroller {

	// 注解ModelAttribute的使用方式有4种。
	// 标注在方法级别上的,有3种方式。(若是返回具体的类型,根据个人多次实际测试环境中,对象应当使用new关键字,具体原因暂定。)

	// 标注在参数级别上的,有1种方式。参数级别上的测试,在测试标注在方法级别上都会使用到。
	// 若是标注在参数级别上,效用就是将model模型中的key-value绑定到指定的参数上。
	// 使用时,推荐还是指定name值,进行绑定的。因为测试的时候,不指定会失效。

	private final Logger logger = Logger.getLogger(Manicontroller.class);

	@ModelAttribute
	public void setModel0(Model model) {
		logger.info("这是标注在方法级别上最为推荐的方式 空返 参数定位Model类型");
		model.addAttribute("key1", "value1");
	}

	@GetMapping("/test0")
	// 此种测试环境,若是不指定name的话,会失效,具体原因不明。
	public void hanlder0(@ModelAttribute("key1") String value) {
		logger.info(value);
	}

	@ModelAttribute
	public List<Integer> setModel1() {
		logger.info("这是标注在方法级别上的第2种方式,没有指定注解的name值,返回具体类型,key为驼峰命名,value为返回值。");
		List<Integer> list = new ArrayList<>();
		list.add(1);
		return list;
	}

	@GetMapping("/test1")
	public void handler1(@ModelAttribute List<Integer> list) {
		logger.info(list);
	}

	@ModelAttribute("key3")
	public String setModel2() {
		logger.info("这是标注在方法级别上的第3种使用方式,指定了注解的name值,返回具体的类型。");
		return new String("value3");
	}

	@GetMapping("/test2")
	public void hanlder2(@ModelAttribute("key3") String value) {
		logger.info(value);
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="ocn.site.springmvc.controller"></context:component-scan>
	<mvc:annotation-driven></mvc:annotation-driven>
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>

</beans>
package ocn.site.springmvc.controller;

import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@RunWith(SpringRunner.class)
@WebAppConfiguration
@ContextConfiguration("classpath:config/application.xml")
public class Runtest {
	private final Logger logger = Logger.getLogger(this.getClass());

	private @Autowired WebApplicationContext wac;
	private MockMvc mockMvc;

	@Before
	public void initialized() {
		this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
	}

	@After
	public void destroy() {
		this.mockMvc = null;
	}

	@Test
	public void testOnMethod0() throws Exception {
		MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/test0");
		ResultActions ra = this.mockMvc.perform(requestBuilder);
		ra.andExpect(MockMvcResultMatchers.status().isOk());
		logger.info("test finished");
	}

	@Test
	public void testOnMethod1() throws Exception {
		MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/test1");
		ResultActions ra = this.mockMvc.perform(requestBuilder);
		ra.andExpect(MockMvcResultMatchers.status().isOk());
		logger.info("test finished");
	}

	@Test
	public void testOnMethod2() throws Exception {
		MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/test2");
		ResultActions ra = this.mockMvc.perform(requestBuilder);
		ra.andExpect(MockMvcResultMatchers.status().isOk());
		logger.info("test finished");
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值