SpringMvc入门到开发(三)之注解的控制器

来源:互联网 发布:编程就业培训中心 编辑:程序博客网 时间:2024/06/06 13:11

所有资料打包下载:有需要的可以下载
http://download.csdn.net/download/xiaozhegaa/9907441

说明:在第一篇中写了自己学习的小小心得,这篇主要是掌握心得中写的几个知识点,如果感兴趣的返回去看一下。在第一段
这一篇文章内容的目标:
1. 了解注解的控制器。核心就四五个
2. 了解model,modelMap,用来接收数据,传递数据技术
3. 看完这篇之后,掌握如何去映射地址,如何跨页面传递数据,如何收集数据,如何转发,jsp页面如何显示的技术
【这样我们就能够简单开发了】

以下的操作都建立在我已经配置了DispatcherServlet和开启注解扫描的基础之上。【假如没有配置前端控制器,其他操作都是无用,不会配置的,看第一篇入门案例。注解扫描下面】
一 @Controller:申明是控制器的注解
简单来说就是,在一个类的上面写该注解,表示该类就是一个SpringMVC的Controller对象。在springmvc-config.xml开启扫描时,才会去扫描该类。自动建立Bean对象。如果没有写的话,就不会去扫描该类,建立该类的bean对象
【注意:】使用注解的时候一定要开启注解扫描。在springmvc-config.xml配置

<!-- 使用注解的方式去扫描 --><context:component-scan base-package="dgut.xiaozheng.hander" />

二 @RequestMapping:它可以应用在类或者方法上,value指向的是它的一个映射路径。
1. 入门案例

//解释:这里的@RequestMapping的value属性说明你你想要访问该方法的路径是什么、?//http://127.0.0.1:8080/项目名/helloTest.action//value = "/helloTest.action",跟value = "/helloTest",我在xml中配置拦截的是,*.action,所以springmvc会自动补上".action"。个人建议还是写前者@Controllerpublic class HelloControllerZhuJie {    @RequestMapping(value = "/helloTest")    public ModelAndView helloTest() {        ...............}
//若是以下这种方式的话,那么它的访问路径为//http://127.0.0.1:8080/项目名/user/addUser.action@Controller@RequestMapping(value ="/user")public class UserController {    @RequestMapping(value = "/addUser.action")    public ModelAndView addUser() {        ...............}
//请求的路径中包含变量的问题//访问网址:http://localhost:8080/SpringMVCTest/helloTest/123456//123456就是传递的参数@RequestMapping(value ="/helloTest/{userId}",method=RequestMethod.GET)    //通过@PathVariable把变量中的useId赋值给 同名的userId    public ModelAndView helloTest(@PathVariable String userId) {}//这里我遇到了一个问题,如果我在Web.xml中配置的是:拦截的地址<url-pattern>/*</url-pattern><url-pattern>*.action</url-pattern>//就注入不了,报错//若是配置成以下这样就可以。具体原因我研究出来后再写上来<url-pattern>/</url-pattern>

【特别注意的一点是:】一定要在类上注解@Controller,springmvc才会去扫描里面的东西。否则的话,下面的注解是没有发挥作用的。你可以试一下。以上两个注解已经能够解决了我第一篇文章中,为什么我知道输入怎样的路径去访问该方法了。
2:常用的属性详解:
value属性:表示将value属性将URL映射到该方法上,上述有两个例子了。默认值是value。也就是上述中,我也可以写成@RequestMapping(‘/addUser.action’)。当然,如果说写多个属性的话,那么value就不能够省略,一定要写上去。也可以是空字符串哦
method属性:该属性来指示该方法仅仅处理哪些HTTP请求

    //注意:这里需要记住RequestMethod静态类    //这里设置里只处理Get方式的addUser映射    @RequestMapping(value = "/addUser.action",method =RequestMethod.POST)    //这里设置里只处理Get方式的addUser映射    @RequestMapping(value = "/addUser.action",method =RequestMethod.GET)    //这样就可以设置,根据不同的method值提交到同一个相同的路径上

如果说,没有指定method的属性值的话,那么默认是处理任意的HTTP协议
这里写图片描述
consumes属性:指定处理请求的提交内容类型(Content-Type)(少用)

//设置了该方法仅仅处理request Content-Type为"application/json"类型的请求@RequestMapping(value="/hello.action,consumes="application/json")

produces属性: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

@Controller@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")public Pet getPet(@PathVariable String petId, Model model) {        // implementation omitted}// 方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;

params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

//SpringMVCTest指的是项目名,如果你没有带参数xiaozheng=xiaozheng的话,那么就不给你访问//http://localhost:8080/SpringMVCTest/helloTest.action?xiaozheng=xiaozheng@RequestMapping(value ="/helloTest",method =RequestMethod.GET,params="xiaozheng=xiaozheng")    public ModelAndView helloTest() {
//一样,如果请求头不带http://www.xiaozheng.com/,就不给访问@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.xiaozheng.com/")  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {        // implementation omitted  }}

三:请求处理方法默认支持的参数类型
这里写图片描述

1.HttpServletRequest:通过request对象获取请求信息
2. HttpServletResponse:通过response处理响应信息
3. HttpSession:通过session对象得到session中存放的对象
4. Model/ModelMap:下面详细讲
5. ModelAndView
6. ……………………………………………..
7.
//从上面可知道,有了request,response,session对象,我们是可以实现向jsp页面获取数据,并且传递数据,并且是可以转发,重定向都可以操作了。但是一般来说,Model、ModelMap、ModelAndView的功能也是类似的,使用框架的技术来获取数据比较简单点,接下来就详细讲一下这三个参数

1:ModelAndView:如果控制器的返回值是ModelAndView的话,则其包含了模型数据信息和视图信息。可以简单看成一个Map < String ,Object > 对象。当然ModelAndView也可以不带在参数里面,直接new 出来

    //在处理方法中,可以使用addObject()添加模型数据 ==     //本质都是跟 request.setAttribute(arg0, arg1)一样的。jsp中可以用${requestScopre.attributeName}获取    addObject(String attributeName,Object attributeValue)    //可以通过如下的方法设置视图。viewName显示视图的路径    setViewName(Stringn viewName)

2:Model:除了ModelAndView以外,还可以使用Model来向页面传递数据,
Model是一个接口,在参数里直接声明model即可。
如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。

//在处理方法中,可以使用addAttribute(String attributeName,Object attributeValue)添加数据// 把商品数据放在模型中model.addAttribute("item", item);//设置视图路径,方法的返回值是String,直接返回视图的路径就可以了return "WEB-INF/content/item.jsp";

3:ModelMap:ModelMap是Model接口的实现类,也可以通过ModelMap向页面传递数据

    //使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。    //函数都是跟Model一样的

【总结:】
如果使用Model则可以不使用ModelAndView对象,两者选一个。或者说三个选一个,根据个人习惯来选择。我习惯用ModelMap model。就算是使用Model model参数,springmvc还是会实例化ModelMap。那么…………以上我们就掌握了向View视图传递数据的技术

四:参数绑定注解【学习这几个就可以实现获取View视图传递过来的数据】
4.1 @RequestParam注解:用于将指定的请求参数赋值给方法中的形参
详解:在默认情况下,可以在方法中写一个变量,这时候的变量名跟表单中的name值是一样的,那么springmvc自动把表单的数据封装到参数中去。但是如果有种情况,表单的name值跟方法中的参数名字不一样的时候,就可以使用@RequestParam指定封装到某个变量上去

    //例如在register.jsp中,有此字段    <input type="text" name="username" placedholder="请输入你的用户名">    //在控制器中,默认会把 参数中的username跟传递过来的表单项中name为username的绑定在一起。这样就可以收集到数据了    @RequestMapping("/user")    public String addUser(String username){        System.out.println(username);    }    //如果我想把值注入到name中,此时是匹配不到表单中有name值为name的表单项,故可用@RequestParam    //指定了把username对象 放到name中。    public String addUser(@RequestParam("username") String name){    }    //若@RequestParam没带任何参数,则跟第一种情况是一样的

补充以下@RequestParam的其他属性
1)value:请求绑定的名称,默认是这个,如上面的表单名
2)required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错
TTP Status 400 - Required Integer parameter ‘XXXX’ is not present

3)defaultValue:如果没有传递参数,使用该默认值

@RequestParam(value="loginname" required="true" defalutValue="admin")

演示案例,这里我采用get方式请求,直接在get方式带参数,懒得写一个表单
这里写图片描述
【总结】到此,我们已经掌握了简单类型的参数绑定。当然还有高级的参数绑定,放在后面讲吧。绑定数组,绑定list,map。都是大同小异的,有必要的话会在后面总结
Springmvc的各种类型参数绑定 案例下载,里面有开发步骤跟截图,有需要的下载:
http://download.csdn.net/detail/xiaozhegaa/9906508

4.2 @PathVariable注解:非常方便的获取请求的URL中的动态参数。举个例子

//在请求的URL中含有变量参数,使用@PathVariable可以把该userId注入到参数中//如果两者是同名的话,直接用@PathVariable //如果两者不同名的话,用@PathVariable(value="userId")String id。value可以省略@RequestMapping(value ="/helloTest/{userId}")public ModelAndView helloTest(@PathVariable String userId) {    .......................}

4.3 @RequestHeader注解:将请求的头信息区数据映射到功能处理方法上。
举个例子

//把请求头的信息赋值到参数中,很少用。稍微了解吧public String addUser(        @RequestHeader("User-Agent") String userAgent,        @RequestHeader(value = "Accept") String accept){    }

4.4@CookieValue注解:用于将请求的Cookie数据映射到功能的处理方法参数上。其实跟上面两个很像
举个例子

//把请求的Cookie值封装到参数上,很少用。稍微了解吧public String addUser(        @CookieValue(value="JSESSIONID" defaultValue=" ") String sessionId){        ..........    }//它还有几个属性值,跟RequestParam一样,这里不就累赘了 value,require,defaultValue

五:@ModelAttribute(value=”“):将请求的参数绑定到Model对象上。被@ModelAttribute()注释的方法,会在Controller每个方法执行前被执行,所以要慎重使用
接下来演示@ModelAttribute(value=”“)使用的几种情况
1.测试@ModelAttribute(value=”“)注释返回具体类的方法

@Controllerpublic class User{    @ModelAttribute("username")    public String  beforeHelloTest(String username) {        System.out.println("========");        System.out.println(username);        System.out.println("========");        return username;    }}//结果,在执行该控制器的其他方法时候,都先执行该方法。并且它获取一个叫username的变量值。注入到参数中,//并且return username 实际上是存储到了request域对象中

2.测试@ModelAttribute(value=”“)注释void返回值方法

@Controllerpublic class User{    @ModelAttribute    //默认器找存在username的变量,把它注入到username中    public voidbeforeHelloTest(String username,ModelMap model) {        //如果是返回void值的话,那么就只能手动向jsp传递数据了        model.addAttribute(username);    }}

3.测试@ModelAttribute(value=”“)注释返回具体类的方法

@Controller@ModelAttributepublic class User{    //默认器找存在username的变量,把它注入到username中    public voidbeforeHelloTest(String username,ModelMap model) {        //如果是返回void值的话,那么就只能手动向jsp传递数据了        model.addAttribute(username);    }}

4.测试@ModelAttribute(value=”“)和@RequestMapping同时注释一个方法

    @ModelAttribute    @RequestMapping(value ="/helloTest",method=RequestMethod.GET)    public String helloTest() {        return "content/helloTest";    }    //结果显示:此时的返回值已经不是一个视图了,而是一个字符串,存到了request域中。    //并且它默认的视图走的是helloTest.jsp。这个就是你访问的RequestMapping路径

这里写图片描述
5.测试@ModelAttribute(value=”“)注释一个方法的参数

@ModelAttribute("user")public User userModel(){    ......    return user;}@RequestMapping(value="/login")public String login(@ModelAttribute("user" User user)){    //使用该User}

【总结】:这一篇文章主要掌握,如何去映射地址,如何去接受参数,如何跳转页面的技巧就可以

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机重启忘记解锁密码怎么办 华为荣耀8手机开不开机怎么办 苹果5c手机开机密码忘了怎么办 魅蓝note6打王者掉帧怎么办 王者荣耀6月26日活动怎么办 荣耀v9玩刺激战场掉帧怎么办 华为荣耀v9进水开不开机怎么办 魅蓝2玩游戏超卡怎么办 华为手机突然黑屏开不了机怎么办 三星a9开机混合密码忘了怎么办 三星a9锁屏密码忘了怎么办 华为6x手机电源键失灵怎么办 华为手机更换主题后图标不变怎么办 手机屏幕上的拨打电话键没了怎么办 小米手机电用完了充不进去怎么办 华为微信分身版本过低怎么办 手机连接不上4g网络怎么办办 手机通话时老返回锁屏怎么办 小米手机指纹解锁按键不灵了怎么办 小米手机4s黑屏开不了机怎么办 手机老年机突然黑屏开不了机怎么办 苹果7P遮挡传感器就黑屏怎么办 手机被偷支付宝的钱被偷怎么办 oppo手机微信视频黑屏了怎么办 小米账号锁死插卡不显示卡怎么办 红米手机充电时不黑屏怎么办 酷派手机开机出现系统错误怎么办 乐视1s手机开不了机怎么办 酷派手机的信息文件夹不见了怎么办 酷派手机开机卡在开机界面怎么办 魅蓝拨号键老是闪退怎么办 手机上浏览器搜索时字在右边怎么办 酷比魔方平板开不开机怎么办 红米手机摔了有一角黑屏了怎么办 红米手机刷机黑屏打不开怎么办 魅蓝x一打电话就黑屏怎么办 红米手机黑屏打不开怎么办充电发烫 小米手机打电话来是关机的怎么办 红米手机打电话自动灭屏怎么办 红米5s手机白屏怎么办 红米手机黑屏开不了机怎么办