常用注解元素
@Controller
标注在Bean的类定义处
@RequestMapping
真正让Bean具备
Spring MVC Controller
功能的是
@RequestMapping
这个注解
@RequestMapping
可以标注在类定义处,将
Controller
和特定请求关联起来;
还可以标注在方法签名处,以便进一步对请求进行分流
配套的属性有:
value
需要跳转的地址
method
基于RestFul的跳转参数,有RequestMethod.get
post put delete等
params
符合某个参数的时候才调用该方法
Headers
符合头信息的时候才调用
@SessionAttributes
将结果放入session内
@ModelAttribute
存储在响应内容ModelMap或者ModelAndView进行保存值传到前台,当如果你需要保存值比较少
的时候可以采用这种方式进行保存值并且保存到前台显示
在默认情况下,ModelMap
中的属性作用域是
request
级别,相当于HttpServletRequest中的request.setAttribute()
一样,
在
JSP
视图页面中通过
request.getAttribute(“attribute name”)
或者通过
${ attribute name } EL
表达式访问模型对象中的
属性对象
如果希望在ModelMap 的作用域范围为 session,可以有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现 如:
@Controller
@RequestMapping("/login.do")
@SessionAttributes("currUser")
public class BbtForumController {。。。。。}
@ResponseBody
标注后
返回String对象的结果为response内容体,不标注的话
作为dispatcher url使用
@PathVariable
允许将请求路径的制定内容当做求情的参数使用
返回类型
请求处理方法入参的可选类型
说明
void
此时逻辑视图名由请求处理方法对应的
URL
确定,如以下的方法:
@RequestMapping("/welcome.do")
public void welcomeHandler() {
}
对应的逻辑视图名为“welcome”
String
此时逻辑视图名为返回的字符,如以下的方法:
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("ownerId") int ownerId, ModelMap model) {
Owner owner = this.clinic.loadOwner(ownerId);
model.addAttribute(owner);
return "ownerForm";
}
对应的逻辑视图名为“ownerForm”
ModelMap
和返回类型为
void
一样,逻辑视图名取决于对应请求的
URL,
如下面的例子:
@RequestMapping("/vets.do")
public ModelMap vetsHandler() {
return new ModelMap(this.clinic.getVets());
}
对应的逻辑视图名为“vets”,返回的
ModelMap
将被作为请求对应的模型对象,
可以在
JSP
视图页面中访问到。
ModelAndView
返回方式
1
使用无返回方法跳转,如果使用返回方法进行跳转的话,则会通过视图解析器进行以
prefix(前缀)+方法名+suffix(后缀)组成的页面文件名称.
2
使用一个返回的字符串方法作为跳转,使用字符串跳转的话好处就是在return的时候可
以自己指定返回的名字,JSP组成是prefix(前缀)+返回的字符串+suffix(后缀)
3
返回一个ModelAndView类型,使用setViewName方法则可以跳转到指定的页面.
路径匹配形式
1、单一Controller
对应
单一的请求路径
2、单一Controller
对应多个请求路径
3、单一Controller
对应多个请求路径,且路径内可以含有参数的形式
Demo code and UseCase
@Controller
@RequestMapping("/login.do")
public
class
SinglePathWithController
{}
@Controller
@SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"})
public
class
AdapterMultiPathController
{}
@Controller
@RequestMapping(value =
"/rest")
public
class
RestWithController
{}
无返回
//无返回值
无参数返回的是根据
prefix前缀+@RequestMapping value +suffix
后缀组成
@RequestMapping("/springmvc/common")
public
voidnovoid(HttpServletRequest request) {
request.setAttribute("message",
"novoid方法被调用");
}
返回字符串
1、
作为视图路径方式
//根据路径直接匹配
@RequestMapping("/springmvc/multiReqPath1.do")
public
String
multiReqPath1(HttpServletRequest request){
request.setAttribute("message",
"multiReqPath1方法被调用");
return
"springmvc/common";
}
@RequestMapping("/springmvc/multiReqPath2.do")
public
String
multiReqPath2(HttpServletRequest request){
request.setAttribute("message",
"multiReqPath2方法被调用");
return
"/springmvc/common";
}
//根据参数匹配
@RequestMapping(params
=
"m=method1",method = RequestMethod.GET)
public
String
method1(){
return
"login/success";
}
//有参数
参数名和请求url内的变量名一致
@RequestMapping(params
=
"m=method2")
public
String
method2(String
name,String
pwd){
return
name;
}
//有参数
参数名和请求url内的变量名不一致
@RequestMapping(params
=
"m=method3",method = RequestMethod.GET)
public
String
method3(@RequestParam("loginName")String
name,@RequestParam("loginPwd")String
pwd,HttpServletRequest request){
request.setAttribute("message",(name
+
" "
+ pwd));
return
"login/"+name;
}
2、
作为Response内容方式
//无参数
@ResponseBody
@RequestMapping(params
=
"m=method4")
public
String
method4(){
return
"hello,guys";
}
//处理方法入参如何绑定
URL 参数
@ResponseBody
@RequestMapping(params
=
"m=method5",method = RequestMethod.GET)
public
String
method5(String
name,String
pwd,int
delay){
return
"name:"+name+","+"pwd:"+pwd+","+"delay:"+delay;
}
@ResponseBody
@RequestMapping(params
=
"m=method6",method = RequestMethod.GET)
public
String
method6(@RequestParam("userName")String
name,DnTest
test){
return
"DnTest:"+test.toString();
}
URL
参数: userName参数将绑定到name上
其他与DnTest类内属性名称一致的参数将绑定到test的对应的属性上,如果参数不全
也不会报错
返回ModelAndView
@RequestMapping("/springmvc/modelAndView")
public
ModelAndView
modelAndView(){
ModelAndView
mav = new
ModelAndView();
mav.setViewName("/springmvc/common");
mav.addObject("message",
"modelAndView 方法被调用");
return
mav;
}
返回ModelMap
@RequestMapping("/springmvc/modelMap")
public
ModelMap
modelMap(ModelMap
modMap){
List<String>
names = new
ArrayList<String>();
names.add("Rick");
names.add("Austin");
modMap.put("names",
names);
modMap.put("message",
"hello guys");
modMap.put("comment",
"hello guys");
return
modMap;
}
返回ModelMap
@RequestMapping("/springmvc/modelMap")
public
ModelMap
modelAndView(ModelMap
modMap){
List<String>
names = new
ArrayList<String>();
names.add("Rick");
names.add("Austin");
modMap.put("hello",
"hello guys");
modMap.put("names",
names);
return
modMap;
}
@SessionAttribute & ModMap
//注解方式
@Controller
@SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"})
public
class
AdapterMultiPathController
{}
//方法体
@RequestMapping("/springmvc/modelMap2")
public
ModelMap
modelMapWithSession(ModelMap
modMap,HttpServletRequest request){
List<String>
names = new
ArrayList<String>();
names.add("Rick");
names.add("Austin");
modMap.put("names",names);
modMap.put("message",
"hello guys");
modMap.put("comment",
"hello guys");
UserBean
user = new
UserBean();
user.setName("Rick");
user.setMobile("18938900256");
user.setTelephone(request.getParameter("userPhone"));
user.setNumber(request.getParameter("userNumber"));
modMap.put("currentUser",
user);
return
modMap;
}
//初次请求
spring mvc & reverse ajax
@ResponseBody
@RequestMapping(params
=
"m=method7",method = RequestMethod.GET)
public
String
method7(String
name,String
pwd,int
delay,HttpServletRequest req){
req.startAsync();
Date
startTime = new
Date();
try
{
Thread.currentThread().sleep(delay);
}
catch
(InterruptedException
e) {
e.printStackTrace();
}
Date
entTime = new
Date();
return
"name:"+name+","+"pwd:"+pwd+","+"delay:"+delay+",startTime:"+
DateUtils.formatDate(startTime,
"yyyy-MM-dd HH:mm:ss:SSS")+",endTime:"+
DateUtils.formatDate(entTime,
"yyyy-MM-dd HH:mm:ss:SSS");
}
RestFull
@Controller
@RequestMapping(value =
"/rest")
public
class
RestWithController
{}
@ResponseBody
@RequestMapping(value
=
"/{msg}", method = RequestMethod.GET)
public
String
restString(@PathVariable
String
msg) {
return
msg;
}
@ResponseBody
@RequestMapping(value
=
"/{path}/{value}", method = RequestMethod.GET)
public
String
restXml(@PathVariable
String
path,@PathVariable
String
value) {
return
"path:"+path+",value:"+value;
}
@ResponseBody
@RequestMapping(value
=
"/xml/{filename}", method = RequestMethod.GET)
public
String
restFile(@PathVariable
String
filename) {
if
(filename!=null) {
ProjectInits
init =
ProjectInits.getInstance();
String
dir = init.get("resource.dir",
"C:/Projects/VoyagerWeb/resources");
FileUtility
fUtil = new
FileUtility();
String
content = fUtil.readFile(dir+"/"+filename+".xml");
return
content;
}
else
return
"Invalid xml file name ["+filename+"]";
}
验证 是否支持Overload
方式一
//验证
是否支持Overload
@ResponseBody
@RequestMapping(value
=
"/validate/overload1", method = RequestMethod.GET)
public
String
overloadMethod(String
name){
return
name;
}
@ResponseBody
@RequestMapping(value
=
"/validate/overload2", method = RequestMethod.GET)
public
String
overloadMethod(String
name,DnTest
test){
return
"DnTest:"+test.toString();
}
方式二
/验证
是否支持Overload
@ResponseBody
@RequestMapping(params
=
"m=method11")
public
String
method11(String
name){
return
name;
}
@ResponseBody
@RequestMapping(params
=
"m=method11")
public
String
method11(int
age,DnTest
test){
return
"DnTest:"+test.toString();
}
SpringMVC常用基础知识,布布扣,bubuko.com
SpringMVC常用基础知识