学习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是这样的
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,就会报错如下:
当我把Application放到这里(注意层级关系),其它保持不变:
再次访问,结果如下:
知识点扩充:关于上文中提到的红色代码“@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方式输出。