SpringMVC入门二(参数的绑定,方法参数中所支持的对象,请求映射)

因为SpringMVC是基于方法的,因此要在controller的方法上加上请求映射。当然也可以在类上加,形成多级路径。可以通过@RequestMapping(“url”)来添加。这个Annotation中还可以指定请求的方法,post?get?。
对请求进行处理的方法(即@RequestMapping标注的方法)对请求进行处理时可以接收五种参数。有:

  • HttpServletResponse resp
  • HttpServletRequest req
  • HttpSession session
  • InputStream对应req.getInputStream
  • OutputStream对应resp.getOutputStream
得到req对象后,可以通过req.getParameter()方法获得请求中的参数。但是也可以通过@RequestParam("user")String username直接将请求中的user参数注入到username(形参)中。
以下是用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";
    }
}

程序注释:

  1. @Controller和@Component、@Repository、@Service功能一样,都是让spring实例化此对象,在ApplicationContext.xml中要开启包扫描。
  2. @RequestMapping指出了controller的url。通过此url,请求就能送达该controller
  3. handle1方法中可以将上述的几个对象作为形参,还可以有Model和ModelAndView
  4. 由打印在控制台的结果可得,通过@RequestParam得到的参数和通过req对象得到的参数一致。其实,当表单中的参数名和形参名一致时,可以不用加@RequestParam,上例中就可以不加。
    1. 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---
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值