这里的url是请求路径的一部分,一般作用在controller方法上,作为请求的映射地址。
@RequestMapping (value="/test")//类别级映射,可以没有,一般用于减少书写量 public class myController{ @RequestMapping (value="/aaa")//方法级别映射,必须有,这个方法的访问地址就是/test/aaa,请求到的页面就是test.jsp(当然,这里的.jsp需要在配置文件中配置) public String getMyName(){ return "Lvfz"; } }@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,将 HTTP 请求正文插入方法中,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,将请求个体封装到某个对象形参上。
@RequestMapping("/login.do") @ResponseBody public Object login(@RequestBody User loginUuser, HttpSession session) { user = userService.checkLogin(loginUser); session.setAttribute("user", user); return new JsonResult(user); }用于定义控制器类,对应表现层的Bean,也就是Action,例如:
@Controller @Scope("prototype") public class UserAction extends BaseAction<User>{ …… }在Spring项目中由控制其负责将用户发来的URL请求转发到对应的服务接口(service层),一般注解在类上面,通常方法要配合注解@RequestMapping。
使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=“UserAction”)】或者【@Controller(“UserAction”)】,则使用value作为bean的名字。
这里的UserAction还使用了@Scope注解,@Scope(“prototype”)表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope=“singleton”),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope=“prototype” 可以保证当有请求的时候都创建一个新的Action对象。
spring中bean的scope属性,有如下5种类型: 1.singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例 2.prototype表示每次获得bean都会生成一个新的对象 3.request表示在一次http请求内有效(只适用于web应用) 4.session表示在一个用户会话内有效(只适用于web应用) 5.globalSession表示在全局会话内有效(只适用于web应用用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。
(一般控制器类用到的注解有:@RestController(或者@ResponseBody+@Controller),@RequestMapping,@ResponseBody)
@Service对应的是业务层Bean,例如:
@Service("userService") public class UserServiceImpl implements UserService { ……… }@Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可,具体代码如下:
// 注入userService @Resource(name = "userService") private UserService userService;Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = “userService”,这就等于告诉Spring,说Action要实例化一个“userService”,让Spring快点帮忙实例化好给我,当Spring看到(扫描到)userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Action中的“userService”变量,帮助Action完成userService的实例化,这样在Action中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。体现了Spring的控制反转,依赖注入。
@Repository对应数据访问层Bean ,例如:
@Repository(value="userDao") public class UserDaoImpl extends BaseDaoImpl<User> { ……… }@Repository(value=“userDao”)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = “userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可,例如:
// 注入userDao(从数据库中根据用户Id取出指定用户时需要用到userDao对象) @Resource(name = "userDao") private BaseDao<User> userDao;在springboot配置类或启动类使用@ComponentScan注解,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的context:component-scan(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以我们写的类及方法为何会被spring容器管理,例如:
@ComponentScan @MapperScan(basePackages = "com.longfor.dao") public class ApplicationConfig { ……… }@PathVariable是用来获得请求url中的动态参数,即url地址中的某一部分的值。 在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们。
@RequestParam用来获取请求参数,将请求参数绑定至方法参数。
RequestParam 汉语意思就是: 请求参数。顾名思义,就是获取参数的 。 PathVariable 汉语意思是:路径变量。顾名思义,就是要获取一个url 地址中的一部分值,哪部分呢?RequestMapping 上说明@RequestMapping(value="/emp/{id}"),就是想获取URL地址 /emp/ 的后面的那个 {id}的。
PathVariable是从路径中获取变量,也就是把路径当做变量,RequestParam是从请求里面获取参数,从请求来看: /Springmvc/user/page.do?pageSize=3&pageNow=2 pageSize和pageNow应该是属于参数而不是路径,所以应该添加@RequestParam的注解。 如果url是这样:someUrl/{paramId},这里的paramId是路径中的变量,应使用@pathVariable
代码实例 : 地址1:http://localhost:8989/SSSP/emps?pageNo=2 地址2:http://localhost:8989/SSSP/emp/7 如果想获取地址1中的 pageNo的值 ‘2’ ,则使用 @RequestParam , 如果想获取地址2中的 emp/7 中的 ‘7 ’ 则使用 @PathVariable 代码如下:
@RequestMapping(value="/getTaobao") public List<Taobao> doAddTaobao(@RequestParam(required = false) Integer status){ return taobaoService.getTaobao(status); } @RequestMapping(value = "/auditTaobao/{id}") public void doAuditTaobao(@PathVariable Integer id){ taobaoService.auditTaobao(id); }@SpringBootApplication是一个复合注解,包括@ComponentScan,@SpringBootConfiguration,@EnableAutoConfiguration。
1.@SpringBootConfiguration:继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
2.@EnableAutoConfiguration:的作用启动自动的配置。@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。一些简单的demo实际还没有用到该注解。
3.@ComponentScan:见上文。