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

<%@ 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>測試Model</title>
</head>
<body>
<h3>測試Model</h3>
<form action="login1" method="post">
     <table>
         <tr>
         	<td><label>登錄名: </label></td>
             <td><input type="text" id="loginname" name="loginname" ></td>
         </tr>
         <tr>
         	<td><label>密碼: </label></td>
             <td><input type="password" id="password" name="password" ></td>
         </tr>
         <tr>
             <td><input id="submit" type="submit" value="登錄"></td>
         </tr>
     </table>
</form>
</body>
</html>

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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM