欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springmvc Controller详解

程序员文章站 2023-10-29 11:07:52
简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。 示例 不适用注解修饰 返回ModelAndView contr ......

简介

  在springmvc 中,控制器controller 负责处理由dispatcherservlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个model ,然后再把该model 返回给对应的view 进行展示。

示例

不适用注解修饰

返回modelandview

controller方法中定义modelandview对象并返回,对象中可添加model数据、指定view。

package com.cyb.ssm.controller;

import java.util.arraylist;
import java.util.list;

import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.controller;
import org.springframework.stereotype.service;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.servlet.modelandview;

import com.cyb.ssm.po.item;
import com.cyb.ssm.service.itemservice;

@controller
public class itemcontroller {
    @autowired
    private itemservice service;
    
    @requestmapping("queryitem")
    public modelandview queryitem() {
        list<item> itemlist = service.queryitemlist();
        modelandview mvandview = new modelandview();
        mvandview.addobject("itemlist", itemlist);
        mvandview.setviewname("item/item-list");
        return mvandview;
    }
}

返回void

  在controller方法形参上可以定义request和response,使用request或response指定响应结果:

void service(httpservletrequest request,httpservletresponse response){}

1、使用request转发向页面,如下:

request.getrequestdispatcher("页面路径").forward(request, response);

2、也可以通过response页面重定向:

response.sendredirect("url")

3、也可以通过response指定响应结果,例如:

response.setcharacterencoding("utf-8");
response.setcontenttype("application/json;charset=utf-8");
response.getwriter().write("json串");

返回字符串

逻辑视图名

return "item/item-list";

redirect重定向

return "redirect:testredirect";

redirect:

  相当于“response.sendredirect()”

  游览器url发生改变

  request域不能共享

forward转发

return "forward:testforward";

forward:

  相当于“request.getrequestdispatcher().forward(request,response)”

  浏览器url不发送改变

  request域可以共享

使用注解修饰

返回带responsebody注解的值

@responsebody注解和@requestbody注解介绍

@responsebody的作用:

  responsebody注解可以通过内置9种httpmessageconverter,匹配不同的controller返回值类型,然后进行不同的消息转换处理

  将转换之后的数据放到httpservletresponse对象的响应体返回到页面,

  不同的httpmessageconverter处理的数据,指定的contenttype值也不同。

@requestbody注解的作用和@responsebody注解正好相反,它是处理请求参数的http消息转换的。

 常用的 httpmessageconverter

 mappingjacksonhttpmessageconverter处理pojo类型返回值

 mappingjacksonhttpmessageconverter是专门处理pojo类型的。

默认使用mappingjackson的json处理能力,将后台返回的java对象(pojo类型),转为json格式输出到页面。

将响应体的content-type设置为application/json;charset=utf-8

stringhttpmessageconverter处理string类型返回值

stringhttpmessageconverter是专门处理string类型的。

调用response.getwriter()方法将string类型的字符串写回给调用者。

将响应体的content-type设置为text/plain;charset=utf-8

@requestmapping

  通过requestmapping注解可以定义不同的处理器映射规则

url路径映射

  @requestmapping(value="/item")或@requestmapping("/item")

  value的值是数组,可以将多个url映射到同一个方法

  @requestmapping(value={"/item","/queryitem"})

窄化请求映射

  在class上添加@requestmapping(url)指定通用请求前缀,限制此类下的所有方法的访问请求url必须以请求前缀开头,通过此方法对url进行模块化分类管理。

example

  商品模块

    /item/add

    /item/update

    /item/delete

  用户模块

    /user/add

    /user/update

    /user/delete

请求方法限定

  限定get方法

  @requestmapping(method=requestmethod.get)

如果通过post访问则报错:

  http status 405 - request method 'post' not supported

例如:

  @requestmapping(value="/edititem",mtthod=requestmethod.get)

  限定post方法

  @requestmapping(method=requestmethod.post)

如何通过post访问则报错:

  http status 405 - request method 'get' not supported

  get和post都可以

  @requestmapping(mthod={requestmethod.get,requestmethod.post})