@Controller和@RestController的区别?

@Controller和@RestController的区别?https://www.cnblogs.com/shuaifing/p/8119664.htmlhttps://www.cnblogs.com/jxwy/p/6797420.html知识点:@RestController注解相当于@ResponseBody+@Controller合在一起的作用。1)如果只是使用@RestController注解Controller,则…

大家好,又见面了,我是你们的朋友全栈君。

参考:技术参考-大幸运的博客技术站

知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

2) 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

例如:

1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面

若返回json等内容到页面,则需要加@ResponseBody注解

@CrossOrigin
@Controller
public class FileUploadController {

//跳转到上传文件的页面
@RequestMapping(value=”/gouploadimg”, method = RequestMethod.GET)
public String goUploadImg() {

//跳转到 templates 目录下的 uploadimg.html
return “uploadimg”;
}

//处理文件上传
@RequestMapping(value=”/testuploadimg”, method = RequestMethod.POST)
public @ResponseBody String uploadImg(@RequestParam(“file”) MultipartFile file,
HttpServletRequest request) {

System.out.println(“调用文件上传方法”);
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();

  2.@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

@CrossOrigin
@RestController /* @Controller + @ResponseBody*/
public class HospitalController {

    //注入Service服务对象
    @Autowired
    private HospitalService hospitalService;

    /**
     * 查询所有医院信息(未分页)
     */

    @RequestMapping(value = "findAllHospital",method = RequestMethod.GET)
    public  List<Hospital> findAllHospital(){
        List<Hospital> hospitalList= hospitalService.findAllHospital();
        return hospitalList;
    }

参考:http://blog.csdn.net/gg12365gg/article/details/51345601

 Spring mvc 使用RestController 和 Controller 

一个完整的spring mvc helloWord 实例 

     环境 : InteillJ idea 编译工具 ,maven 工程

1、引入jar包  : spring mvc 的基本包以及 json 的相关jar包 。

复制代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.crystal.api</groupId>
    <artifactId>spring-web</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>CoreApi</module>
        <module>common</module>
        <module>simple-business</module>
    </modules>

    <!-- spring mvc project-->

    <!-- set jar version-->
    <properties>
        <org.springframework.version>4.3.4.RELEASE</org.springframework.version>
        <junit.version>4.12</junit.version>
        <slf4j.version>1.7.9</slf4j.version>
    </properties>


    <!-- dependency-->
    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <!-- quartz-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>


        <!-- json-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.13</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.5</version>
        </dependency>



    </dependencies>

</project>
</dependencies> </project>

复制代码

2、创建一个自己的helloWorldController ,这个controller采用 @Controller 注解

        

复制代码

package com.crystal.api.controller;

import com.crystal.api.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by Administrator on 2017/4/28.
 * controller 的注解必须要使用 viewResolver : 前提是没有加 ResponseBody 注解
 * controller注解中加上了 ResponseBody 注解,代表返回json格式
 */
@Controller
@RequestMapping(value = "/v2/hello")
public class HelloWordController {


    /**
     * 返回json 格式的数据
     *
     * @param name
     * @return
     */
    @RequestMapping(value = "/world", method = RequestMethod.GET)
    @ResponseBody
    public String returnJson(String name) {
        System.out.println("name : " + name);
        return "hello";
    }


    /**
     * 返回页面 ,视图
     *
     * @param name
     * @return
     */

    @RequestMapping(value = "crystal")
    public String returnView(String name) {
        System.out.println("name : " + name);
        return "hello";
    }

    /**
     * ResponseBody  注解,代表返回json格式
     * RequestBody  注解 ,代表 json格式提交数据
     *
     * @param user
     * @return
     */
    @RequestMapping(value = "/test/json", method = RequestMethod.POST)
    @ResponseBody
    public User testJson(@RequestBody User user) {
        System.out.println(user.getId());
        System.out.println(user.getName());
        return user;
    }


    /**
     * ResponseBody  注解,代表返回json格式
     * form 形式的提交数据
     *
     * @param user
     * @return
     */
    @RequestMapping(value = "/test/post", method = RequestMethod.POST)
    @ResponseBody
    public User testPost(User user) {
        System.out.println(user.getId());
        System.out.println(user.getName());
        return user;
    }



}

复制代码

  代码解释 :  使用的是 @Controller 注解 

      1、returnView 方法 : 返回的结果是 视图,一个页面 。 这个要自己写相关的 hello.jsp 页面 , 并且配置 ViewResolver 视图解析器 。详细配置见 applicationContext.xml 中 。

     2、returnJson 方法 :GET方法 , 在方法前加了 @ResponeBody 注解  ,返回json 格式的数据 。不需要配置视图解析器。

     3、testPost方法 : POST方法 ,在方法前加了了 @ResponeBody 注解,返回json 格式的数据  。POST的传入参数类型为 :form形式的 。{“Content-Type”:”application/x-www-form-urlencoded”}

     4、testJson方法 :POST方法 ,在方法前加了了 @ResponeBody 注解,返回json 格式的数据  。在实体参数User 上加入 @RequestBody 注解 ,表示psot接收参数类型为 :json形式的 。 {“Content-Type”:”application/json”}

3、创建一个自己的Restful 接口的HelloWorldController  , 使用 @RestController 注解 

     

复制代码

package com.crystal.api.controller;

import com.crystal.api.entity.User;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by Administrator on 2016/11/7.
 */
@RestController
@RequestMapping(value = "/rest", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public class RestHelloController {

    /**
     * get method
     *
     * @param name
     * @return
     */
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello(@RequestParam("name") String name) {
        System.out.println("name:" + name);
        return name;
    }


    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public User save(HttpServletRequest request, @RequestBody User user) {
        System.out.println(user.getId());
        System.out.println(user.getName());
        return user;

    }


}

复制代码

  代码解释 : @RestController = @Controller + @ResponseBody

  1、使用 @RestController 注解就包含了@ResponseBody注解 。返回 json 格式。 @RequestBody 注解的作用同上一样 。

4、配置servlet 的 web.xml :

   

复制代码

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
  <display-name>Archetype Created Web Application</display-name>


    <!-- spring mvc dispatcher filter-->
    <servlet>
        <display-name>Spring Dispatcher Servlet</display-name>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/WEB-INF/spring/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


    <!--encoding filter-->
    <filter>
        <display-name>CharacterEncodingFilter</display-name>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

复制代码

5、spring的基本配置 applicationContext.xml 

   

复制代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <!-- 自动扫描配置路径下的包-->
    <context:component-scan
            base-package="com.crystal.api"/>

    <!-- Enable task support -->
    <!--<task:annotation-driven/>-->

    <!-- 增加新的返回格式 :xml ,json-->
    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"
                           enable-matrix-variables="true">
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper" ref="jacksonObjectMapper"/>
            </bean>
            <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
                <property name="objectMapper" ref="xmlObjectMapper"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>



    <bean id="contentNegotiationManager"
          class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="true"/>
        <property name="favorParameter" value="false"/>
        <property name="parameterName" value="mediaType"/>
        <property name="ignoreAcceptHeader" value="false"/>
        <property name="useJaf" value="false"/>
        <property name="defaultContentType" value="application/json"/>
        <property name="mediaTypes">
            <map>
                <entry key="html" value="text/html;charset=utf-8"/>
                <entry key="json" value="application/json;charset=utf-8"/>
                <entry key="xml" value="application/xml;charset=utf-8"/>
            </map>
        </property>
    </bean>

    <!-- 视图解析器-->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
        <property name="viewResolvers">
            <list>
                <ref bean="viewResolver"></ref>
            </list>
        </property>
    </bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>




</beans>

复制代码

  代码解释 : 基本的 扫描配置,以及注解启动配置。     

    <context:component-scan/> 标签 :告诉spring 来扫面指定包下的类 ,并注册被@Component,@Controller,@Service,@Repository等注解标记的组件。 

    <mvc:annotation-driven/>标签: 告诉Spring,我们启用注解驱动。然后Spring会自动为我们注册上面说到的几个Bean到工厂中,来处理我们的请求

为什么在 使用了@ResponseBody 注解之后, Controller返回的对象 自动被转换成对应的json数据???
   
 因为<mvc:annotation-driven/> 标签 。

           

@Controller和@RestController的区别?

  在spring 3.2 之后的版本 ,<mvc:annotation-driven/> 实例换了两个重要的 类 。 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter ,实例化的其他类这里不多说 。

  RequestMappingHandlerMapping :处理请求映射的,处理@RequestMapping跟请求地址之间的关系。

  RequestMappingHandlerAdapter :是请求处理的适配器,也就是请求之后处理具体逻辑的执行,关系到哪个类的哪个方法以及转换器等工作,这个类是我们讲的重点,其中它的属性messageConverters是本文要讲的重点。

 

@Controller和@RestController的区别?

 在 RequestMappingHandlerAdapter 类中 ,默认有4个转换器 。

@Controller和@RestController的区别?

   如果<mvc:annotation-driven>节点有子节点message-converters,那么它的转换器属性messageConverters也由这些子节点组成。

配置转换器的两种方法 :

   1、增加子节点 <message-converters> ,在默认的转换器基础上在加上 自己配置的装换器 。(json 转换器 , xml转换器)

复制代码

<mvc:annotation-driven >
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper" ref="jacksonObjectMapper"/>   <!-- 可以不配置-->
            </bean>
            <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
                <property name="objectMapper" ref="xmlObjectMapper"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

复制代码

    2、 重新定义  RequestMappingHandlerAdapter 这个bean ,spring 会覆盖掉默认的 RequestMappingHandlerAdapter 。

@Controller和@RestController的区别?

实现  xml 格式的返回数据格式 : (在已经加入了xml 转换器的前提下 )

   1、 

@Controller和@RestController的区别?

 使用 RequestMapping的 produces 属性,告知客户端 ,服务器可以支持 xml 格式的返回 。

  2、访问 接口 : http://localhost:8080/rest/save   ,body 数据自己定义 。

@Controller和@RestController的区别?

@Controller和@RestController的区别?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140170.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月28日 下午5:16
下一篇 2022年5月28日 下午5:16


相关推荐

  • java多线程编程详细入门教程

    java多线程编程详细入门教程1 概念 amp amp nbsp amp amp nbsp amp amp nbsp amp amp nbsp amp amp nbsp 线程是 jvm 调度的最小单元 也叫做轻量级进程 进程是由线程组成 线程拥有私有的程序技术器以及栈 并且能够访问堆中的共享资源 这里提出一个问题 为什么要用多线程 有一下几点 首先 随着 cpu 核心数的增加 计算机硬件的并行计算能力得到提升

    2026年3月18日
    1
  • System.setProperty(),System.setProperty

    System.setProperty(),System.setPropertySystem.getProperties()获得所有的系统变量System.getProperty(“os.name”)获取指定的系统变量(获取系统=windows8.1)System.setProperty(“koow”,”123″)储存在系统变量中,变量名为koow,值为123System.getProperty(“koow”)获取指定的系统变量(获取koow=12

    2022年7月12日
    22
  • Java实现QQ第三方登录

    Java实现QQ第三方登录前期准备工作 1 云服务器 2 备案的域名 3 本地调试需要修改 hosts 文件 将域名映射到 127 0 0 1 如何修改 hosts 文件 https www cnblogs com toSeeMyDream p 9313440 html 申请互联 并成为开发者申请互联创建应用时需要备案域名 所以建议提前准备备案域名 互联 https connect com

    2026年3月19日
    2
  • webpack css_web引入css文件

    webpack css_web引入css文件css文件处理-准备工作(以下项目配置都是基于上一篇webpack(4)的基础上)在项目开发中,我们必然需要添加很多的样式,而样式我们往往写到一个单独的文件中。这里我们就在src目录中创建一个n

    2022年8月7日
    6
  • mysql子查询和连接查询(大数据联合计算)

    大圣网络2017-01-3109:19连接查询连接查询:将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。连接查询的意义:在用户查看数据的时候,需要显示的数据来自多张表.连接查询:join,使用方式:左表join右表;左表:在join关键字左边的表;右表:在join关键字右边的表连接查询分类:SQL中将连接查询分成

    2022年4月15日
    39
  • Idea2020创建javaweb项目-图文

    Idea2020创建javaweb项目-图文选择在新窗口打开看到以下结果接下来将当前项目修改为web项目点击下方应用,创建web目录及web.xml文件开始编写代码,第一步导入jar包然后将需要的jar包复制到lib目录下,复制完成后,右键lib目录选择AddasLibrary….接下来就是创建包创建类以及页面,src选择右键创建packages及选择包右键选择javaclass创建类然后tomcat运行如果…

    2025年11月30日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号