SpringMVC (二)Controller注解开发

时间:2021-04-22 05:47:28

一、@Controller

这个注解是用来声明某个类为SpringMVC的一个Controller的。使用方法为在该类声明前添加注解@Controller。在servlet-action.xml中已经设置了自动扫描指定包内的注解,所以不必再为该Controller添加配置。

@Controller
public class MyController {

}

二、@RequestMapping

浏览器通过url将请求发送到服务器时,服务器通过拦截后解析url,根据url执行Controller中的方法,@RequestMapping就是用于映射指定执行哪个方法的注解。@RequestMapping可在注解中注册映射。

@Controller
public class MyController {
//注册映射a.action、b.action都可以访问home方法
@RequestMapping({"a.action","b.action"})
public String home(HttpServletRequest request){

return "";
}
}

三、参数的传递

1.前端传向后端(jsp->Controller)

SpringMVC在传递参数的处理上非常方便,想要在后台得到什么数据,就直接在处理方法的参数列表中添加什么数据,比如,前台收集了用户的登录信息,通过表单提交给Controller中的处理方法,只要在处理方法的参数列表中添加(String username,String password),就可直接拿到前端提交的数据。

login.jsp
<form action="${pageContext.request.contextPath }/login.action" method="post">
用户名:<input type="text" name="username"/>
密 码:<input type="password" name="password"/>
<input type="submit" value="提交"/>
</form>

方法一

@RequestParam()可以指定前端表单中的数据名,没有注解的话默认获取参数列表中定义的名称。

MyController.java

@RequestMapping("login.action")
public String add(@RequestParam("username")String name, String password){


return "";
}

方法二

通过对象来获取数据,SpringMVC会自动帮我们将数据封装到对象中,此时前端中定义的数据名称要与接收类中定义的变量名相同。

@RequestMapping("login.action")
public String add(Person person){
String name = person.getName();
int age = person.getAge();
return "";
}

2.后端传向前端(Controller->jsp)

在servlet中我们知道,要向jsp传递数据,可以将数据存储在Request域中,再由EL表达式在jsp页面中取出。在SpringMVC中,我们也可以通过这种方式传递数据,但是它提供的方法更为方便。

方法一

在控制方法中传入一个Map对象,将数据封装到一个Map中,SpringMVC在转发页面之前会将数据setAttribute到request中。

@RequestMapping("show.action")
public String showString(Map<String,Object> map){

Person p = new Person();
p.setName("tom");
map.put("person", p);
return "index";

}

方法二

在控制方法中传入一个Model对象,把要传递的参数添加到model中,再进行转发。

@RequestMapping("show.action")
public String showString(Model model){

Person p = new Person();
p.setName("tom");
model.addAttribute("person", p);
return"index";

}
index.jsp

<body>
传过来的数据name:${person.name }
传过来的数据age:${person.age }
</body>

四、转发和重定向

因为我们在servlet-action.xml文件中配置了视图解析器,所以在Controller中,只要我们返回jsp文件的文件名就可以实现跳转,其中重定向可以在url前面添加redirect:,转发可在url前面添加forword:。


@RequestMapping("/insert.action")
public String insert(Person p){
personService.insert(p);
//重定向到listAll.action
return "redirect:/listAll.action";
}
@RequestMapping("/person/insert.action")
public String insert(Person p){
personService.insert(p);
//转发到listAll.action
return "forword:/person/listAll.action";
}