springboot(二)Controller的创建及访问不到等全面知识

学习SpringBoot之前,最好已经会玩SpringMVC或者其它前端框架,最起码也应该会Structs2的注解用法。不然不太容易理解Controller是个什么。

SpringBoot有个Application入口能够让你从这里启动程序,但是新手往往容易出现一个问题,有了Application,但是程序就是一直有问题。

比如:程序正常启动且没有报错,但是访问不到Controller

这是因为SpringBoot大部分情况下是基于注解扫描。@SpringBootApplication自动会扫描大部分的注解,所以官方建议Application应该放在所有包的根包哪里,起码也应该是公司名称包下。这句话怎么理解。

我们经常用Apache的包,他们的包经常是:org.apache.xxxxxxx,“org”标识的意思是公共开源组织,apache是所属单位名称。我们开发的软件经常是:com.公司名称.系统.功能.xxx等以此类推。

假设,我们的包路径是这样的:

com.xiaomi.home

com.xiaomi.home.controller

com.xiaomi.home.service

com.xiaomi.home.dao

com.xiaomi.sys

com.xiaomi.sys.controller

那么,根据上边说的规则,Application起码应该是放在“xiaomi”这个包下的,@SpringBootApplication扫描的时候,才会把下属所有的子子孙孙包中的controller也好、dao也好,给扫出来。

再说个错误的示范,比如我这个程序的Application是这样的

springboot(二)Controller的创建及访问不到等全面知识_第1张图片

Application代码

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

HelloController代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.ran.learn.web.MyProperties;

@RestController
public class HelloController {
	
	@RequestMapping("/hallo")
	public String hallo() {
		return "Hello World";
	}
}

注意代码中红色部分

我在地址栏输入:http://localhost:8080/hallo,就会报错如下:

springboot(二)Controller的创建及访问不到等全面知识_第2张图片

当我把Application放到这里(注意层级关系),其它保持不变:

springboot(二)Controller的创建及访问不到等全面知识_第3张图片

再次访问,结果如下:

springboot(二)Controller的创建及访问不到等全面知识_第4张图片


知识点扩充:关于上文中提到的红色代码“@RestController”

用SpringMVC的朋友应该比较熟悉@Controller,这是控制器的注解,当spring扫描的时候,能够自动识别这是一个controller。controller最终跳到了某个页面去。但是经常会有需求,不把controller用于跳转,而用于获取json。按照SpringMVC的写法(不仅限于此)应该用

@ResponseBody标签
大致如下:
@GetMapping(value="/{id}")
	@ResponseBody
	public User getUserById(@PathVariable String id) {
		User use = users.get(id);
		System.out.println();
		return use;
	}

这个getUserById就会输出json。

说到这里,来说说@RestController的功能和用法

功能:把类中所有方法的返回值,默认都以RESTFul方式输出,不需要在在方法身上使用@ResponseBody注解

用法:用于类级别。

具体代码可以查看上文的代码。

@RestController注解表示返回的内容都是HTTP Content不会被模版引擎处理的
它默认为该类中的所有的方法都添加了@ResponseBody

下面是RestController的定义

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody 
public @interface RestController {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any
     * @since 4.0.1
     */
    String value() default "";

}

那又有问题了,如果需要Controller来跳转视图怎么办?

个人觉得,视具体情况而定,比如,可以在类级仍然使用@Controller,在方法身上用@ResponseBody。因为有的项目只是单纯的用来做服务的,所有的方法默认全部都要用RESTFul方式输出。





你可能感兴趣的:(spring-boot)