因为SpringMVC是基于方法的,因此要在controller的方法上加上请求映射。当然也可以在类上加,形成多级路径。可以通过@RequestMapping(“url”)来添加。这个Annotation中还可以指定请求的方法,post?get?。
对请求进行处理的方法(即@RequestMapping标注的方法)对请求进行处理时可以接收五种参数。有:
- HttpServletResponse resp
- HttpServletRequest req
- HttpSession session
- InputStream对应req.getInputStream
- OutputStream对应resp.getOutputStream
以下是用SpringMVC跑的hello username程序。构建一个请求的表单:
<form action="firstMVC/hello.htm" method="post"><!--action的值为多级路径-->
用户名:<input type="text" name="username" required="required" /><br/>
<input type="submit" value="OK"/>
</form>
用户名填写好后,将表单以post的方法交给hello.htm这个Controller,中途会经过前端控制器,前端控制器找到路径后才能到hello.htm,会经过编码过滤器。前端控制器的配置可参考SpringMVC入门一
后端控制器(controller):
Example one:
@Controller
@RequestMapping("/firstMVC")//多级路径
public class controller {
@RequestMapping(value = "/hello.htm",method = RequestMethod.POST)
public String handle1(@RequestParam("username")String username,HttpServletRequest req,Model model)
{
String username1=req.getParameter("username");
model.addAttribute("username",username);
model.addAttribute("equals",username1==username);
System.out.println(username);
System.out.println(username.equals(username1));
return "wel";
}
}
程序注释:
- @Controller和@Component、@Repository、@Service功能一样,都是让spring实例化此对象,在ApplicationContext.xml中要开启包扫描。
- @RequestMapping指出了controller的url。通过此url,请求就能送达该controller
- handle1方法中可以将上述的几个对象作为形参,还可以有Model和ModelAndView
- 由打印在控制台的结果可得,通过@RequestParam得到的参数和通过req对象得到的参数一致。其实,当表单中的参数名和形参名一致时,可以不用加@RequestParam,上例中就可以不加。
- Example two:
@RequestMapping(value = "hello2.htm",method=RequestMethod.POST)
public ModelAndView handle2(String username,ModelAndView modelAndView)
{
modelAndView.addObject("key","Hello SpringMVC");
modelAndView.addObject("username",username);
modelAndView.setViewName("wel");
return modelAndView;
}
Model和ModelAndView中都有个map,用来存储参数对,可以在jsp中通过EL表达式来获取到值。ModelAndView可以设置视图逻辑名称。在这个Demo中参数username前没有加@RequestParam。
请求中的表单也可以映射成一个实体类对象。但是这个类的成员变量要和表单中的参数名相互一致。
实体类的属性,省略get和set以及构造器。
private String username;
private String sex;
表单,参数名和实体类中的成员变量名一致。
<form action="firstMVC/hello3.htm" method="post">
用户名:<input type="text" name="username" required="required" /><br/>
性别:<input type="radio" name="sex" value="M" checked="checked"/>男
<input type="radio" name="sex" value="F"/>女<br/>
年龄:<input type="text" name="age" required="required" />
<input type="submit" value="OK"/>
</form>
controller:
@RequestMapping(value = "hello3.htm",method = RequestMethod.POST)
public ModelAndView handler3(User user,@RequestParam("age") int age,ModelAndView modelAndView)
{
modelAndView.addObject("userObject",user);//将对象添加到模型数据中
modelAndView.addObject("userage",age);
modelAndView.setViewName("wel");//设置viewname
return modelAndView;
}
wel.jsp页面:
<div style="font-size: larger;font-weight: bolder">
Welcome,${userage}岁的${userObject.username}${userObject.sex=="M"?"先生":"女士"}
</div>
生成动态页面,显示welcome20岁的张三先生
或者welcome20岁的李四女士
。
请求路径中的参数绑定:
@RequestMapping(value = "hello4.htm/{userid}",method = RequestMethod.GET)
public void handler4(@PathVariable String userid)
{
System.out.println(userid);
}
index.jsp页面写一个超链接,上面方法所在的类由@RequestMapping("/firstMVC")所注释。
<a href="firstMVC/hello4.htm/1234">Path</a>
点击超链接后会在控制台打印出1234。这里的@PathVariable注释必须加。注意,在有些版本需要将.htm
加在参数后面。
参数直接添加到Model对象中:在访问任意一个由@RequestMapping修饰的方法前,都会执行由@ModelAttribute修饰的方法,这个方法类似于model.setAttribute()。同样在访问hello5.htm之前会先执行setInit方法,将new的user对象直接添加到handler5中的model形参中。@ModelAttribute这个注释也可以修饰形参,意思是根据key取出的object注入到形参中。如下所示
@ModelAttribute("user")
public User setInit()
{
System.out.println("*************");
return new User("张三","M");
}
@RequestMapping("/hello5.htm")
public void handler5(Model model,@ModelAttribute("user") User user)
{
Map map=model.asMap();
User user1=(User) map.get("user");
System.out.println(user1);
System.out.println(user);
}
运行结果如下:
*************
User{username='张三', sex='M'}
User{username='张三', sex='M'}
通过两种方法得到的两个对象一样。
补充:
@ResponseBody修饰的controller表示这个controller给用户直接返回数据,返回的不是视图。返回的信息会直接打印在浏览器的页面。过程如下所示:
@ResponseBody
@RequestMapping(value = "/hello7.htm")
public String handler7(@ModelAttribute("user") User user)
{
System.out.println(user);
JSONObject jsonObject=new JSONObject(user);
System.out.println(jsonObject.toString());
return jsonObject.toString();
}
@RequestBody加在参数前面时表示将json字符串转换为这个对象。但是要配置类型转化器
---The End---
|