Spring 注解学习手札二 控制层梳理Word格式.docx
- 文档编号:17633461
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:15
- 大小:24.16KB
Spring 注解学习手札二 控制层梳理Word格式.docx
《Spring 注解学习手札二 控制层梳理Word格式.docx》由会员分享,可在线阅读,更多相关《Spring 注解学习手札二 控制层梳理Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
org.springframework.beans.factory.annotation.Autowired;
10.import
org.springframework.stereotype.Controller;
11.import
org.springframework.web.bind.ServletRequestUtils;
12.import
org.springframework.web.bind.annotation.RequestMapping;
13.import
org.springframework.web.bind.annotation.RequestMethod;
14.import
org.zlex.spring.service.AccountService;
15.
16./**
17.
18.
@author
<
a
href="
mailto:
zlex.dongliang@"
>
梁栋<
/a>
19.
@version
1.0
20.
@since
21.
22.@Controller
23.@RequestMapping("
/account.do"
)
24.public
class
AccountController
{
25.
26.
@Autowired
27.
private
AccountService
accountService;
28.
29.
@RequestMapping(method
=
RequestMethod.GET)
30.
public
void
hello(HttpServletRequest
request,
HttpServletResponse
response)
31.
throws
Exception
32.
33.
String
username
ServletRequestUtils.getRequiredStringParameter(
34.
"
username"
);
35.
password
36.
password"
37.
System.out.println(accountService.verify(username,
password));
38.
}
39.}
先说注解@RequestMapping
这里使用注解@RequestMapping(method=RequestMethod.GET)指定这个方法为get请求时调用。
同样,我们可以使用注解@RequestMapping(method=RequestMethod.POST)指定该方法接受post请求。
1.@Controller
2.@RequestMapping("
3.public
4.
6.
get()
7.
9.
RequestMethod.POST)
10.
post()
11.
12.}
这与我们久别的Servlet很相像,类似于doGet()和doPost()方法!
我们也可以将其改造为多动作控制器,如下代码所示:
@RequestMapping(params
method=login"
login()
method=logout"
logout()
这样,我们可以通过参数“method”指定不同的参数值从而通过请求("
/account.do?
和"
)调用不同的方法!
注意:
使用多动作控制器必须在配置文件中加入注解支持!
Xml代码
1.<
bean
class="
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
/>
当然,我们也可以将注解@RequestMapping指定到某一个方法上,如:
2.public
@RequestMapping("
/a.do"
a()
{}
/b.do"
b()
9.}
这样,请求“a.do”和“b.do”将对应不同的方法a()和b()。
这使得一个控制器可以同时承载多个请求!
)是@RequestMapping(value="
)的简写!
再说输入参数!
这里的方法名可以随意定义,但是参数和返回值却又要求!
为什么?
直接看源代码,我们就能找到答案!
AnnotationMethodHandlerAdapter.java部分源代码——有关参数部分:
1.@Override
2.protected
Object
resolveStandardArgument(Class
parameterType,
NativeWebRequest
webRequest)
HttpServletRequest
request
(HttpServletRequest)
webRequest.getNativeRequest();
response
(HttpServletResponse)
webRequest.getNativeResponse();
if
(ServletRequest.class.isAssignableFrom(parameterType))
return
request;
else
(ServletResponse.class.isAssignableFrom(parameterType))
12.
this.responseArgumentUsed
true;
13.
response;
14.
(HttpSession.class.isAssignableFrom(parameterType))
16.
request.getSession();
(Principal.class.isAssignableFrom(parameterType))
request.getUserPrincipal();
(Locale.class.equals(parameterType))
22.
RequestContextUtils.getLocale(request);
23.
24.
(InputStream.class.isAssignableFrom(parameterType))
request.getInputStream();
(Reader.class.isAssignableFrom(parameterType))
request.getReader();
(OutputStream.class.isAssignableFrom(parameterType))
response.getOutputStream();
(Writer.class.isAssignableFrom(parameterType))
response.getWriter();
super.resolveStandardArgument(parameterType,
webRequest);
也就是说,如果我们想要在自定义的方法中获得一些个“标准”输入参数,参数类型必须包含在以下类型中:
ServletRequest
ServletResponse
HttpSession
Principal
Locale
InputStream
OutputStream
Reader
Writer
当然,上述接口其实都是对于HttpServletRequest和HttpServletResponse的扩展。
此外,我们还可以定义自己的参数。
自定义参数必须是实现类,绝非接口!
Spring容器将帮你完成对象初始化工作!
比如说上文中,我们需要参数username和password。
我们可以这么写:
1.@RequestMapping(method
hello(String
username,String
password)
4.}
如果参数名不能与这里的变量名保持一致,那么我们可以使用注解@RequestParam进行强制绑定,代码如下所示:
hello(@RequestParam("
u,
@RequestParam("
p)
System.out.println(accountService.verify(u,
p));
5.}
这比起我们之前写的代码有所简洁:
10.}
ServletRequestUtils类的工作已经由Spring底层实现了,我们只需要把参数名定义一致即可,其内部取参无需关心!
除了传入参数,我们还可以定义即将传出的参数,如加入ModelMap参数:
1.@SuppressWarnings("
unchecked"
2.@RequestMapping(method
Map
username,
password,
ModelMap
model)
model.put("
msg"
username);
model;
这时,我们没有定义页面名称,Spring容器将根据请求名指定同名view,即如果是jap页面,则account.do->
account.jsp!
不得不承认,这样写起来的确减少了代码量!
接着说输出参数!
通过ModelMap,我们可以绑定输出到的页面的参数,但最终我们将要返回到何种页面呢?
再次查看AnnotationMethodHandlerAdapter源代码!
AnnotationMethodHandlerAdapter.java部分源代码——有关返回值部分:
ModelAndView
getModelAndView(Method
handlerMethod,
Class
handlerType,
returnValue,
ExtendedModelMap
implicitModel,
ServletWebRequest
(returnValue
instanceof
ModelAndView)
mav
(ModelAndView)
returnValue;
mav.getModelMap().mergeAttributes(implicitModel);
mav;
Model)
new
ModelAndView().addAllObjects(implicitModel).addAllObjects(((Model)
returnValue).asMap());
Map)
ModelAndView().addAllObjects(implicitModel).addAllObjects((Map)
returnValue);
View)
ModelAndView((View)
returnValue).addAllObjects(implicitModel);
String)
ModelAndView((String)
==
null)
//
Either
returned
null
or
was
'
void'
return.
(this.responseArgumentUsed
||
webRequest.isNotModified())
null;
Assuming
view
name
translation...
ModelAndView().addAllObjects(implicitModel);
(!
BeanUtils.isSimpleProperty(returnValue.getClass()))
Assume
single
model
attribute...
ModelAttribute
attr
AnnotationUtils.findAnnotation(handlerMethod,
ModelAttribute.class);
attrName
(attr
!
?
attr.value()
:
("
.equals(attrName))
resolvedType
GenericTypeResolver.resolveReturnType(handlerMethod,
handlerType);
39.
Conventions.getVariableNameForReturnType(handlerMethod,
resolvedType,
40.
41.
mav.addObject(attrName,
42.
43.
44.
throw
IllegalArgumentException("
Invalid
handler
method
value:
+
45.
46.}
返回值的定义十分庞大,或者说可怕的if-else多少有点让我觉得厌恶!
我们可以定义以下类型的返回值:
Model
View
ModelAndView、Model和View都是Spring之前版本所特有的元素,Map对应于传入参数ModelMap,String定义页面名称,null即对应void类型方法!
最常用的实现方式如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring 注解学习手札二 控制层梳理 注解 学习 手札 控制 梳理