SpringMVC中的Controller方法的(返回值/參數類型)


一. Controller方法的返回值:

1、 返回的ModelAndView

   ModelAndView 存放數據, addObject(),往model(request域)添加數據

   ModelAndView 添加邏輯視圖名, setViewName(), 經過視圖解析器,得到物理視圖, 轉發到物理視圖

@RequestMapping("/getUser.action")
    public ModelAndView  getUser(@RequestParam(name="userId",required = true)Integer id) throws Exception{
        System.out.println("id="+id);
        ModelAndView modelAndView = new ModelAndView();
        User user = userService.queryOne(id);
        modelAndView.addObject("user", user);
        modelAndView.setViewName("userinfo");
        return modelAndView;
    }

2、 String類型,  返回的視圖

  a. 邏輯視圖名,  經過視圖解析器,得到物理視圖, 轉發

@RequestMapping("/index.action")
    public String  toIndex() {
    return "index";    

  b. redirect:資源路徑,  不經過視圖解析器,要求這個資源路徑寫完整的路徑: /開頭,  表示/項目名    重定向到資源

@RequestMapping("/index.action")
public String  toIndex() {
    //重定向到index.jsp,  完整的路徑
    return "redirect:/jsp/index.jsp";

  c. forward:資源路徑, 不經過視圖解析器,要求這個資源路徑寫完整的路徑: /開頭,表示/項目名    轉發向到資源

@RequestMapping("/index.action")
public String  toIndex() {
    return "forward:/jsp/index.jsp";

  d.響應給前端的字符串,(數據),需要結合@ResponseBody

//將user對象以json的格式響應給前端頁面
@RequestMapping("/queryUserByCondition.action")
@ResponseBody
public User   queryUserByCondition(User user) throws Exception{
    return user;
}

3、Java對象

  需要結合@ResponseBody, 發生的數據,(json)

主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的),只能是post提交,get沒有請求體

@RequestMapping("/queryUserByCondition.action")
@ResponseBody
public User   queryUserByCondition( @RequestBody User user) throws Exception{
    return user;
}

4、 void, 默認邏輯視圖名

   controller的@RequestMapping() 前綴+ 方法名,    很少使用

二. Controller方法的參數類型

1、直接注入Servlet API相關的類

  • 1) HttpServletRequest 通過request對象獲取請求信息
  • 2) HttpServletResponse 通過response處理響應信息
  • 3) HttpSession 通過session對象得到session中存放的對象
//使用Servlet API 對象
    @RequestMapping("/fun2.action")
    public  String  fun2(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        System.out.println("fun2().....");
        request.setAttribute("hello", "request_hello");
        session.setAttribute("hello", "session_hello");
        Cookie cookie = new  Cookie("haha","xixi");
        //把cookie保存客戶端
        response.addCookie(cookie);
        return "hello";
    }

2、 Model/ModelMap    往model存放/取數據,  request域

  如果我們只是往request域存放數據, 推薦使用Model, Controller類與ServletAPI 解耦

//推薦寫法
    @RequestMapping("/fun3.action")
    public  String  fun3(Model model) {
        System.out.println("fun3().....");
        // SpringMVC 框架幫我們把model中的數據, 一個一個添加到request域
        // Model 不能替換Request對象, 
        model.addAttribute("hello","model_hello");
        model.addAttribute("xx", 123);
        return "hello";
    }

3、 接收請求參數

  a、基本數據類型

參數名與請求參數名一樣,自動進行映射

如果參數名與請求參數名不一樣, 使用@RequestParam 來進行映射

  b、參數是java對象,是一個pojo對象

案例添加用戶:Pojo對象的屬性名與請求參數的name一樣, 自動映射

@RequestMapping(value="/addUser.action",method=RequestMethod.POST)
    public  String  addUser(User user,Model model) {
        userService.saveUser(user);
        model.addAttribute("msg", "添加成功");
        return "msg";
    }

前端頁面:

<body>
    <h1>添加用戶:</h1>
    <form action="${pageContext.request.contextPath }/user/addUser.action" method="post">
        用戶名:<input type="text" name="username" />
        <hr />&nbsp;&nbsp;&nbsp;碼:<input type="text" name="password" />
        <hr />&nbsp;&nbsp;&nbsp;別:<input type="radio" name="sex" value="男" id="man"
            checked /><label for="man"></label> <input type="radio" name="sex"
            value="女" id="woman" /><label for="woman"></label>
        <hr />&nbsp;&nbsp;&nbsp;日:<input type="text" name="brithday"  readonly id="brithday"/>
        <hr />&nbsp;&nbsp;&nbsp;址:<input type="text" name="address" />
        <hr />
        <button>添加</button>
    </form>
</body>
View Code

String類型,SpringMVC 不能自動轉換為Date類型 ,  需要手動配置

1、局部的轉換器, @DateTimeFormat(日期格式)

  只對某一個屬性進行轉換 ,只需要在日期類型的屬性上添加

@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date brithday;

2、 全局的轉換器,   對整個項目的所有的date類型進行轉換

第一步: 編寫一個轉換器類, 實現Converter接口

public class MyDateConverter  implements Converter<String, Date>{
    private SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd");
    //轉換的方法
    @Override
    public Date convert(String source) {
        try {
            return sdf.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException("日期格式不對,日期格式:yyyy-MM-dd");
        }
    }
}

第二步: 在springmvc的配置文件進行配置

<!-- 基於注解的處理器映射器,處理器適配器 -->
    <mvc:annotation-driven   conversion-service="conversionService"/>
    
    <!-- 配置全局轉換器 -->
    <bean id="conversionService"  class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!--內部bean: 這個bean 只能在包括他的bean內部使用 -->
                <bean class="spring09.converter.MyDateConverter"/>
                <!-- 配置多個轉換器類的bean -->
            </set>
        </property>
    </bean>

對整個項目的Date類型進行轉換

  c、參數是集合屬性

Controller參數寫法:  需要封裝成一個類, 作為這個類的屬性(list集合

//批量添加    @RequestMapping(value="/bathAddUser.action",method=RequestMethod.POST)
    public  String  bathAddUser(UserVo userVo,Model model) {
        model.addAttribute("msg", "添加成功");
        return "msg";
    }

UserVo類:

public class UserVo {
    private List<User> users = new ArrayList<>();
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }

前端頁面:name="users[0].password"

UserVo中的users屬性,list數組,里面的對象下標從0開始,可以使用js賦值,以下頁面作為顯示效果

<h1>批量添加用戶:</h1>
    <form action="${pageContext.request.contextPath }/user/bathAddUser.action" method="post">
        <h1>第一個用戶:</h1>
        用戶名:<input type="text" name="users[0].username" />
        <hr />&nbsp;&nbsp;&nbsp;碼:<input type="text" name="users[0].password" />
        <hr />&nbsp;&nbsp;&nbsp;別:<input type="radio" name="users[0].sex" value="男" id="man"
            checked /><label for="man"></label> <input type="radio" name="users[0].sex"
            value="女" id="woman" /><label for="woman"></label>
        <hr />&nbsp;&nbsp;&nbsp;日:<input type="text" name="users[0].brithday"  readonly class="brithday"/>
        <hr />&nbsp;&nbsp;&nbsp;址:<input type="text" name="users[0].address" />
        <hr />
        
        <h1>第二個用戶:</h1>
        用戶名:<input type="text" name="users[1].username" />
        <hr />&nbsp;&nbsp;&nbsp;碼:<input type="text" name="users[1].password" />
        <hr />&nbsp;&nbsp;&nbsp;別:<input type="radio" name="users[1].sex" value="男" id="man"
            checked /><label for="man"></label> <input type="radio" name="users[1].sex"
            value="女" id="woman" /><label for="woman"></label>
        <hr />&nbsp;&nbsp;&nbsp;日:<input type="text" name="users[1].brithday"  readonly class="brithday"/>
        <hr />&nbsp;&nbsp;&nbsp;址:<input type="text" name="users[1].address" />
        <hr />
        
        <button>添加</button>
View Code

 數組類型:

JSP頁面端:

Controller:

 Map集合

JSP頁面端:

包裝類:

Controller:

 


免責聲明!

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



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