zoukankan      html  css  js  c++  java
  • 初学者对Spring MVC的认识

    首先是要一定说明的是,这倒是说明是什么?对吧Spring MVC 是SpringFrameWork的后续产品,并且已经融入到Spring Web Flow中同时Spring MVC 分离了控制器,模型对象,分派器(其实我不知道这是什么)以及处理程序对象的角色,这种分离让它们更容易进行定制.

    说了这些很官方的话,我都有点晕了,呵呵,先上一个原理流程图吧,相信会比较直观!

      Spring MVC 原理图

      Spring MVC 对应原理流程步骤:

      1.Web客户端 --> DispatcherServlet 用户发送一个请求到,首先到DispatcherServlet中(先交给前端控制器,进行全局的流程控制)

      2.DispatcherServlet --> HandlerMapping 解析用户在前台提交的请求,并按照我们的要求分配到指定的Controller(相当于struts2中的action)

      3.DispatcherServlet --> Controller 进入指定的Controller对象,执行里面的方法,返回需要的字符串(ModelAndView),在Controller里面需要对bean进行操作,也就是会和Model进行交互

      4.DispatcherServlet --> ViewResolver 解析从Controller中返回的字符串,并转换为有效的JSP路径

      5.DispatcherServlet --> JSP 将转换好的JSP路径,指定到特定的页面

      6.JSP --> Web客户端 将某一个特定的页面显示在客户端界面

      好了,以上就是Spring MVC的流程,是不是有了一定的认识了,不急,后面还有呢...

      有了基本的认识, 那就开始编码吧!(我是用的是Springframework-3.2.8)

      大家都知道的,打开编译器,准备开始开发一个项目的时候,第一步就是新建项目。哈哈!

      是不是会有一点无语,呵呵,不是别的,只是活跃一下气氛,原因你懂的。。

      好吧,这一步就不列入编码步骤里了吧,下面正式开始!

      第一步:添加架包

      是不是觉得架包很少啊,没错,这就是Spring MVC的特点,继续让它颠覆你的想法吧

      第二步:一定是web.xml文件了

      这里就是上面提到的DispatcherServlet -- 前端控制器

      后面的"*.do"就是用来拦截页面用户的请求,这里规定凡是以 .do 结尾的请求都会命中,当然这个可以自己定义,需要说明的是,不管自己定义的是什么,一定要遵守,呵呵,是不是突然觉得好有道理!

      第三步:在WEB-INF中配置 mvc-servlet.xml文件(要求名称必须以Web.xml中的<servlet-name>节点中的名字开头+servlet.xml)算了,直接上图吧:

      Java代码

    <span style="font-family:Courier New;color:#6600CC;"><</span><span style="color:#6600CC;">?xml version="1.0"encoding="UTF-8"?>

    <span style="font-family:Courier New;"><</span>beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xsi:schemaLocation="

    http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context-3.2.xsd

    http://www.springframework.org/schema/mvc

    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

    ">

    <bean id="parameterMethodNameResolver"

    class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">

    <property name="paramName"value="action"></property>

    </bean>

    <bean id="user"class="com.mvc.controller.UserController">

    <property name="methodNameResolver"ref="parameterMethodNameResolver"></property>

    </bean>

    <span style="color:#999999;"><!-- 解析地址栏上的请求 --></span>

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

    <property name="mappings">

    <props>

    <!-- key对应的url-pattern,值是控制器的bean id -->

    <prop key="login.do">user</prop>

    </props>

    </property>

    </bean></span>

    <span style="color:#999999;">

    </span><span style="color:#6600CC;"><span style="color:#999999;"><!-- 个人表示不建议使用 -->

    <!-- 在有需要进行controller跳转的时候,就不能使用这个方法 -->

    <!-- 视图解析器,在转发前要到模型进行处理 (就是智能的在返回的字符串转换成为页面) --></span>

    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">

    <property name="viewClass"

    value="org.springframework.web.servlet.view.JstlView"></property>

    <property name="prefix"value="/"/>

    <property name="suffix"value=".jsp"/>

    </bean>

    </beans></span>

      需要解释:如果某一个Controller中需要调用不用的方法时,就必须指定定义方法的名字,例如请求的路径为: user.do?action=userLogin(1).需要指定定义方法的名字:<property name="paramName" value="action" /> 定义之后,程序就知道在action之后的

    就是需要进入的某一个方法

      (如果是调用同一个方法,当然就不需要定义这个,但是只要有一个Controller需要不同的方法,就需要定义)

      (2).解析之后Controller路径,这里用到了Spring的控制反转(IOC),其他就不同多说

      <property name="methodNameResolver" ref="parameterMethodNameResolver" /> 给Controller定义方法名解析器 2.1. 可以应用已经定义好的解析器(见上)

      2.2. 可以为每一个Bean单独定义解析器

      (3).解析所有来自页面中命中的请求,并分配到不同的Controller中

      (4).在配置文件中,如果使用最后一个bean里面的内容,如果需要返回到"index.jsp"页面时,就可以直接返回"index"就OK了,这个配置文件就是为我们返回的字符串,前后自动加上"/"和".jsp".

      一旦有了这个配置之后,就不能在Controller中进行对Controller的跳转,因为它会所有的返回字符串前后都加上"/"和".jsp",而这明显不是我们所需要的,所以一般不会使用这种方法!

      到这里了,需要静一静,好好理一下思路.

      第四步:定义一个UserController,并继承MultiactionController类

      Java代码

    <span style="font-family:Courier New;color:#6600CC;">publicclassUserControllerextendsMultiActionController {

    publicModelAndView login(HttpServletRequest req,

    HttpServletResponse resp, User user) throwsException{

    String result = "";

    if(user.getName().equals("jack")){

    req.getSession().setAttribute("user", user);

    result = "login.do?action=login";//可进行Controller之间的跳转

    result = "index.jsp?age=22";//可传值到页面上

    }else{

    result = "login.jsp";

    }

    returnnewModelAndView(result);

    }

    }</span>

      (1).上面的代码中继承的是 MultiactionController类,意味着可以用来定义多个不同的方法,以请求中action后面的名字来定

      当然还可以直接完成Controller接口,意味着当前整个Controller 中,只有一个方法,且必须给定

      (2).在方法中的参数默认情况下是两个,分别是HttpServletRequset和HttpServletResponse对象,当然在此之外,还可以定义一个对象类型的参数,主要是简化表单提交多个参数(目前只了解到这里)写到这里,就差不多了,不出意外的话,你应该可以完成一个比较简单

    的Spring MVC框架的小项目了

    技术分享:凯哥学堂

  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/kaige123/p/5811898.html
Copyright © 2011-2022 走看看