记录学习javaWeb遇到的知识点
(1)命令对象
页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web 中叫命令对象
(2)@ModelAttribute的作用
谢谢大佬:http://hbiao68.iteye.com/blog/1948380
一、绑定请求参数到指定对象
Java代码
public String test1(@ModelAttribute("user") UserModel user)
public String test1(@ModelAttribute(“user”) UserModel user)
只是此处多了一个注解@ModelAttribute(“user”),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。
如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user 中的username、password和workInfo属性的city属性中。
Java代码
@RequestMapping(value="/model2/{username}")
public String test2(@ModelAttribute("model") DataBinderTestModel model)
URI 模板变量也能自动绑定到命令对象中, 当你请求的URL 中包含“bool=yes&schooInfo.specialty=computer&hobbyList[0]=program&hobbyList[1]=music&map[key1]=value1&map[key2]=value2&state=blocked”会自动绑定到命令对象上。当URI模板变量和请求参数同名时,URI模板变量具有高优先权。
通俗点来说,Spring会帮你初始化这个命令对象,然后根据同名属性将URI里的属性一一对应到命令对象。
二、暴露表单引用对象为模型数据
/**
* 设置这个注解之后可以直接在前端页面使用hb这个对象(List)集合
* @return
*/
@ModelAttribute("hb")
public List<String> hobbiesList(){
List<String> hobbise = new LinkedList<String>();
hobbise.add("basketball");
hobbise.add("football");
hobbise.add("tennis");
return hobbise;
}
三、暴露@RequestMapping方法返回值为模型数据
public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user) {
/*函数体*/
return user;
}
大家可以看到返回值类型是命令对象类型,而且通过@ModelAttribute(“user2”)注解,此时会暴露返回值到模型数据( 名字为user2 ) 中供视图展示使用
@ModelAttribute 注解的返回值会覆盖@RequestMapping 注解方法中的@ModelAttribute 注解的同名命令对象
有@ModelAttribute标记的方法,会在每个目标方法执行前被SpringMVC调用
举一个自己在学习过程中看到很形象的例子
@Controller
public class Test{
@ModelAttribute
public void
getUser(@RequestPatam(value="id",required=false)Integer id,Map<Stirng,Object> map){
System.out.println("modelAttribute mothod");
if(id!=null){
User user=new User("Tom",21);
map.put("abc",user);
}
}
@RequestMapping("testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("修改user");
return "index";
}
}
如果我在getUser()中使用map.put(“user”,user);
那么testModelAttribute(User user)就不需要他@ModelAttribute(“abc”)了
结合实际比较好理解
@Controller
public class Test{
@ModelAttribute
public void
getUser(@RequestPatam(value="id",required=false)Integer id,Map<Stirng,Object> map){
System.out.println("modelAttribute mothod");
if(id!=null){
User user=new User("Tom",21);
map.put("user",user);
}
}
@RequestMapping("testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改user");
return "index";
}
}
(3)SpringMVC处理静态资源文件
有两种解决方法:
1.在spring-mvc.xml文件里面添加,这是比较麻烦的,下面只是说引入了静态资源
<mvc:resources location="/WEB-INF/views/mainPage/assets/" mapping="/assets/**"/>
<mvc:resources location="/WEB-INF/views/mainPage/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/views/mainPage/fonts/" mapping="/fonts/**"/>
<mvc:resources location="/WEB-INF/views/mainPage/img/" mapping="/img/**"/>
<mvc:resources location="/WEB-INF/views/mainPage/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/views/mainPage/lib/" mapping="/lib/**"/>
<mvc:resources location="/WEB-INF/views/mainPage/partials/" mapping="/partials/**"/>
2.仅仅加上这一句
<!-- 启动注解 -->
<mvc:default-servlet-handler default-servlet-name="SpringMVC"/>
<mvc:annotation-driven/>
我本地配置成功了,你们可以试试,会不会有什么小问题呢我还没遇到,有问题我再回来改吧,目前是可行的。
(4)SpringMVC请求处理过程
谢谢大佬:这里有个写得很好的博客
http://www.cnblogs.com/dreamworlds/p/5396112.html
1.DispatcherServlet处理过程
- 当DispatcherServlet接到请求时,他先回查找适当的处理程序来处理请求。DispatcherServlet通过一个或者多个处理程序映射,将每个请求映射到处理程序中。处理程序映射配置在web应用程序的上下文中,是实现了HandlerMapping接口的Bean。它负责为请求返回一个适当的处理程序(也就是Controller)。处理程序映射通常根据请求的URL将请求映射到处理程序(Controller)。
- 一旦DispatcherServlet选择了适当的控制器,它就会调用这个控制器来处理请求。
- 控制器处理完请求后,会将模型和视图名(有时候是视图对象)返回给DispatcherServlet。模型包含了控制器要传递给视图进行显示的属性。如果返回的是视图名称,它会被解析成视图对象再进行呈现。绑定模型和视图的基本类是ModelAndView
- 当DispatcherServlet接收到模型和视图名称时,它会将逻辑视图名称解析成视图对象再进行呈现。DispatcherServlet从一个或者多个视图解析器中解析视图。视图解析器配置在Web应用程序上下文中,是实现了ViewResolver接口的Bean。它的任务是根据逻辑视图名称返回试图对象。
- 一旦DispatcherServlet将视图名称解析称为试图对象,它就会呈现视图对象,并传递控制器返回的模型。视图的任务是将模型属性展示给用户。
2.还是不太懂handler—在Spring处理过程看看handler的作用
- 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
3.DispatcherServlet接到请求后如何映射到Controller呢?
在Spring MVC中,Web请求被Web应用程序上下文中声明的一个或者多个处理程序映射Bean(是吸纳了HandlerMapping接口的Bean)映射到Controller。Spring MVC提供了几种HandlerMapping实现:
BeanNameUrlHandlerMapping(默认情况),他根据Controller Bean名称中指定的URL模式将请求映射到处理程序上。
eg. …
当你访问http://**/welcome.htm这个URL时,DispatcherServlet通过BeanNameUrlHandlerMapping映射就找到了WelcomeController。ControllerClassNameHandlerMapping,它是按控制器类名称映射请求。
SimpleUrlHandlerMapping,用定制的映射定义来映射请求。
后面再补充@Controller注解