SpringMVC_3.x_入门指南_2
@Controllerpublic class UserController {@RequestMapping("/user/list")public String userList(){return "user/list";}@RequestMapping(value="/user/add",method=RequestMethod.GET)public String addForm(){return "user/add";}}
这样可以实现,但是不是很方便,我们通过在类上加注解实现namespace
?
?
@Controller@RequestMapping("/user")public class UserController {@RequestMapping("/list")public String userList(){return "user/list";}@RequestMapping(value="/add",method=RequestMethod.GET)public String addForm(){return "user/add";}@RequestMapping(value="/add",method=RequestMethod.POST)public String addUser(){return "user/list";}}如果把@RequestMapping后的括号去掉,直接访问/user即可访问仅带有@RequestMapping的方法
?
注意:一个类中只能存在一个没有配置的方法
?
@Controller@RequestMapping("/user")public class UserController {@RequestMappingpublic String userList(){return "user/list";}@RequestMapping(value="/add",method=RequestMethod.GET)public String addForm(){return "user/add";}@RequestMapping(value="/add",method=RequestMethod.POST)public String addUser(){return "user/list";}}下面说一下URL传参的问题,也就是上一篇中提到的:
?
/user/1??获取ID=1的用户
这种方法的实现;
?
@RequestMapping(value="/{id}",method=RequestMethod.GET)public String getUser(@PathVariable int id){System.out.println(id);return "user/list";}通过url传参,{id}表示传入的参数:/user/1,则id=1
?
在方法的参数列表中需要接收url传来的参数,如果{id}与定义的int id相同,则直接@PathVariable int id即可,如果不同的话,使用下面的方式:
?
@RequestMapping(value="/{abc}",method=RequestMethod.GET)public String getUser(@PathVariable("abc") int id){System.out.println(id);return "user/list";}这是何必呢,所以我们大多数情况这个变量名是相同的!!!
?
启动服务器,输入:localhost/user/1
控制台会显示:1
如果要是输入:localhost/user/hh 呢?
肯定是错的呀!!
再次输入:localhost/user/hh
?
@RequestMapping(value="/{type}/{id:\\d+}",method=RequestMethod.GET)public String getUser(@PathVariable int id,@PathVariable String type){System.out.println(type+"----"+id);return "user/list";}输入:localhost/user/student/11
?
显示:student---11
?
使用URL给服务器传值,我们先说这么多,下面我们说一下服务器怎么给页面传值
我们目前不连接数据库,只是熟悉SpringMVC的使用过程,我们创建一个User类!
?
package com.cn.pojo;public class User {private Integer id;private String name;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}我们怎样把一个user对象传给页面呢?
?
第一种方式:
使用SpringMVC的依赖注入:Model接口(Springframework UI 提供的)
?
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET)public String getUser(@PathVariable int id,Model model){System.out.println(id);User user=new User();user.setId(123);user.setName("tom");user.setPassword("000000");model.addAttribute("user", user);//将user装到user中return "user/list";}JSP中使用EL表达式接收:
?
?<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>list.jsp</title> </head> <body> This is list page. <br> <h1>${user.name }----${user.password }</h1> </body> </html>第二种方式:
?
在方法上设置返回值类型为:ModelAndView,使用方法如下:
?
@RequestMapping(value="/{type}/{id:\\d+}",method=RequestMethod.GET)public ModelAndView getUser(@PathVariable int id,@PathVariable String type){System.out.println(type+"----"+id);User user=new User();user.setId(123);user.setName("tom");user.setPassword("000000");ModelAndView mav=new ModelAndView("user/list");mav.addObject("user", user);return mav;}第三种方式:
?
让方法的返回类型直接是User,如下:
?
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET)public User getUser(@PathVariable int id){System.out.println(id);User user=new User();user.setId(123);user.setName("tom");user.setPassword("000000");return user;}启动服务器请求:localhost/user/111??是什么效果呢?
?
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET)public @ResponseBody User getUser(@PathVariable int id){System.out.println(id);User user=new User();user.setId(123);user.setName("tom");user.setPassword("000000");return user;}?或者
?
?
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET)@ResponseBodypublic User getUser(@PathVariable int id){System.out.println(id);User user=new User();user.setId(123);user.setName("tom");user.setPassword("000000");return user;}? 再次启动服务器访问,结果:
?
<!-- 用于对@ResponseBody注解的支持 --><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.10</version></dependency>?
?
再次重启,请求,你会看到很友好的JSON返回!!!你还可以在方法的注解中添加类似之前写的response.setContentType("application/json;charset=UTF-8")
?
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET,produces="application/json;charset=UTF-8")@ResponseBodypublic User getUser(@PathVariable int id){System.out.println(id);User user=new User();user.setId(123);user.setName("tom");user.setPassword("000000");return user;}注意:返回的是JSON,而不是跳转到某一个view。
?
有些公司的做法是不直接返回获得的对象,而是把返回的对象进行封装进一个叫Result的类中:
?
package com.cn.dto;public class Result {private String error;private Object obj;public Result(){}public Result(String error, Object obj) {super();this.error = error;this.obj = obj;}public String getError() {return error;}public void setError(String error) {this.error = error;}public Object getObj() {return obj;}public void setObj(Object obj) {this.obj = obj;}}?
?
dto:Data Translation Object(数据传输对象)
怎么使用呢?把刚才的返回User的方法改造如下:
?
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET,produces="application/json;charset=UTF-8")@ResponseBodypublic Result getUser(@PathVariable int id){System.out.println(id);User user=new User();user.setId(123);user.setName("tom");user.setPassword("000000");return new Result("0", user);}返回的JSON数据如下所示:
?
{"error":"0","obj":{"id":123,"name":"tom","password":"000000"}}
如果成功了,error=0,如果失败了,error=1呗,接收数据的时候,先判断error再决定后续该干啥!
我们上面详细学习了URL给服务器传值的RESTFUL方式(关于restful请查阅这篇博文http://www.ruanyifeng.com/blog/2011/09/restful.html),服务器给页面传值的三种方式,及跳转到VIEWS并显示值,但是如果我们仍然想使用之前用的很熟练的?传值怎么做呢?
我们举一个小小的例子你就明白了。仍然是注解。
?
@RequestMapping("/show")@ResponseBodypublic String showName(@RequestParam String name){return name;}请求:localhost/user/show?name=tom
?
返回的是字符串,@RequestParam表示参数来源与url中?后的name=***。
如果想改变名称:@RequestParam("xingming") String name;你喜欢哪一种方式,自己决定吧!
这样仍然存在一个问题,当你在方法中设置了参数的时候,而你在请求的时候不给它传name,这时是会报错的:
第二中解决方案:设置@RequestParam(defaultValue="rose")默认值,如果没传,就给你显示rose
?
@RequestMapping("/show")@ResponseBodypublic String showName(@RequestParam(defaultValue="rose") String name){return name;}还有一个问题:
我们往往需要执行完一个方法后,跳转到另一个方法,例如:
我执行完添加用户后,我需要跳转到list中去获取最新的用户信息,该怎么办?
操作很简单,执行一下重定向即可!
@Controller@RequestMapping("/user")public class UserController {@RequestMappingpublic String userList(){System.out.println("user list...");return "user/list";}@RequestMapping(value="/add",method=RequestMethod.GET)public String addForm(){return "user/add";}//为了请求的方便,我将请求的method改为GET了!@RequestMapping(value="/save",method=RequestMethod.GET)public String addUser(){return "redirect:/user";}}请求/user/save,则跳转到/user,即userList方法,下跳到user/list.jsp。
最后一个问题:
如果我想使用原来的Request,Response,Application空间,该怎么办呢?
关于这些空间,你需要用的时候,直接拿来用就行了,就跟Model是一样样的!!!
@RequestMapping("/show")@ResponseBodypublic String showName(@RequestParam(defaultValue="rose") String name,HttpSession session,HttpServletRequest request,HttpServletResponse response,ServletContext application){return name;}这些Servlet的API,对象都是依赖注入的,你需要就拿出来用,不需要就算了,太方便了!!!!
?