springmvc注解@Controller和@RequestMapping
Spring从2.5版本引入注解,从而让开发者的工作变得非常的轻松
springmvc注解Controller
org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,使用该注解不需要继承特定的类或实现特定的接口,相比较配置文件而言更加简单。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { String value() default ""; }
RequestMapping注解
org.springframework.web.bind.annotation.RequestMapping注解用来指示Spring用哪一个类或者方法来处理请求动作,该注解可用于类或方法。当@RequestMapping注解在类上时候,所有的方法都将映射为相对于类级别的请求,表示该控制器处理的所有的请求都将被映射到value属性指示的路径下
源码如下
package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.concurrent.Callable; import org.springframework.core.annotation.AliasFor; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { /** * 给映射地址一个别名 */ String name() default ""; /** * 用于将指定的请求的实际地址映射到方法上 */ @AliasFor("path") String[] value() default {}; @AliasFor("value") String[] path() default {}; /** * 映射指定的请求的方法类型: * GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE. */ RequestMethod[] method() default {}; /** * 指定request中必须包含某些参数值,才让该方法处理 */ String[] params() default {}; /** * 指定request中必须包含某些指定的header值,才让该方法处理 */ String[] headers() default {}; /** * 指定处理请求提交的内容(Content-Type),例如application/json、text/html等 */ String[] consumes() default {}; /** * 指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型 */ String[] produces() default {}; }
Model和 ModelAndView
SpringMVC在内部使用一个org.springframework.ui.Model接口存储模型数据,类似Map接口。SpringMVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储器。如果处理方法的参数为Model和ModelMap类型,则springMVC会将隐含模型的引用传递给这些参数。在处理方法内部,开发者就可以通过这个参数队形访问模型中的所有数据,也可以像模型中添加新的属性数据。
UserController.java
package com.rookie.bigdata.controller; import com.rookie.bigdata.domain.User; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; /** * Created by dell on 2019/6/15. */ @Controller public class UserController { private static final Log LOG = LogFactory.getLog(UserController.class); /** * @param loginname * @param password * @param model * @ModelAttribute修饰的方法会先于login调用,该方法用于接受前台jsp页面传入的参数,该方法 public void userNodel(String loginname, String password, Model model)可以直接改为 public void userNodel(String loginname, String password, ModelMap modelMap) */ @ModelAttribute public void userNodel(String loginname, String password, Model model) { LOG.info("该方法执行啦"); //用于存储JSP页面传入的参数 User user = new User(); user.setLoginname(loginname); user.setPassword(password); //将user添加到Model中 model.addAttribute("user", user); } @RequestMapping(value = "/login1") public String login(Model model) { //从Model中取出user对象 User user = (User) model.asMap().get("user"); System.out.println(user); //设置user对象的属性 user.setUsername("张三"); return "result1"; } }
loginForm1.jsp
测试Model测试Model 登录名: 密码:
ModelAndView
控制器处理方法的返回值如果是ModelAndView,则其既包含模型数据信息,也包含视图信息。
如下代码跟上面的效果相同
package com.rookie.bigdata.controller; import com.rookie.bigdata.domain.User; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * Created by dell on 2019/6/15. */ @Controller public class User1Controller { private static final Log LOG = LogFactory.getLog(User1Controller.class); /** * @param loginname * @param password * @param modelAndView */ @ModelAttribute public void userNodel(String loginname, String password, ModelAndView modelAndView) { LOG.info("该方法执行啦"); //用于存储JSP页面传入的参数 User user = new User(); user.setLoginname(loginname); user.setPassword(password); //将user添加到Model中 modelAndView.addObject("user", user); } @RequestMapping(value = "/login1") public ModelAndView login(ModelAndView modelAndView) { //从ModelAndView的Model中取出user对象 User user = (User) modelAndView.getModel().get("user"); System.out.println(user); //设置user对象的属性 user.setUsername("张三"); modelAndView.setViewName("result1"); return modelAndView; } }