Controller
大概
上一篇我们编写了springmvc.xml和web.xml
这一篇我们来编写controller类(负责传递参数)
1 | @Controller//若开启了注解开发,非注解开发不用写 |
2 | @RequestMapping("/abc")//1.用来划分模块 2.避免命名冲突 |
3 | Public class TestController{ |
4 | @Resource(name="testservice")//根据名字自动注入,new一个TestService,调用它 |
5 | private TestService testservice; |
这里又有个@RequestMapping,用来给每个方法划分请求
@RequestMapping
value:表示访问路径,指定请求url
method:这里表示访问方法时,配置请求的方式是get或者post,默认都处理
params:
params={“a”}//发起请求时,必须带参数,且参数名必须是a;
params={“!b”}//发起请求时,带的参数不能是b;
params={c=1234}//发起请求时,带的参数必须是c且是1234;
params={“a”,”!b”,”c=1234”}//按顺序加条件
例如:
1 | @RequestMapping(value="/method",method= {RequestMethod.POST,RequestMethod.GET},params= {"a","!b","c=1234"}) |
2 | //方法指定为post或get方法,参数必须有a,必须没有b,c必须等于"1234" |
接下来写Controller的具体方法
方法可以有三种返回值:
- 返回ModelAndView(不支持重定向)
1 | @RequestMapping(value="/method") |
2 | public ModelAndView method(){ |
3 | Emp emp=new Emp();//自己创的实体类 |
4 | ModelAndView mav =new ModelAndView(); |
5 | mav.addObject("Emp", emp);//相当于request.setAttribute("Emp", emp),捆绑参数 |
6 | mav.setViewName("index");//跳转指定路径,前缀后缀上一篇配置环境的时候写了 |
7 | return mav; |
8 | } |
- 返回字符串
这里着重写一下返回值为String的
1 | @RequestMapping(value="/method1") |
2 | public String method1(HttpServletRequest request) { |
3 | Emp emp=new Emp(); |
4 | request.setAttribute("emp", emp);//保存参数 |
5 | return "index";//跳转指定路径 |
6 | } |
7 | |
8 | //返回foward |
9 | @RequestMapping(value="/method2") |
10 | public String method2(HttpServletRequest request) { |
11 | Emp emp=new Emp(); |
12 | request.setAttribute("emp", emp);//保存参数 |
13 | return "forward://index.jsp";//跳转指定路径,不会拼接字符串 |
14 | } |
15 | |
16 | //返回redirect |
17 | @RequestMapping(value="/method3") |
18 | public String method3(HttpServletRequest request) { |
19 | Emp emp=new Emp(); |
20 | HttpSession session=request.getSession(); |
21 | session.setAttribute("emp", emp);//保存参数 |
22 | return "redirect://index.jsp";//跳转指定路径,不会拼接字符串,因为request重新请求了,无法保存request |
23 | } |
- 返回void
支持的五种对象
前两种不建议经常使用,因为属于Servlet包下的对象
- HttpServletRequest(请求对象,所有请求相关的数据都在里面,使用quest时往往需要response,因为跳转方法需要两个参数)
1 | String username=request.getParameter("username"); |
2 | System.out.println(username); |
- HttpServletResponse(响应对象,拿到他的目的一般是设置响应类型,可能响应不同要重新设置以下)
1 | System.out.println(response.getLocale().getCountry()+"_"+response.getLocale().getLanguage()); |
2 | //国际化:获取国家和语言 |
- HttpSession(会话对象,可以获取会话域的数据,也可以对会话域的数据进行设置)
1 | System.out.println(session.getId()); |
- Model(相当于request.setAttribute(“Emp”, emp))
1 | model.addAttribute("Emp", emp); |
- ModelMap(同Model)
1 | modelMap.addAttribute("title","员工信息表"); |
参数绑定
简单类型绑定
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。
最好使用包装类绑定参数,而不是使用基本数据类型,因为本质上是使用了.valueOf()方法
高级参数绑定
绑定POJO参数,参数名和对象名相同即可,若字段为复合属性可以加个.(例如dept.dname)
1 | public String ezmethod(Model model,HttpServletRequest request,@RequestParam(value="id",defaultValue="2")Integer idd) |
总结
- value:
参数名字,即页面参数名和对象的属性名字不对应时使用。 - required:
是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错。 - defaultValue
默认值,表示如果请求中没有同名参数时的默认值。- void
不响应跟我们以前的做法很接近 - ModelAndView
只支持跳转,mav.addObject(“message”, “修改成功”); - String
这种方式反映了springMVC框架的兼容性好,既能跳转,又能重定向
①跳转和传数据:使用model传数据,返回视图的逻辑名即可。
②重定向:返回字符穿加上redirect即可,注意这个字符串视图解析器时不会加上前缀和后缀。
所以得出结论:只要返回字符串有redirect前缀,或者forward前缀,那么视图解析器解析的时候不会加上前缀和后缀。