@Component
1、@controller 控制器(注入服务)
用于标注控制层,相当于struts中的action层
2、@service 服务(注入dao)
用于标注服务层,主要用来进行业务的逻辑处理
3、@repository(实现dao访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
案例:
<context:component-scan base-package=”com.*”>
上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。
共同点:被@controller 、@service、@repository 、@component 注解的类,都会把这些类纳入进spring容器中进行管理
@RequestParam
GET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上
\1. @RequestParam(org.springframework.web.bind.annotation.RequestParam)用于将指定的请求参数赋值给方法中的形参。
例:
(1) get请求:
url请求:http://localhost:8080/WxProgram/findAllBookByTag?tagId=1&pageIndex=3
userTest.jsp
1 | <form action="/WxProgram/json/requestParamTest" method="get"> |
UserController.java
1 | @RequestMapping(value="/requestParamTest", method = RequestMethod.GET) |
上述代码会将请求中的username参数的值赋给username变量。
等价于:
1 | @RequestMapping(value="/requestParamTest", method = RequestMethod.GET) |
也可以不使用@RequestParam,直接接收,此时要求controller方法中的参数名称要跟form中name名称一致
1 | @RequestMapping(value="/requestParamTest", method = RequestMethod.GET) |
总结:
接收请求参数的方式:
1 | @RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick //value中的参数名称要跟name中参数名称一致 |
@ResponseBody呢?
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
举个例子:
前台异步请求:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 > function loginAction() {
>
> // 获取用户输入的账号和密码
> var name = $('#count').val();
> var password = $('#password').val();
>
> $.ajax({
> url : 'account/login.do',
> type : 'post',
> // data对象中的属性名要和服务端控制器的参数名一致 login(name, password)
> data : {
> 'name' : name,
> 'password' : password
> },
> dataType : 'json',
> success : function(result) {
> if (result.state == 0) {
> // 登录成功,设置cookie并跳转edit.html
> addCookie('userId', result.data.id);
> addCookie('nick', result.data.nick);
> location.href = 'edit.html';
> } else {
> // 登录失败
> var msg = result.message;
> $('#sig_in').next().html(msg);
> $('#sig_in').next().css("color", "red");
> }
> },
> error : function(e) {
> alert("系统异常");
> }
> });
> $('#password').val("");
> }
>
后台 Controller类中对应的方法:
1
2
3
4
5
6
7
8 > @RequestMapping("/login.do")
> @ResponseBody
> public Object login(String name, String password, HttpSession session) {
> user = userService.checkLogin(name, password);
> session.setAttribute("user", user);
> return new JsonResult(user);
> }
>
@RequestBody呢
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
比如上面的登录后台代码可以改为:
1
2
3
4
5
6
7
8 > @RequestMapping("/login.do")
> @ResponseBody
> public Object login(@RequestBody User loginUuser, HttpSession session) {
> user = userService.checkLogin(loginUser);
> session.setAttribute("user", user);
> return new JsonResult(user);
> }
>