<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 对象和其• 绑定结果对象或错误对象时成对出现的,它们 之间不允许声明其他的入参
@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是映射到具体方法上
- ParameterMethodNameResol
ver: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>
- PropertiesMethodNameReso
lver
<bean id="resolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<value>/abc/test.do=doTest</value>
</property>
</bean>
- InternalPathMethodNameRe
solver
这个实现类是依据请求的路径来决定执行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);
}