Spring MVC入门学习

Spring MVC入门学习
    因为做 webgame gm 服务器,整体采用的是 spring mvc 架构,所以简单入门学习一下:

1.spring mvc基本流程
     从URL接受请求及数据->DispacherServlet->根据请求调用具体的Controller->Controller->调用service方法处理数据->通过DAO访问
 db->增删改查->db->返回操作结果集->service->处理返回结果->Controller->返回具体页面和数据->jsp页面
2.spring mvc注解
 @Controller,@Service,@Repository
     @Controllers声明控制层。@Service声明服务层。@Repository声明持久层(数据传输层DAO)
     @RequestMapping把一个POJO声明为Spring里的Controller.如果不声明要写Controller类就要从Spring的Controller类继承,并重写handleRequest方法。
     @RequestMapping(value="*.htm",method=RequestMethod.GET);属性value声明Controller处理的请求,method声明处理请求的类型。可声明在类头上,也可声明在方法头上。
     @RequestParam绑定参数与请求参数;例:public String Controller(@RequestParam("id") int topicId,User user)把参数 topicld与请求的参数“id”绑定,id的值传入topicld。
     @AutoWired根据类型自动装配,可放在属性上,set方法上,构造方法上。与@AutoWierd配套使用的是@Qualifier。按名字自动装配。
     @Resource与@AutoWired类似
3.DispatcherServlet-org.springframework.web.servlet.Dispatc-herServlet
 负责将请求分配给控制对象,所以使用Spring MVC的第一步是在web.xml中定义DispatcherServlet;

 1 < servlet >
 2         < servlet-name > hello </ servlet-name >
 3         < servlet-class >
 4     org.springframework.web.servlet.DispatcherServlet
 5    </ servlet-class >
 6    < init-param >
 7       < param-name > contextConfigLocation </ param-name >
 8                  < param-value >
 9     /WEB-INF/mvc-config.xml,
10     /WEB-INF/spring-config.xml
11    < param-value >
12                  < init-param >
13          </ servlet >
14


          .....
  可以加上contextConfigLocation的初始参数,用来设置Bean定义文件的位置和名称,默认使用“Servlet名-servlet.xml";可以加上多个bean文件的来源;如果一个都没加则找默认的;hello-servlet.xml

  spring-servlet.xml-

1 < context:component-scan  base-package ="cn.spring.demo"   />
2   < bean
3   class ="org.springframework.web.servlet.view.InternalResourceView-Resolver"
4  p:prefix =""  p:suffix =".jsp"   />


  base-package为注入bean时要spring要查找的包;
  Controller回传ModleAndView,DispatcherServlet会交给ViewResolver解析。如:回传一个字符串“index”,解析后找到/WEB-INF/index.jsp
4.Controller-

 1 @Controller // 将类声明为Spring容器里的Bean,Spring调用时实例化
 2     @RequestMapping( " index.htm " ) // 声明这个Controller处理的请求是什么
 3      public   class  IndexController 
 4      {
 5     @RequestMapping(method = RequestMethod.GET)
 6     public String doGet() 
 7     {
 8      return "index";
 9     }

10    }


返回“index”,交由ViewResolver解析,返回调用“/WEB-INF/index.jsp”

    

1 // 处理post请求的Controller
2     @Controller
3     @RequestMapping(value = " index.htm " ,method  =  RequestMethod.POST)
4      public  String doPost(String username, String password, ModelMap modelMap)  throws  Exception 
5      {
6     modelMap.addAttribute("name",username);
7     return "index";
8    }


把username以名值对的形式放入ModelMap,在index.jsp中用request对象接收;ModleMap,Spring提供的集合可以传递数据到返回的jsp页面
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/

 以上为基于注解驱动的mvc

5.DispacherServlet-HandlerMapping-ModleAndView-Controller-ViewResolver-View
 1.web.xml指定DispacherServelet和servlet的xml
  web.xml-

 1   < servlet >
 2      < servlet-name > buzzwords </ servlet-name >
 3      < servlet-class >
 4        org.springframework.web.servlet.DispatcherServlet
 5      </ servlet-class >
 6     < load-on-startup > 1 </ load-on-startup >
 7     </ servlet >
 8     
 9    < context-param >
10     < param-name > contextConfigLocation </ param-name >
11     < param-value > /WEB-INF/buzzwords-service.xml </ param-value >
12     </ context-param >  
13


     <load-on-startup>标记容器是否在启动的时候就加载这个servlet,数字越小,当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载;正数的值越小,启动该servlet的优先级越高
 2.BuzzwordsController-不用@Controllers则需要实现Controller接口

 1 public   class  BuzzwordsController  implements  Controller
 2    {
 3   private BuzzwordService facade;    
 4   public void setFacade(BuzzwordService facade) 
 5   {        
 6     this.facade = facade;
 7   }
    
 8   public ModelAndView handleRequest(HttpServletRequest request,  HttpServletResponse response) throws Exception
 9   {        
10    return new ModelAndView("buzzwords""buzzwordService", facade);    
11   }

12  }

13


   3.buzzwords-servlet.xml-指定servlet controller和urlmapping的映射关系

 1 < bean  id ="buzzwordsController“ 
 2    class=" BuzzwordsController" >
 3      < property  name ="facade" >< ref  bean ="buzzwordService" /></ property >
 4    </ bean >
 5
 6    < bean  id ="urlMapping"  class ="SimpleUrlHandlerMapping" >
 7     < property  name ="mappings" >
 8      < props >
 9      < prop  key ="/buzzwords.htm" >
10      buzzwordsController
11      </ prop >
12
13


   4.指定viewResolver

1   < bean  id ="viewResolver"  class ="org.springframework InternalResourceViewResolver" >
2      < property  name ="viewClass" >
3     < value > org.springframework  View </ value >
4     </ property >
5      < property  name ="prefix" >< value > /WEB-INF/jsp/ </ value ></ property >
6       < property  name ="suffix" >< value > .jsp </ value ></ property >
7    </ bean >


 5.buzzwords.jsp
6.参考 \spring mvc\Spring MVC 详解.ppt
  \spring mvc\Spring MVC 技术交流.ppt
     1. DispatchServlet在Web容器初始化的时候完成初始化——initStrategy() 
     2.ViewResolver-从一个String逻辑视图名映射到一个视图对象;对JSP用户, 通常实现 InternalResourceViewResolver
     3.Controller负责接收从DispatchServlet转发的URL请求

     开发一个Spring MVC程序的基本步骤:
     1编写处理请求逻辑的处理器-controller;
     2在DispatcherServlet上下文对应的Spring配置文件中配置处理器;
     3配置一个视图解析器,对处理器返回的ModelAndView进行解析;
     4编写一个视图对象(jsp或ftl等),将响应展现给客户

 Controller
     -AbstractController
          -MultiActionController 将多个请求行为合并在一个控制器里
          -BaseCommandController
                -AbstractCommandController 能将请求参数绑定到命令对象
                -AbstractFormController 支持表单提交的抽象控制器类
                       -SimpleFormController 简单表单处理控制器
                       -AbstractWizardFormController 向导型表单处理控制器

     ViewResolver接口:Controller传回ModelAndView对象,DispatcherServlet将其交由ViewResolver来作View层的相关解析。要在Spring MVC配置文件中定义一个ViewResolver实例

     ModelAndView-Mode1AndView 类代表了 Spring Web MVC 程序中,呈现画面时所使用 Model 数据对象与 View 数据对象,由于 Java  程序的方法中一次只能回传一个对象,所以 Modelview 的作用是封装这两个对象,方便您同时返回 Model 与 View SimpleUrlHandlerMapping-最常用的处理器映射,将请求的URLs 影射到handlers;由一系列的分别代表URLs 和bean 的名字的name/value 对来定义影射;在x-servlet.xml中定义

7. 参考\spring mvc\Spring_Web_MVC_架构.ppt
 1.web.xml:

 1   < servlet >
 2    < servlet-name > dispatcherServlet </ servlet-name >
 3    < servlet-class >
 4       org.springframework.web.servlet.DispatcherServlet
 5    </ servlet-class >
 6    < init-param >
 7        < param-name > contextConfigLocation </ param-name >
 8        < param-value > /WEB-INF/mvc-config.xml </ param-value >
 9    </ init-param >         
10    < load-on-startup > 1 </ load-on-startup >
11       </ servlet >
12
13       < servlet-mapping >
14    < servlet-name > dispatcherServlet </ servlet-name >
15    < url-pattern > *.do </ url-pattern >
16       </ servlet-mapping >
17

 

     可以在 XML 文件中设定 Controller 请求处理完毕之后,所要呈现数据的网页路径,见mvc -config . xml

    2.controller:
  

 1 public   class  HelloController  implements  Controller
 2    {
 3     private String viewPage;    
 4     public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res)  throws Exception 
 5     {
 6  String user = req.getParameter("user");
 7  //viewPage与mvc-config.xml中的<property name="viewPage">对应,<value>对应返回的jsp页面
 8  return new ModelAndView(viewPage, "user", user);
 9     }
    
10     public void setViewPage(String viewPage) 
11     {
12  this.viewPage = viewPage;
13     }

14 }


   3.mvc-config.xml:

 1 < beans >    
 2       < bean  id ="viewResolver"
 3     class ="org.springframework.web.servlet.view.InternalResourceViewResolver" >  
 4    < property  name ="prefix" >
 5        < value > /WEB-INF/jsp/ </ value >
 6    </ property >
 7    < property  name ="suffix" >
 8        < value > .jsp </ value >
 9    </ property >
10       </ bean >
11      
12       < bean  name ="/hello.do"  
13     class ="onlyfun.caterpillar.HelloController" >  
14    < property  name ="viewPage" >  
15        < value > hello </ value >  
16    </ property >  
17       </ bean >
18   </ beans >
19


        DisPatcherServlet 必须根据一个 HandlerMaPping 对象,决定请求由哪一个 Controller 来处理, DispatcherServlet 默认使用 org.spring-
 framwork .web.servlet.handler . BeanNameUrlHandlerMapping ,也就是根据 Bean 在定义时的”name”属性及使用者请求的 URL ,决定使 用哪一个 controller 实例,例如在这个例子中,请求 / FirstSpringMVC / hello.do 时, DispatcherServlet 根据” hello.do ”名称,决定要 使用 “name”为”hello.do”的 Bean 实例,所以就是将请求交由 HelloController 的实例来处理。

     在 controller 返回 ModelAndView 后, Dispatcherservlet 会交由 ViewResolver 对象来作 View 层的相关解析,因而您需要设置一个 ViewResolver 实例,在这个范例中将以 JSP 作为 View 层技术-InternalResourceViewResolver如果想要在自己所定义的 servlet 类中使用 spring 的容器功能,则也可以使用org·springframework·web·context·ContextLoaderListener contextLoaderListener 默认会读取 applicationContext.xml,您可以指定自己的定义文件,只要在
<context-param>中指定”contextConfigLocation”参数;

 WebApplicationContext 实现了 ApplicationContext 接口,是 Spring 专为 Servlet 的 Web 应用程序设计的ApplicationContext 实现类,在取得 WebApplicationContext 之后,可以利用它来取得 Bean 定义文件中定义的 Bean 实例;
     即web.xml中-

 1 < context-param >
 2      < param-name > contextConfigLocation </ param-name >
 3      < param-value > /WEB-INF/beans-config.xml </ param-value >
 4     </ context-param >       
 5      < listener >
 6      < listener-class >
 7      org.springframework.web.context.ContextLoaderListener
 8     </ listener-class >
 9     </ listener >
10   beans-config.xml-
11     <? xml version="1.0" encoding="UTF-8" ?>
12     <! DOCTYPE beans PUBLIC 
13     "-//SPRING/DTD BEAN/EN" 
14     "http://www.springframework.org/dtd/spring-beans.dtd" >  
15
16     < beans >    
17       < bean  id ="dateBean"  class ="java.util.Date"  singleton ="false" />
18     </ beans >
19
20


        4.MultiActionController -如果为每一个请求编写一个 Controller 类,在程序规模增大时,您的 Controller 类将会迅速增加,可以继承 或直接使用MultiActionController类,将数个相关的请求处理集中于同一个对象,而不用每一个请求编写一个控制对象。
     使用MultiActionController,您要配合一个 MethodNameResolver 的实例, MultiActioncontroller 默认使用的 MethodNameResolver 类是
 org . springframework . web . servlet . mvc . multiaction . InternalPathMethodNameResolver ,这个类可以根据所给的网址中,最后请求的
 文件名称来判断执行 Controller中的哪一个方法,例如/test . do 的请求会执行 test ( HttpservletRequest , HttpservletResponse )方法
 。但通常不会使用 InternalPathMethodNameResolver ,因为这就失去了使用 MultiActionController 的一些优点,像是依使用者的请求
 参数来决定所要执行的方法。
  改用->ParameterMethodNameResolver
  mvc-config.xml-

 1   < bean  id ="paraMethodResolver"            
 2     class ="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver" >  
 3      < property  name ="paramName" >
 4       < value > action </ value >
 5      </ property >  
 6      < property  name ="defaultMethodName" >
 7       < value > list </ value >
 8      </ property >  
 9      </ bean >  
10
11     < bean  id ="bookController"  class ="onlyfun.caterpillar.BookController" >  
12     < property  name ="methodNameResolver" >    < ref  bean ="paraMethodResolver" />    </ property >  
13

 

  也可以将所有相对应的方法专门组织在一个委托(delegate)物件中,而不是撰写在 Controller 类别中,当请求来到时,将
  委托给这个物件来执 行指定的方法,您只要设定 MultiActionController 的"delegate"属性参考至委托物件即可

  或者->PropertiesMethodNameResolver

1 < bean  id ="propMethodResolver"  class ="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver" >
2     < property  name ="mappings" >
3      < props >
4       < prop  key ="/listbook.do" > list </ prop >
5       < prop  key ="/addbook.do" > add </ prop >
6       < prop  key ="/deletebook.do" > delete </ prop >
7      </ props >
8     </ property >
9    </ bean >

你可能感兴趣的:(Spring MVC入门学习)