springMVC 笔记
2015-08-16 18:49
549 查看
springmvc工作流程:
1 用户请求 如 /user.xhtml
2 DispatchServlet拦截,web.xml中配置 *.xhtml 被DispatchServlet拦截
3 DispatchServlet 通过handlerMaping检查
该请求匹配的controller
4 执行Controller完毕后,如果返回字符串viewResolver包装成相应对象,如果返回ModelAndView本身含有view视图对象。
5 DispatchServlet将视图对象输出,然后输出给客户端
<!-- 静态资源访问 过滤静态文件-->
<mvc:resourceslocation="/img/"mapping="/img/**"/>
启用注解:
<!-- 注解扫描包 -->
<context:component-scanbase-package="com.tgb.web.controller.annotation"/>
<!-- 开启注解 spring2-->
<beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
<!-- 开启注解
spring3 相当于以上两个注解类-->
<mvc:annotation-driven/>
<mvc:annotation-driven /> 会自动注册
RequestMappingHandlerMapping
RequestMappingHandlerAdapter 与
ExceptionHandlerExceptionResolver 三个bean。
还将提供以下支持:•
支持使用ConversionService 实例对表单参数进行类型转换–
支持使用@NumberFormat
annotation、@DateTimeFormat –注解完成数据类型的格式化
支持使用@Valid 注解对JavaBean 实例进行JSR
303 验证–
支持使用@RequestBody 和@ResponseBody 注解
@Valid 校验
需校验的 Bean 对象和其• 绑定结果对象或错误对象时成对出现的,它们 之间不允许声明其他的入参
(@Valid User user, BindingResult
userBindingResult)
@RequestMapping(value="/user/addUser",method=RequestMethod.POST) //如果写明Post方法,必须提交post方法,如果不写,post或者Get方法都可接收
public ModelAndView
addUser(){
String result
="this is addUser------";
returnnew ModelAndView("/jquery","result",result);
}
//直接返回json对象,一般用于ajax请求,HttpMessageConverter转换
@ResponseBody
@RequestMapping("/testJson")
public Collection<Employee>
testJson(){
return employeeDao.getAll();
}
加入 jackson
jar 包后, RequestMappingHandlerAdapter • 装配的 HttpMessageConverter
//spring的上下文 Service
Resource
WebApplicationContext ac1 = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
//springMVC的上下文(继承Spring上下文)
xxxController yyyController
WebApplicationContext ac2 = RequestContextUtils.getWebApplicationContext(request);
//ISpring springManager = (ISpring) ac1.getBean("springManager");
ISpring springManager = (ISpring)ac2.getBean("springManager");
注解:
@Value
public class VariableConfigurationFilter extends IgnorableFilter {
@Value("${css.base.path}")
//spring annotation 注入资源文件
private String cssBasePath;
}
getFields()只能获取public的字段,包括父类的。
getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
Controller 控制器接收请求Request控制器
直接实现Controller 接口或AbstractController抽象类
ParameterizableViewController:直接转发的controller,无处理逻辑,不需要再实现无任何行为的controller类,登录常用.
<bean id="LoginAction" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="login"></property></bean>
查找过程:LoginAction->ParameterizableViewController->login->/WEB-INF/jsp/login.jsp
UrlFilenameViewController: 请求URL与要找的资源名称一致时,使用更简单的
<bean id="LoginAction" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
查找过程:login.test->LoginAction ->UrlFilenameViewController->解析url,分析出login,再根据规则跳转到login.jsp中
CommandController 封装表单参数的控制器入参数封装command对象,类同 FormController
public class MyAbstractCommandController extends AbstractCommandController {
@Override
protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception{
//将命令对象转换为实际类型
UserModel user = (UserModel) command;
ModelAndView mv = new ModelAndView();
mv.setViewName("abstractCommand");
mv.addObject("user", user);
return mv;
}
}
MultiActionController:用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,methodNameResolver是映射到具体方法上
ParameterMethodNameResolver:paramName值去解析映射到相应方法
<bean id="mutiController" class="com.sunshine.controller.MutiController">
<property name="userService" ref="userService"></property>
<property name="methodNameResolver" ref="paraMethodResolver"></property>
</bean>
<!--multy.do?method=getXxx() 调用相应方法
Controller方法调用规则定义
配置MultiActionController使用的方法对应策略ParameterMehtodNameResolver,
用于解析请求中的特定参数的值,将该值作为方法名调用 -->
<bean id="paraMethodResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="method" />
</bean>
PropertiesMethodNameResolver
<bean id="resolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<value>/abc/test.do=doTest</value>
</property>
</bean>
InternalPathMethodNameResolver
这个实现类是依据请求的路径来决定执行MultiActionController的那个方法的。例如路径为:getlist.htm,则执行相应controller的getlist方法。在实际开发中,不提倡使用这个MethodNameResolver、
<bean id="resolver” class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />
Handler Mapping 根据请求规则映射到指定类或方法上
DefaultAnnotationHandlerMapping:注解常用
SimpleUrlHandlerMapping:key请求url,value为相应XxxController
<!-- 配置处理器映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- prop标签中的key都是url值,后面的为BeanID如果我们在地址栏中输入的url 与key匹配,则分发到prop标签中指定的beanID所指定的Controller -->
<prop key="addEmp.do">addEmpController</prop>
<prop key="saveEmp.do">empController</prop>
</props>
</property>
</bean>
BeanNameUrlHandlerMapping: 这是Dispatcher
Servlet的默认的HandlerMapping,根据name值映射相应XxxController
<bean name="/listCourses.go" class="com.w3cs.vlar.ListCoursesController">
ControllerClassNameHandlerMapping
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="com.mkyong.common.controller.WelcomeController" />
<bean class="com.mkyong.common.controller.HelloGuestController" />
WelcomeController -> /welcome*
HelloGuestController -> /helloguest*
ViewResolver(逻辑策略,根据返回逻辑名称request.foward()对应实际页面)
& View(用于将实际Model和要输出页面数据整合渲染) JstlView、
ViewResolver:要根据给定逻辑视图名字通过指定视图解析器的策略 ,解析器优先级根据Order排序
InternalResourceViewResolver、 FreeMarkerViewResolver、VolocityViewResolver
(都是URLBasedViewResolver子类): 在视图逻辑名前面加上prefix,后面加上suffix
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
//逻辑视图名字解析
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
HttpServletRequest request) throws Exception {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
//也可以自己定义ViewClass,渲染数据
@Component
public class HelloView implements View{
@Override
public String getContentType()
{
return "text/html";
}
@Override
public void render(Map<String,
?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
response.getWriter().print("hello
view, time: " + new Date());
}
}
Ø BeanNameViewResolver:根据返回逻辑视图名称test去寻找相应的View对象
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"/>
</bean>
<bean id="test" class="org.springframework.web.servlet.view.InternalResourceView">
<property name="url" value="/index.jsp"/>
</bean>
ResourceBundleViewResolver:资源文件去映射
//调用方法栈
public void getCaller(){
StackTraceElement stack[] = Thread.currentThread().getStackTrace();
for (StackTraceElement ste:stack){
System.out.println("called by "+ste.getClassName()+"."+ste.getMethodName()+"/"+ste.getFileName());
}
}
<form method='post' action='url'>
用户名 <input type='text' name='u_name'>
用户id <input type='text' name='u_id'>
食品名 <input type='text' name='f_name'>
食品id <input type='text' name='f_id'>
<input type='text' name='gender'>
<input type='text' name='age'>
<input type='text' name='price'>
<input type='text' name='date'>
</form>
@requestMap(value={'/order/book'})
public string show(UserFoodDto
dto){
//然后拆分,将字段
User u = new User();
Food f = new Food();
u.setName(dto.getUname());
f.setName(dto.getname());
u.setUid(dto.getUid());
f.setFid(dto.getFid());
u.setAge(dto.getAge);
f.setPrice(dto.getPrice);
.....
}
--桥接
<form method='post' action='url'>
用户名 <input type='text' name='u_name'>
用户id <input type='text' name='u_id'>
食品名 <input type='text' name='f_name'>
食品id <input type='text' name='f_id'>
<input type='text' name='gender'>
<input type='text' name='age'>
<input type='text' name='price'>
<input type='text' name='date'>
</form>
-----将冲突的字段专门建立一个javaBean
public String UFBridge{
private String uname;
private String uid;
private String fname;
private String fid;
}
--------------------------
@requestMap(value={'/order/book'})
public string show(User u,Food
f,UFBridge ufb){
u.setName(ufb.getUname());
f.setName(ufb.getUname());
u.setId(ufb.getUid);
f.setId(ufb.getFid);
}
1 用户请求 如 /user.xhtml
2 DispatchServlet拦截,web.xml中配置 *.xhtml 被DispatchServlet拦截
3 DispatchServlet 通过handlerMaping检查
该请求匹配的controller
4 执行Controller完毕后,如果返回字符串viewResolver包装成相应对象,如果返回ModelAndView本身含有view视图对象。
5 DispatchServlet将视图对象输出,然后输出给客户端
<!-- 静态资源访问 过滤静态文件-->
<mvc:resourceslocation="/img/"mapping="/img/**"/>
启用注解:
<!-- 注解扫描包 -->
<context:component-scanbase-package="com.tgb.web.controller.annotation"/>
<!-- 开启注解 spring2-->
<beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
<!-- 开启注解
spring3 相当于以上两个注解类-->
<mvc:annotation-driven/>
<mvc:annotation-driven /> 会自动注册
RequestMappingHandlerMapping
RequestMappingHandlerAdapter 与
ExceptionHandlerExceptionResolver 三个bean。
还将提供以下支持:•
支持使用ConversionService 实例对表单参数进行类型转换–
支持使用@NumberFormat
annotation、@DateTimeFormat –注解完成数据类型的格式化
支持使用@Valid 注解对JavaBean 实例进行JSR
303 验证–
支持使用@RequestBody 和@ResponseBody 注解
@Valid 校验
需校验的 Bean 对象和其• 绑定结果对象或错误对象时成对出现的,它们 之间不允许声明其他的入参
(@Valid User user, BindingResult
userBindingResult)
@RequestMapping(value="/user/addUser",method=RequestMethod.POST) //如果写明Post方法,必须提交post方法,如果不写,post或者Get方法都可接收
public ModelAndView
addUser(){
String result
="this is addUser------";
returnnew ModelAndView("/jquery","result",result);
}
//直接返回json对象,一般用于ajax请求,HttpMessageConverter转换
@ResponseBody
@RequestMapping("/testJson")
public Collection<Employee>
testJson(){
return employeeDao.getAll();
}
加入 jackson
jar 包后, RequestMappingHandlerAdapter • 装配的 HttpMessageConverter
//spring的上下文 Service
Resource
WebApplicationContext ac1 = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
//springMVC的上下文(继承Spring上下文)
xxxController yyyController
WebApplicationContext ac2 = RequestContextUtils.getWebApplicationContext(request);
//ISpring springManager = (ISpring) ac1.getBean("springManager");
ISpring springManager = (ISpring)ac2.getBean("springManager");
注解:
@Value
public class VariableConfigurationFilter extends IgnorableFilter {
@Value("${css.base.path}")
//spring annotation 注入资源文件
private String cssBasePath;
}
getFields()只能获取public的字段,包括父类的。
getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
Controller 控制器接收请求Request控制器
直接实现Controller 接口或AbstractController抽象类
ParameterizableViewController:直接转发的controller,无处理逻辑,不需要再实现无任何行为的controller类,登录常用.
<bean id="LoginAction" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="login"></property></bean>
查找过程:LoginAction->ParameterizableViewController->login->/WEB-INF/jsp/login.jsp
UrlFilenameViewController: 请求URL与要找的资源名称一致时,使用更简单的
<bean id="LoginAction" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
查找过程:login.test->LoginAction ->UrlFilenameViewController->解析url,分析出login,再根据规则跳转到login.jsp中
CommandController 封装表单参数的控制器入参数封装command对象,类同 FormController
public class MyAbstractCommandController extends AbstractCommandController {
@Override
protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception{
//将命令对象转换为实际类型
UserModel user = (UserModel) command;
ModelAndView mv = new ModelAndView();
mv.setViewName("abstractCommand");
mv.addObject("user", user);
return mv;
}
}
MultiActionController:用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,methodNameResolver是映射到具体方法上
ParameterMethodNameResolver:paramName值去解析映射到相应方法
<bean id="mutiController" class="com.sunshine.controller.MutiController">
<property name="userService" ref="userService"></property>
<property name="methodNameResolver" ref="paraMethodResolver"></property>
</bean>
<!--multy.do?method=getXxx() 调用相应方法
Controller方法调用规则定义
配置MultiActionController使用的方法对应策略ParameterMehtodNameResolver,
用于解析请求中的特定参数的值,将该值作为方法名调用 -->
<bean id="paraMethodResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="method" />
</bean>
PropertiesMethodNameResolver
<bean id="resolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<value>/abc/test.do=doTest</value>
</property>
</bean>
InternalPathMethodNameResolver
这个实现类是依据请求的路径来决定执行MultiActionController的那个方法的。例如路径为:getlist.htm,则执行相应controller的getlist方法。在实际开发中,不提倡使用这个MethodNameResolver、
<bean id="resolver” class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />
Handler Mapping 根据请求规则映射到指定类或方法上
DefaultAnnotationHandlerMapping:注解常用
SimpleUrlHandlerMapping:key请求url,value为相应XxxController
<!-- 配置处理器映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- prop标签中的key都是url值,后面的为BeanID如果我们在地址栏中输入的url 与key匹配,则分发到prop标签中指定的beanID所指定的Controller -->
<prop key="addEmp.do">addEmpController</prop>
<prop key="saveEmp.do">empController</prop>
</props>
</property>
</bean>
BeanNameUrlHandlerMapping: 这是Dispatcher
Servlet的默认的HandlerMapping,根据name值映射相应XxxController
<bean name="/listCourses.go" class="com.w3cs.vlar.ListCoursesController">
ControllerClassNameHandlerMapping
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="com.mkyong.common.controller.WelcomeController" />
<bean class="com.mkyong.common.controller.HelloGuestController" />
WelcomeController -> /welcome*
HelloGuestController -> /helloguest*
ViewResolver(逻辑策略,根据返回逻辑名称request.foward()对应实际页面)
& View(用于将实际Model和要输出页面数据整合渲染) JstlView、
ViewResolver:要根据给定逻辑视图名字通过指定视图解析器的策略 ,解析器优先级根据Order排序
InternalResourceViewResolver、 FreeMarkerViewResolver、VolocityViewResolver
(都是URLBasedViewResolver子类): 在视图逻辑名前面加上prefix,后面加上suffix
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
//逻辑视图名字解析
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
HttpServletRequest request) throws Exception {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
//也可以自己定义ViewClass,渲染数据
@Component
public class HelloView implements View{
@Override
public String getContentType()
{
return "text/html";
}
@Override
public void render(Map<String,
?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
response.getWriter().print("hello
view, time: " + new Date());
}
}
Ø BeanNameViewResolver:根据返回逻辑视图名称test去寻找相应的View对象
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"/>
</bean>
<bean id="test" class="org.springframework.web.servlet.view.InternalResourceView">
<property name="url" value="/index.jsp"/>
</bean>
ResourceBundleViewResolver:资源文件去映射
//调用方法栈
public void getCaller(){
StackTraceElement stack[] = Thread.currentThread().getStackTrace();
for (StackTraceElement ste:stack){
System.out.println("called by "+ste.getClassName()+"."+ste.getMethodName()+"/"+ste.getFileName());
}
}
<form method='post' action='url'>
用户名 <input type='text' name='u_name'>
用户id <input type='text' name='u_id'>
食品名 <input type='text' name='f_name'>
食品id <input type='text' name='f_id'>
<input type='text' name='gender'>
<input type='text' name='age'>
<input type='text' name='price'>
<input type='text' name='date'>
</form>
@requestMap(value={'/order/book'})
public string show(UserFoodDto
dto){
//然后拆分,将字段
User u = new User();
Food f = new Food();
u.setName(dto.getUname());
f.setName(dto.getname());
u.setUid(dto.getUid());
f.setFid(dto.getFid());
u.setAge(dto.getAge);
f.setPrice(dto.getPrice);
.....
}
--桥接
<form method='post' action='url'>
用户名 <input type='text' name='u_name'>
用户id <input type='text' name='u_id'>
食品名 <input type='text' name='f_name'>
食品id <input type='text' name='f_id'>
<input type='text' name='gender'>
<input type='text' name='age'>
<input type='text' name='price'>
<input type='text' name='date'>
</form>
-----将冲突的字段专门建立一个javaBean
public String UFBridge{
private String uname;
private String uid;
private String fname;
private String fid;
}
--------------------------
@requestMap(value={'/order/book'})
public string show(User u,Food
f,UFBridge ufb){
u.setName(ufb.getUname());
f.setName(ufb.getUname());
u.setId(ufb.getUid);
f.setId(ufb.getFid);
}
相关文章推荐
- (3)java棧
- Struts2中validator校验器不起作用的情况
- java 实现线程的其中两种方法总结
- Java设计模式偷跑系列(六)Singleton模式的建模与实现
- springmvc的jar包下载地址
- java 截取字符串
- Java NIO使用及原理分析 (一)
- Java学习之多态
- java比较器Comparator 使用
- Java中泛型的基础到提高《精简》
- Mac 下安装配置jdk
- java中的动态代理
- Java NIO系列教程(八) SocketChannel
- Java中的自动装箱与拆箱
- Java学习之路0804<复习>(线程、注解)
- Myeclipse 经常loading descriptor for XXX ,然后卡死
- [leetcode-139]Word Break(java)
- (2)java堆内存
- Eclipse - JDK内存配置- 环境配置
- Java流式IO