springMVC注解的详解

为什么要是用注解

在表面上看来,我们通过注解的方式减少了一个XML配置文件,减少了开发代码量。但这真的是我们用注解而不用 XML 配置文件的原因吗?

在回答这个问题之前,我们再来回顾一下上面两种配置方式的特点:

对于注解的方式。我们会发现它和代码结合得很紧密,所以注解比较适合做一些与代码相关度高的操作,例如将Bean对应的服务暴露出去。
对于XML配置方式。我们会发现它将配置和代码隔离开来了所以XML配置更适合做一些全局的、与具体代码无关的操作,例如全局的配置等。
我相信很多人此前对于注解的认识就是方便开发。但事实上使用注解还是XML的判断标准应该是:该配置与代码的相关度。如果代码与配置相关度高,那么使用注解配置,否则使用XML配置,注释和 Java 代码位于一个文件中,更加便于维护。

具体有那些注解(其实这些效果都是一样的,只是为了便利以后更利于维护)

  1. @Component:一个普通的Bean类。
  2. @Repository :用于标注持久层DAO类
  3. @Service :用于标注业务层类
  4. @Controller :用于标注控制器类(将当前类作为一个控制器类)

@RequestMapping使用

可以放在类的前面,可以放在方法前面,有两种方式,两种方式放的位置不同,使用的方式也就不同。如果要访问hello方法

public void demo(){
    @RequestMapping(value="/hello",method = RequestMethod.GET)
	public String hello() {
		System.out.println("hello springMVC!");
		//返回的jsp文件名
		return "null";
	  }
	}

那么在jsp页面上输入:<%response.sendRedirect(“hello”);%>,现在在现有的代码上改进,如下:

@RequestMapping("admin")
public void demo(){
    @RequestMapping(value="/hello",method = RequestMethod.GET)
	public String hello() {
		System.out.println("hello springMVC!");
		//返回的jsp文件名
		return "null";
	  }
	}

那么现在访问的话就不能刚刚那么访问了,在jsp页面hello前加admin
<%response.sendRedirect(“admin/hello”);%> 就可以了,就是将访问路径加一个前缀,如果加上method = RequestMethod.GET只能用get访问方式才能访问,还有一个post,用法都是一样的。如果不加,不管你是get方式访问还是post方式访问,都可以访问。

@RequestParam使用

通常我们有些时候需要从jsp页面传值,那么springMVC提供了@RequestParam注解,那么怎么是用呢?

public void demo(){
    @RequestMapping(value="/hello",method = RequestMethod.GET)
	public String hello(@RequestParam(value="page")String page) {
		System.out.println("page:"+page);
		//返回的jsp文件名
		return "null";
	  }
	}

通过jsp页面:<%response.sendRedirect(“admin/hello?page=123”);%>访问,那么hello方法就有page值了。

@ModelAttribute使用

<form action="login" method="post">
   <table>
      <tr>
        <td>用户名:</td>
        <td><input type="text" name="name"/></td>
      </tr>
      <tr>
        <td>密码:</td>
        <td><input type="password" name="pass"/></td>
      </tr>
      <tr>
        <td><input type="submit"></td>
      </tr>
   </table>
</form>
@RequestMapping(value="/login",method = RequestMethod.POST)
	public String login(@ModelAttribute("user")User user) {
		System.out.println("用户名"+user.getName()+"密码"+user.getPass());
		if("admin".equals(user.getName())&&"123123".equals(user.getPass())) {
			System.out.println("登录成功");
		}else{
			System.out.println("登录失败");
		}
		return "hello";
	}

其实@ModelAttribute(“user”)可以省略不要,因为jsp里的name的值只要和实体类的的变量名相同,就会自动装配。

@PathVariable

@RequestMapping("/delete/{userid}")
public String delete(@PathVariable("userid")int userid) {
	System.out.println("userid=" + userid);
	return "hello";
}

@PathVariable:用来映射URL中的占位符。映射的变量名必须和占位符中的名称一致,那么跳转过来的连接必须要有userid这个值。

@ControllerAdvice

全局捕获异常类,只要作用在@RequestMapping上,所有的异常都会被捕获

@ExceptionHandler

在服务器代码出现异常的时候使用,例:

//捕获所以异常
@ControllerAdvice
public class Exceptions{
    //捕获算数异常
	@ExceptionHandler({ArithmeticException.class})
	public ModelAndView ArithmeticException(Exception e) { 
		ModelAndView mv=new ModelAndView();
		//将错误信息放入ModelAndView 对象中
		mv.addObject("e",e.getMessage());
		//将返回页面放入ModelAndView 对象中
		mv.setViewName("error");
		return mv;
	}
}

@RequestHeader

@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader("Accept-Language") String language){
	System.out.println("language=" + language);
	return "hello";
}

@CookieValue

@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("Sessionid")String sessionid){
	System.out.println("sessionid=" + sessionid);
	return "hello";
}

请求头包含了若干的属性,用来获取客户端的信息。通过@RequestHeader可以用来获取请求头中的信息。

@SessionAttributes

@SessionAttributes("user")
@Controller
@RequestMapping("world")
public class HelloWorld {
	@RequestMapping("/testSession")
	public String testSession(Map<String,Object> map){
		User user = new User();
		user.setUsername("zhangsan");
		user.setUserpass("123");
		user.setAge(20);
		map.put("user", user);
		return "hello";
	}
}

@SessionAttributes注解只能放在类的前面,而不能放在方法前,如果类的前面有@SessionAttributes(“user”),那么map存值的时候map的key值和@SessionAttributes的value值一样就会将值存入session中。

return 作用(附加)

return 就是放回jsp页面的名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值