javaWeb(1)-SpringMVC

记录学习javaWeb遇到的知识点

(1)命令对象

页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web 中叫命令对象

(2)@ModelAttribute的作用

谢谢大佬:http://hbiao68.iteye.com/blog/1948380

一、绑定请求参数到指定对象

Java代码

public String test1(@ModelAttribute("user") UserModel user)  
  1. 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处理过程
  1. 当DispatcherServlet接到请求时,他先回查找适当的处理程序来处理请求。DispatcherServlet通过一个或者多个处理程序映射,将每个请求映射到处理程序中。处理程序映射配置在web应用程序的上下文中,是实现了HandlerMapping接口的Bean。它负责为请求返回一个适当的处理程序(也就是Controller)。处理程序映射通常根据请求的URL将请求映射到处理程序(Controller)。
  2. 一旦DispatcherServlet选择了适当的控制器,它就会调用这个控制器来处理请求。
  3. 控制器处理完请求后,会将模型和视图名(有时候是视图对象)返回给DispatcherServlet。模型包含了控制器要传递给视图进行显示的属性。如果返回的是视图名称,它会被解析成视图对象再进行呈现。绑定模型和视图的基本类是ModelAndView
  4. 当DispatcherServlet接收到模型和视图名称时,它会将逻辑视图名称解析成视图对象再进行呈现。DispatcherServlet从一个或者多个视图解析器中解析视图。视图解析器配置在Web应用程序上下文中,是实现了ViewResolver接口的Bean。它的任务是根据逻辑视图名称返回试图对象。
  5. 一旦DispatcherServlet将视图名称解析称为试图对象,它就会呈现视图对象,并传递控制器返回的模型。视图的任务是将模型属性展示给用户。
2.还是不太懂handler—在Spring处理过程看看handler的作用
  1. 用户向服务器发送请求,请求被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实现:

  1. BeanNameUrlHandlerMapping(默认情况),他根据Controller Bean名称中指定的URL模式将请求映射到处理程序上。
    eg. …
    当你访问http://**/welcome.htm这个URL时,DispatcherServlet通过BeanNameUrlHandlerMapping映射就找到了WelcomeController。

  2. ControllerClassNameHandlerMapping,它是按控制器类名称映射请求。

  3. SimpleUrlHandlerMapping,用定制的映射定义来映射请求。

    后面再补充@Controller注解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值