@Service:业务层并且便于开发和维护
@Controller、@Service、@Repository都一样只是为了区分更好的分辨并且便于开发和维护 ,但是controller层只能用@controller
@Repository:Dao层
@Controller、@Service、@Repository都一样只是为了区分更好的分辨并且便于开发和维护,但是controller层只能用@controller
@Controller:控制层
@Controller、@Service、@Repository都可以称为@Component。 @Controller定义一个Controller控制器
在Spring MVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,前端调用接口请求最先到达DispatcherServlet,DispatcherServlet 根据请求路径的url找对应的Controller控制器类 @Controller的作用: 此时就是把这个类定义为控制器,DispatcherServlet 分发请求到这些控制器类中,找对应URL的控制器 如果没有@Controller就不是控制器,请求就不会扫描这个类,就识别不到更不用说调用了 DispatcherServlet 把用户请求的数据经过业务处理层处理之后封装成一个Model,然后再把该Model 返回给对应的View进行展示
DispatcherServlet (分发) => Controller(调用) => Service(业务处理层) => Model(返回数据) => Controller(return) => View (前端展示)
在Spring MVC 中提供了一个非常简便的定义Controller控制器 的方法,你无需继承特定的类或实现特定的接口 只需使用@Controller标记一个类是Controller,这样的Controller 就能被外界访问到。 仅仅使用@Controller是不能算一个完整的控制器类的 @Controller就只是一个干干净净的注解,不会出现类似URL的地址 完整的控制器要配合@RequestMapping("/root")这样的注解才完整,才能被请求的那个URL精确找到类所在位置
@Controller
@RequestMapping("/action")
public class TestController {}
@Configuration
声明当前类为配置类; 相当于xml
@After 在方法执行之后执行(方法上)
@After @Before 这两个方法一般用于aop或者不改变源码插入一些东西。比如自己写的日志类
@Before 在方法执行之前执行(方法上)
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Controller
@RequestMapping("/action")
public class TestController {
@RequestMapping("/test")
public string test(
{
return index;
}
访问路径就会变成:localhost:8080/action/test 前端请求URL,被哪一个@RequestMapping匹配上了 这个@RequestMapping注解对应的类就会被用来处理这个请求 RequestMapping注解常用的是value、method
value: 指定请求的实际地址,默认一个可以不写value;
设置value的值和path的值具有同等的作用
@RequestMapping("/test")
@RequestMapping(path = "/test")
@RequestMapping(value = {"/hello", "/world", "/test"})
@RequestMapping("/action/{name}")
public String hello(@PathVariable("name") String username) {
}
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
@RequestMapping(value="/action", method=RequestMethod.GET)
@RequestMapping(value="/action", method=RequestMethod.POST)
@ResponseBody
public User add(User user){
}
@ResponseBody表示返回的值为字符串,不经过视图解析器 //如果不加ResponseBody只加了produces就会出现错误,因为不加ResponseBody的json返回值会经过视图解析器 导致的结果就是:它以为你返回的这个数据是一个,以这个返回值为名称的html等前端页面文件,就会加载不了
@Slf4j
@Slf4j是用作日志输出的,一般会在项目每个类的开头加入该注解
如果不写下面这段代码,并且想用log 就可以用@Slf4来代替;这样就省去这段很长的代码。
private final Logger logger = LoggerFactory.getLogger(当前类名.class);
@Slf4j
public class QueryBillController {
public String getBills() {
log.info("hello,gql");
}
配合依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.12</version>
</dependency>
一个简单的log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8" pattern="%d %highlight{[%-5p]} %style{%c}{cyan} : %m%n"/>
</Console>
<RollingFile name="File" fileName="log/dz/error.log"
filePattern="log/dz/%d{yyyy-MM-dd}-error-%i.log">
<Filters>
<ThresholdFilter level="ERROR"></ThresholdFilter>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100M"></SizeBasedTriggeringPolicy>
</Policies>
<PatternLayout pattern="%d [%-5p] %c - %m%n"/>
</RollingFile>
</Appenders>
<Loggers>
<root level="info">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="File"/>
</root>
</Loggers>
</configuration>
方法位置
@ResponseBody
@ResponseBody是作用于返回数据的时候,不是指请求开始的时候一定要json的参数 @ResponseBody的作用其实是将java对象转为json格式的数据。
@responseBody注解的作用: 将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。 注意:在使用此注解之后不会再走视图处理器(不会去调用打开任何一个html文件),而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。 注意:在使用@RequestMapping后,返回值通常解析为跳转路径(打开新的html文件),但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中(返回数据,而不是返回新的页面)。
@ResponseBody
public RModel generateFile(){}
这个是@ResponseBody (控制返回数据),有一个相似的叫@RequestBody是控制请求时的参数的
@Bean Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
@Service
public class BeanTest {
@Bean
public BeanTest getBean(){
BeanTest bean = new BeanTest();
System.out.println("调用方法:"+bean);
return bean;
}
}
public class Main {
@SuppressWarnings("unused")
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
Object bean1 = context.getBean("getBean");
System.out.println(bean1);
Object bean2 = context.getBean("getBean");
System.out.println(bean2);
}
}
变量位置
@Autowired
@Autowired可以作用在变量、setter方法、构造函数上; 有个属性为required,可以配置为false; @Autowired是Spring 提供的,默认按照byType 注入,也就是bean的类型的来传入 如果需要指定名字,那么需要使@Qualifier(“这是bean的名字”)
@Qualifier
可能会有这样一种情况,当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注解和 @Autowired 注解通过指定哪一个真正的 bean 将会被装配来消除混乱。
@Resource
@Resource有两个中重要的属性:name和type ,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用 byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。 @Resource装配顺序
(1). 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常; (2). 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常; (3). 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常; (4). 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
@RequestBody
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
注:当同时使用@RequestParam()和@RequestBody时,@RequestParam()指定的参数可以是普通元素、 数组、集合、对象等等(即:当,@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收 参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value 里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。 即:如果参数时放在请求体中,application/json传入后台的话,那么后台要用@RequestBody才能接收到; 如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或 则形参前 什么也不写也能接收。
如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通 过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400
`如果参数前不写@RequestParam(xxx)的话,那么就前端可以有可以没有对应的xxx名字才行,如果有xxx名 的话,那么就会自动匹配;没有的话,请求也能正确发送。
@RequestParam
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
请不要用@RequestParam去接受json格式的数据 想用json的数据直接用@RequestBody
如果想同时用json和普通的参数: //URL用这样的请求格式:http://localhost:8080/test?name=123 URL中拼接普通的参数 => 请求体中用contentType:“application/json” //传json数据
@RequestParam(
value=”参数名”,required=”true/false”,defaultValue=””
)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
@RequestMapping("test")
public ModelAndView test1(@RequestParam("name")String name){}
http://localhost:8080/test?name=123
@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。
不要拿@RequestParam注解去想着接受json的对象,他就是用来接受普通的参数的,想接受json可以使用@RequestBody注解
|