SpringMVC注释(个人学习版)

来源:互联网 发布:linux sort k 编辑:程序博客网 时间:2024/06/10 00:26

1.@Controller

从注解的名字就可以看出,它是用来定义控制器的。首先控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在传统的MVC中,我们要创建相应的Servlet类,通过HttpServletRequest 和HttpServletResponse等HttpServlet对象,对页面中的值进行获取和处理,并且需要在XML文件中进行相应的配置。这个过程极其的麻烦。

而我们使用@Controller就变的很简单。首先通过注解@Controller可以告诉sping这个类是一个Controller。然而我们要通过在配置文件中写出配置信息来告诉spring去哪里找控制器类。
如下:

<context:component-scan base-package="com.sping.springmvc"></context:component-scan>

这种写法,是自动扫描所有包含com.sping.springmvc前缀的包。

然后更加精确的写法就是:

<context:component-scan base-package="com.sping.springmvc.controller"></context:component-scan>

我们直接所有的控制器文件放在这个包下就可以了。

2.@RequestMapping

当我们已经给一个类变成了Controller,但是spring怎么知道这个控制器要处理哪个请求呢?这就需要@RequestMapping注解(分发处理器将会扫描使用了@Controller的类的方法,并检测该方法是否使用了@RequestMapping 注解)。

@Controller@RequestMapping("book") // 设置那些URL可以访问这个类@RequestMapping("/book") //两种写法一样public class BookController {    @RequestMapping("select") // 修饰方法,设置哪个URL可以访问当前方法    public String select() {        System.out.println("所有图书");        return "success";    }}

3.URI模板

有这样一个场景,我们要在看小说的时候,我们可能会点击一本书中的不同章节,然而在同一本的链接目录下,如何区分我们点击的是那一章呢?这时候就用到了URI模板。比如我们访问http://localhost/sping/book/{variable},我们可以给variable传不同的值,然后通过映射来访问不能的页面。

@Controller@RequestMapping("book/{value1}") public class BookController {    @RequestMapping("select/{bookid}")    public String select(@PathVariable String value1,@PathVariable("bookid") Integer bookId) {        System.out.println("在书" + value1 + "中查看章节号为" + bookId + "的章节");        return "success";    }}

URI模板可以再类和方法中使用。比如访问http://localhost/spring/book1/10,控制台就会输出“在书book1中查看章节号为10的章节”。

这俩面要注意@PathVariable括号中的内容,如果变量名和参数名相同,则直接在注解后接参数就可以;如果变量名和参数名不同,需要在括号中指定变量名和哪个参数对应。

@RequestMapping还支持通配符“*”:

@Controller@RequestMapping("/book") public class BookController {    @RequestMapping("*/select")    public String select() {        System.out.println("return success");        return "success";    }}

这样我们可以访问/book/anyone/select页面中的内容。

4.用@RequestParam绑定请求参数到控制器方法参数

和@PathVariable相类似,@RequestParam也是用来绑定参数的注解。用法也是相似的。

    @RequestMapping("login")    public String login(@RequestParam(required=false) Integer userId,@RequestParam("password") String password){        System.out.println(userId);        System.out.println(password);        return "success";    }

这里我们也同样要指定请求参数和方法参数的对应关系。

属性required ,它表示所指定的参数是否必须在request 属性中存在,默认是true ,表示必须存在,当不存在时就会报错。我们可以在请求参数中不传入usreId,但是不能缺少password。

虽然我们运用了@RequestParam和@RequestVariable等“高级”的用法,但是不代表我们不可以使用HttpServletRequest,HttpServletResponse,HttpServletSession等原生方法。

    @RequestMapping("insert")    public String insert(EmpEntity entity,HttpServletRequest req){        entity.setEmpId(Integer.valueOf(req.getParameter("empID")));        System.out.println(entity);        return "success";    }

正如上面的代码所示,我们仍然可以利用HttpServletRequest 来获取请求参数

而在传入的第一个参数我们看到是一个实例变量。这也是springmvc的一个特殊的用法。比如我们在注册用户信息的时候,会在页面中所有的用户信息,而这些信息也会在实体类中进行封装。所以我们直接传入一个实体类实例,就可以完成所有请求参数的接受。

5.使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据

在传统的mvc中,我们通常利用req.setAttribute()和req.getSession().setAttribute()两种方法来存储和传递数据。
而在springmvc中,可以使用ModelAttribute 和 @SessionAttributes 传递和保存数据。而@ModelAttribute可以放在方法上面,也可以放在方法的参数里。

class User{    private String userName;    public User(String user){        setUserName(user);    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }}@Controller@RequestMapping("Modeltest")public class ModelAttributeTest {      @ModelAttribute ( "world" )        public String getModel() {           System. out .println( "-------------world---------" );               return "world" ;//此处会将返回值保存在模型模型中(world)        }        @RequestMapping ( "sayHello" )        public void sayHello( @ModelAttribute ( "world" ) String world,@ModelAttribute ( "user2" ) User user, Writer writer, HttpSession session) throws IOException {           writer.write( "Hello " + world + " , Hello " + user.getUserName());           writer.write( "\r" );        }        @ModelAttribute ( "user2" )        public User getUser() {           System. out .println( "---------getUser-------------" );               return new User("user2" );//将一个对象保存在模型中(user2)        }}

当我们访问Modeltest/sayHello时,程序会自动将@ModelAttribute()中的值传入方法形参中。

@SessionAttributes 的使用请查看链接:SessionAttribute

6.使用Model 保存和向前台页面传递数据

后台代码:

@RequestMapping("user")public class UserController {    @RequestMapping("convert")    public String convert(UserEntity user, Model model) {        model.addAttribute("userEntity", user);//        return "success";    }}

jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>${requestScope.userEntity.userId }<br>${requestScope.userEntity.userName }<br>${requestScope.userEntity.userSalary }<br>${requestScope.userEntity.userBirthday }</body></html>

这里我们可以通过传一个model参数,通过model.addAttribute(key,value)的方式将要保存的值放在模型中,这样就可以将值传到jsp页面中,这种做法类似与req.setAttibute和session.setAttibute,所以更容易理解。

7.@RequestMapping高级用法

1.params属性

@RequestMapping(value = ” path ” , params = { param1 [ , … ] } )

@RequestMapping (value= "testParams" , params={ "param1=value1" , "param2" , "!param3" })    public String testParams() {       System. out .println( "test Params..........." );       return "testParams" ;    } 

我们用@RequestMapping 的params 属性指定了三个参数,这些参数都是针对请求参数而言的,它们分别表示参数param1 的值必须等于value1 ,参数param2 必须存在,值无所谓,参数param3 必须不存在,只有当请求/testParams.do 并且满足指定的三个参数条件的时候才能访问到该方法。

2.method属性

这个属性一般我们在使用REST Ful风格 的时候会用到它。

REST Ful风格:
关于REST Ful风格的介绍可以参照REST Ful及相关用法

简单来讲,REST Ful中包含使用HTTP协议的四个动词表示程序中四个基本操作:
GET:查询
POST:添加
PUT:修改
DELETE:删除
我们在编写表单的时候,可能会使用特定的提交方法,尤其是PUT,DELETE,如何让服务器识别并且正确的跳转的相应的处理方法呢?这里就要使用method属性。这里注意的是,Tomcat1.8版本之后是默人不支持PUT和DELETE的,如果需要修改相应服务器配置。

jsp页面:

    <form action="test/user/100">        <button type="submit">查询</button>    </form>    <form action="test/user" method="POST">        <button type="submit">添加</button>    </form>    <!-- HiddenHttpMethodFilter类中的doFilterInternal()方法,会先判断请求是get还是post模式 -->    <!-- 如果是get模式,则doFilterInterval()不进行处理,如果是post模式,则查看请求红是否有_method的值,如果有,则改成相应模式 -->    <form action="test/user" method="POST">        <input type="hidden" name="_method" value="PUT" />        <button type="submit">修改</button>    </form>    <form action="test/user" method="POST">        <input type="hidden" name="_method" value="DELETE" />        <button type="submit">删除</button>    </form>

后台代码:

@RequestMapping("user/{userId}")    public String select(@PathVariable Integer userId) {        System.out.println(1);        return "success";    }    @RequestMapping(value = "user", method = RequestMethod.POST)    public String insert() {        System.out.println(2);        return "success";    }    @RequestMapping(value = "user", method = RequestMethod.PUT)    public String update() {        System.out.println(3);        return "success";    }    @RequestMapping(value = "user", method = RequestMethod.DELETE)    public String delete() {        System.out.println(4);        return "success";    }

当我们一次点击这四个提交按钮时,控制台就会顺次打印1,2,3,4。

虽然我们做到了让服务器执行不同提交类型的方法,但是PUT,DELETE说到底还是POST类型。

我们也需要在配置文件中做相应配置:
web.xml

<filter>        <filter-name>HiddenHttpMethodFilter</filter-name>        <!-- HiddenHttpMethodFilter类将post模式转换put或delete模式 -->        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>HiddenHttpMethodFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

HiddenHttpMethodFilter类中的doFilterInternal()方法,会先判断请求是get还是post模式
如果是get模式,则doFilterInterval()不进行处理,如果是post模式,则查看请求红是否有_method的值,如果有,则改成相应模式。

3.headers属性

@RequestMapping (value= "testHeaders" , headers={ "host=localhost" , "Accept" })    public String testHeaders() {       return "headers" ;    } 

headers 属性的用法和功能与params 属性相似。在上面的代码中当请求/testHeaders.do 的时候只有当请求头包含Accept 信息,且请求的host 为localhost 的时候才能正确的访问到testHeaders 方法。

关于更多@RequestMapping可以参照刚才的链接。

[部分内容转自链接] http://www.cnblogs.com/xiepeixing/p/4243288.html

原创粉丝点击