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}
【总结】:这一篇文章主要掌握,如何去映射地址,如何去接受参数,如何跳转页面的技巧就可以
- SpringMvc入门到开发(三)之注解的控制器
- SpringMVC入门之注解式控制器
- SpringMVC入门(三) 注解的使用
- SpringMVC入门之三:控制器&模型
- SpringMVC入门到理解之谈控制器
- SpringMVC学习之基于注解的控制器
- SpringMVC之用注解控制器
- SpringMVC之用注解控制器
- SpringMVC详解(三)------基于注解的入门实例
- SpringMVC详解(三)------基于注解的入门实例
- SpringMVC详解(三)------基于注解的入门实例
- SpringMVC详解(三)------基于注解的入门实例
- SpringMVC框架笔记整理(三): 注解式控制器-数据处理
- springmvc注解开发入门
- SpringMVC--注解驱动的控制器
- SpringMvc入门到开发(一)之入门小程序
- SpringMVC 配置之浅谈传统的非注解控制器
- J2EE系列之SpringMVC学习笔记(三)--SpringMVC控制器
- 编译驱动指定额外的Module.symvers文件
- [Gradle] 如何在android项目中对纯Java module使用release/debug build并启用proguard
- 【Go】Beego Orm中反射的应用
- windows Charles iphone https 抓包 2017-07-21
- 输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
- SpringMvc入门到开发(三)之注解的控制器
- HttpClient get、post请求
- Mongodb存储特殊字符串报错的处理
- 一个人靠不靠谱,就看这三件小事
- Maven安装配置
- 虚继承和虚基类的对象模型
- 【解决】AH01909: www.example.com:443:0 server certificate does NOT include an ID....
- docker容器超级命令集合
- JEESZ分布式框架--开发环境部署