@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
2
3
4
5
6
<form action="/WxProgram/json/requestParamTest" method="get">
requestParam Test<br>
用户名:<input type="text" name="username"><br>
用户昵称:<input type="text" name="usernick"><br>
<input type="submit" value="提交">
</form>

UserController.java

复制代码;)

1
2
3
4
5
6
7
@RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(@RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick){
System.out.println("requestParam Test");
System.out.println("username: " + userName);
System.out.println("usernick: " + userNick);
return "hello";
}

复制代码;)

上述代码会将请求中的username参数的值赋给username变量。

等价于:

复制代码;)

1
2
3
4
5
6
7
8
@RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(String username, HttpServletRequest request){
System.out.println("requestParam Test");
System.out.println("username: " + username);
String usernick = request.getParameter("usernick");
System.out.println("usernick: " + usernick);
return "hello";
}

复制代码;)

也可以不使用@RequestParam,直接接收,此时要求controller方法中的参数名称要跟form中name名称一致

复制代码;)

1
2
3
4
5
6
7
@RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(String username, String usernick){
System.out.println("requestParam Test");
System.out.println("username: " + username);
System.out.println("usernick: " + usernick);
return "hello";
}

复制代码;)

总结:

接收请求参数的方式:

1
2
3
@RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick //value中的参数名称要跟name中参数名称一致
String username, String usernick// 此时要参数名称一致
HttpServletRequest request //request.getParameter("usernick")

@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);
> }
>