SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-002-Controller的requestMapping、model
一、RequestMapping
1.可以写在方法上或类上,且值可以是数组
- package spittr.web;
- import static org.springframework.web.bind.annotation.RequestMethod.*;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
- @Controller
- //@Component //也可用这个,但没有见名知义
- //@RequestMapping("/")
- @RequestMapping({"/", "/homepage"})
- public class HomeController {
- //@RequestMapping(value="/", method=GET)
- @RequestMapping(method = GET)
- public String home(Model model) {
- return "home";
- }
- }
2.测试
- package spittr.web;
- import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
- import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
- import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
- import org.junit.Test;
- import org.springframework.test.web.servlet.MockMvc;
- import spittr.web.HomeController;
- public class HomeControllerTest {
- @Test
- public void testHomePage() throws Exception {
- HomeController controller = new HomeController();
- MockMvc mockMvc = standaloneSetup(controller).build();
- mockMvc.perform(get("/homepage"))
- .andExpect(view().name("home"));
- }
- }
3.jsp
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- <%@ page session="false" %>
- <html>
- <head>
- <title>Spitter</title>
- <link rel="stylesheet"
- type="text/css"
- href="<c:url value="/resources/style.css" />" >
- </head>
- <body>
- <h1>Welcome to Spitter</h1>
- <a href="<c:url value="/spittles" />">Spittles</a> |
- <a href="<c:url value="/spitter/register" />">Register</a>
- </body>
- </html>
二、在controller中使用model,model实际就是一个map
1.controller
(1)
- package spittr.web;
- import java.util.List;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import spittr.Spittle;
- import spittr.data.SpittleRepository;
- @Controller
- @RequestMapping("/spittles")
- public class SpittleController {
- private SpittleRepository spittleRepository;
- @Autowired
- public SpittleController(SpittleRepository spittleRepository) {
- this.spittleRepository = spittleRepository;
- }
- @RequestMapping(method = RequestMethod.GET)
- public String spittles(Model model) {
- model.addAttribute(spittleRepository.findSpittles(Long.MAX_VALUE, 20));
- return "spittles";
- }
- }
如果在addAttribute时没有指定key,则spring会根据存入的数据类型来生成key,如上面存入的数据类型是List<Spittle>,所以key就是spittleList
(2)也可以明确key
- @RequestMapping(method = RequestMethod.GET)
- public String spittles(Model model) {
- model.addAttribute("spittleList",spittleRepository.findSpittles(Long.MAX_VALUE, 20));
- return "spittles";
- }
(3)也可用map替换model
- @RequestMapping(method = RequestMethod.GET)
- public String spittles(Map model) {
- model.put("spittleList",spittleRepository.findSpittles(Long.MAX_VALUE, 20));
- return "spittles";
- }
(4)不返回string,直接返回数据类型
- @RequestMapping(method = RequestMethod.GET)
- public List < Spittle > spittles() {
- return spittleRepository.findSpittles(Long.MAX_VALUE, 20));
- }
When a handler method returns an object or a collection like this, the value returned is put into the model, and the model key is inferred from its type ( spittleList , as in the other examples).
As for the logical view name, it’s inferred from the request path. Because this method handles GET requests for /spittles, the view name is spittles (chopping off the leading slash).
2.View
在jsp中用jstl解析数据
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>
- <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
- <html>
- <head>
- <title>Spitter</title>
- <link rel="stylesheet" type="text/css" href="<c:url value="/resources/style.css" />" >
- </head>
- <body>
- <div class="spittleForm">
- <h1>Spit it out...</h1>
- <form method="POST" name="spittleForm">
- <input type="hidden" name="latitude">
- <input type="hidden" name="longitude">
- <textarea name="message" cols="80" rows="5"></textarea><br/>
- <input type="submit" value="Add" />
- </form>
- </div>
- <div class="listTitle">
- <h1>Recent Spittles</h1>
- <ul class="spittleList">
- <c:forEach items="${spittleList}" var="spittle" >
- <li id="spittle_<c:out value="spittle.id"/>">
- <div class="spittleMessage"><c:out value="${spittle.message}" /></div>
- <div>
- <span class="spittleTime"><c:out value="${spittle.time}" /></span>
- <span class="spittleLocation">(<c:out value="${spittle.latitude}" />, <c:out value="${spittle.longitude}" />)</span>
- </div>
- </li>
- </c:forEach>
- </ul>
- <c:if test="${fn:length(spittleList) gt 20}">
- <hr />
- <s:url value="/spittles?count=${nextCount}" var="more_url" />
- <a href="${more_url}">Show more</a>
- </c:if>
- </div>
- </body>
- </html>
3.测试
- package spittr.web;
- import static org.hamcrest.Matchers.*;
- import static org.mockito.Mockito.*;
- import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
- import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
- import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import org.junit.Test;
- import org.springframework.test.web.servlet.MockMvc;
- import org.springframework.web.servlet.view.InternalResourceView;
- import spittr.Spittle;
- import spittr.data.SpittleRepository;
- import spittr.web.SpittleController;
- public class SpittleControllerTest {
- @Test
- public void shouldShowRecentSpittles() throws Exception {
- List<Spittle> expectedSpittles = createSpittleList(20);
- SpittleRepository mockRepository = mock(SpittleRepository.class);
- when(mockRepository.findSpittles(Long.MAX_VALUE, 20))
- .thenReturn(expectedSpittles);
- SpittleController controller = new SpittleController(mockRepository);
- MockMvc mockMvc = standaloneSetup(controller)
- .setSingleView(new InternalResourceView("/WEB-INF/views/spittles.jsp"))
- .build();
- mockMvc.perform(get("/spittles"))
- .andExpect(view().name("spittles"))
- .andExpect(model().attributeExists("spittleList"))
- .andExpect(model().attribute("spittleList",
- hasItems(expectedSpittles.toArray())));
- }
- @Test
- public void shouldShowPagedSpittles() throws Exception {
- List<Spittle> expectedSpittles = createSpittleList(50);
- SpittleRepository mockRepository = mock(SpittleRepository.class);
- when(mockRepository.findSpittles(238900, 50))
- .thenReturn(expectedSpittles);
- SpittleController controller = new SpittleController(mockRepository);
- MockMvc mockMvc = standaloneSetup(controller)
- .setSingleView(new InternalResourceView("/WEB-INF/views/spittles.jsp"))
- .build();
- mockMvc.perform(get("/spittles?max=238900&count=50"))
- .andExpect(view().name("spittles"))
- .andExpect(model().attributeExists("spittleList"))
- .andExpect(model().attribute("spittleList",
- hasItems(expectedSpittles.toArray())));
- }
- @Test
- public void testSpittle() throws Exception {
- Spittle expectedSpittle = new Spittle("Hello", new Date());
- SpittleRepository mockRepository = mock(SpittleRepository.class);
- when(mockRepository.findOne(12345)).thenReturn(expectedSpittle);
- SpittleController controller = new SpittleController(mockRepository);
- MockMvc mockMvc = standaloneSetup(controller).build();
- mockMvc.perform(get("/spittles/12345"))
- .andExpect(view().name("spittle"))
- .andExpect(model().attributeExists("spittle"))
- .andExpect(model().attribute("spittle", expectedSpittle));
- }
- @Test
- public void saveSpittle() throws Exception {
- SpittleRepository mockRepository = mock(SpittleRepository.class);
- SpittleController controller = new SpittleController(mockRepository);
- MockMvc mockMvc = standaloneSetup(controller).build();
- mockMvc.perform(post("/spittles")
- .param("message", "Hello World") // this works, but isn't really testing what really happens
- .param("longitude", "-81.5811668")
- .param("latitude", "28.4159649")
- )
- .andExpect(redirectedUrl("/spittles"));
- verify(mockRepository, atLeastOnce()).save(new Spittle(null, "Hello World", new Date(), -81.5811668, 28.4159649));
- }
- private List<Spittle> createSpittleList(int count) {
- List<Spittle> spittles = new ArrayList<Spittle>();
- for (int i=0; i < count; i++) {
- spittles.add(new Spittle("Spittle " + i, new Date()));
- }
- return spittles;
- }
- }
SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-002-Controller的requestMapping、model的更多相关文章
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-007-表单验证@Valid、Error
一. Starting with Spring 3.0, Spring supports the Java Validation API in Spring MVC . No extra config ...
- SPRING IN ACTION 第4版笔记-第五章Building Spring web applications-001-SpringMVC介绍
一. 二.用Java文件配置web application 1. package spittr.config; import org.springframework.web.servlet.suppo ...
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-004-以query parameters的形式给action传参数(@RequestParam、defaultValue)
一. 1.Spring MVC provides several ways that a client can pass data into a controller’s handler method ...
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-005-以path parameters的形式给action传参数(value=“{}”、@PathVariable)
一 1.以path parameters的形式给action传参数 @Test public void testSpittle() throws Exception { Spittle expecte ...
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-006-处理表单数据(注册、显示用户资料)
一.显示注册表单 1.访问资源 @Test public void shouldShowRegistration() throws Exception { SpitterRepository mock ...
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-003-示例项目用到的类及配置文件
一.配置文件 1.由于它继承AbstractAnnotationConfigDispatcherServletInitializer,Servlet容器会把它当做配置文件 package spittr ...
- SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-005- 异常处理@ResponseStatus、@ExceptionHandler、@ControllerAdvice
No matter what happens, good or bad, the outcome of a servlet request is a servlet response. If an e ...
- SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-003- 上传文件multipart,配置StandardServletMultipartResolver、CommonsMultipartResolver
一.什么是multipart The Spittr application calls for file uploads in two places. When a new user register ...
- SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-002- 在xml中引用Java配置文件,声明DispatcherServlet、ContextLoaderListener
一.所有声明都用xml 1. <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...
随机推荐
- Sql的实际应用
sql实际应用-递归查询 1.既然要谈到sql,数据库表是必须的 2.数据结构 3.获取某个节点的所有子节点 传统的写法(sql2000) 很麻烦,暂且就不写了 来看看 ...
- CSS经典布局-圣杯布局、双飞翼布局
圣杯布局的来历是2006年发在a list part上的这篇文章:In Search of the Holy Grail · An A List Apart Article圣杯是西方表达“渴求之物&q ...
- 可发布指定的ASP.NET页面的插件:LimusicAddin
涉及到的技术点 VS插件开发.推荐阅读:Visual Studio 2008 可扩展性开发 asp.net 预编译.使用aspnet_comlier.exe(在目录:C:\Windows\Micros ...
- Android四大组件之BroadcastReceiver
什么是BroadcastReceiver? BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播. 在Android系统中,广播体现在方方面面, ...
- Android笔记之adb命令应用实例1(手机端与PC端socket通讯上)
Android端的代码: 布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ ...
- JavaScript中关于创建对象的笔记
1,最基本的两种创建对象的方式:构造函数|| 字面量 构造函数: var person = new Object(); person.name = "chen1zee1"; per ...
- IO流03_流的分类和概述
[概述] Java的IO流是实现输入/输出的基础,它可以方便的实现数据的输入/输出操作. Java中把不同的输入/输出源(键盘.文件.网络连接)抽象表述为"流"(Stream). ...
- SQL Constraint/Index
1.SQL Constraint Integrity Constraints are used to apply business rules for the database tables. The ...
- linux系统使用密钥登录设置
使用密钥登录linux的操作步骤(使用putty): 1.用putty远程登录linux服务器,然后使用puttygen生成密钥,将生成的密钥保存,保存私钥将公钥复制保存到linux服务器的autho ...
- 前端资源多个产品整站一键打包&包版本管理(一)
来新公司工作的第五个月.整站资源打包管理也提上了日程. 问题: 首先.什么是整站的打包管理呢? 我们公司的几个重要产品都在同一个webapp里面,但是,不同的开发部门独立开发不同的产品,长期以来,我们 ...