→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

<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;

<servlet>
       <servlet-name>hello</servlet-name>
       <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
       </servlet-class>
       <init-param>
            <param-name>contextConfigLocation</param-name>
                <param-value>
                     /WEB-INF/mvc-config.xml,
                     /WEB-INF/spring-config.xml
                </param-value>
        </init-param>
 </servlet>

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

spring-servlet.xml

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

base-package为注入bean时要spring要查找的包;

  Controller回传ModleAndView,DispatcherServlet会交给ViewResolver解析。如:回传一个字符串“index”,解析后找到/WEB-INF/index.jsp


4.Controller

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

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

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

把username以名值对的形式放入ModelMap,在index.jsp中用request对象接收;ModleMap,Spring提供的集合可以传递数据到返回的jsp页面

具体关于注解Spring MVC 参见http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/


5.DispacherServlet-HandlerMapping-Modle和View-Controller-ViewResolver-View

  1> web.xml:指定DispacherServelet和servlet的xml
    web.xml

 <servlet>
        <servlet-name>buzzwords</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
   </servlet>
    
  <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/buzzwords-service.xml</param-value>
  </context-param>

<load-on-startup>标记容器是否在启动的时候就加载这个servlet,数字越小,当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载;正数的值越小,启动该servlet的优先级越高

  2> BuzzwordsController:不用@Controllers则需要实现Controller接口

public class BuzzwordsController implements Controller {
    private BuzzwordService facade;
    public void setFacade(BuzzwordService facade) {
        this.facade = facade;
    }
    public ModelAndView handleRequest(HttpServletRequest request,  HttpServletResponse response) throws Exception {
        return new ModelAndView("buzzwords", "buzzwordService", facade);
    }
}

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

<bean id="buzzwordsController“ 
    class="BuzzwordsController">
    <property name="facade"><ref bean="buzzwordService"/></property>
</bean>

<bean id="urlMapping" class="SimpleUrlHandlerMapping">
    <property name="mappings">
    <props>
        <prop key="/buzzwords.htm">
            buzzwordsController
        </prop>
    </props>
</bean>

 

    4> 指定viewResolver

<bean id="viewResolver" class="org.springframeworkInternalResourceViewResolver">
    <property name="viewClass">
        <value>org.springframework View</value>
    </property>
    <property name="prefix"><value>/WEB-INF/jsp/</value></property>
    <property name="suffix"><value>.jsp</value></property>
</bean>

 

   5> buzzwords.jsp(略)

  6> 

  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继承结构图:

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

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

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

   7>

  1.web.xml

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-config.xml</param-value>
    </init-param>        
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

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

   2.Controller

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

    3.mvc-config.xml:

<beans>   
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
            <property name="prefix">
                <value>/WEB-INF/jsp/</value>
            </property>
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>
     
        <bean name="/hello.do" 
            class="onlyfun.caterpillar.HelloController"> 
            <property name="viewPage"> 
                <value>hello</value> 
            </property> 
        </bean>
</beans>

  DispatcherServlet 必须根据一个 HandlerMaPping 对象,决定请求由哪一个 Controller 来处理, DispatcherServlet 默认使用 org.springframwork.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中-

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/beans-config.xml</param-value>
</context-param>      
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

 

  beans-config.xml-

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC 
    "-//SPRING/DTD BEAN/EN" 
    "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans>   
     <bean id="dateBean" class="java.util.Date" scope="prototype"/>
</beans>

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

转自:http://www.blogjava.net/landon/archive/2011/12/26/367286.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-06-27 19:10  阿童沐  阅读(394)  评论(0)    收藏  举报