为什么要是用注解
在表面上看来,我们通过注解的方式减少了一个XML配置文件,减少了开发代码量。但这真的是我们用注解而不用 XML 配置文件的原因吗?
在回答这个问题之前,我们再来回顾一下上面两种配置方式的特点:
对于注解的方式。我们会发现它和代码结合得很紧密,所以注解比较适合做一些与代码相关度高的操作,例如将Bean对应的服务暴露出去。
对于XML配置方式。我们会发现它将配置和代码隔离开来了所以XML配置更适合做一些全局的、与具体代码无关的操作,例如全局的配置等。
我相信很多人此前对于注解的认识就是方便开发。但事实上使用注解还是XML的判断标准应该是:该配置与代码的相关度。如果代码与配置相关度高,那么使用注解配置,否则使用XML配置,注释和 Java 代码位于一个文件中,更加便于维护。
具体有那些注解(其实这些效果都是一样的,只是为了便利以后更利于维护)
- @Component:一个普通的Bean类。
- @Repository :用于标注持久层DAO类
- @Service :用于标注业务层类
- @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页面的名称