SpringMVC学习记录

一、浏览器发出请求,如url:localhost:8080/test/start.testhtml

二、请求会给到DispatcherServlet(总的控制中心——前端控制器),由它对请求进行派发,前端控制器是须要写在配置文件web.xml中,即前端

       <servlet>
             <servlet-name> test</servlet-name >
             <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class >
             <load-on-startup> 1</ load-on-startup>
       </servlet>

       <servlet-mapping>
             <servlet-name> test</servlet-name >
             <url-pattern> *.test</url-pattern >
       </servlet-mapping>

因为限制了url的格式,若是请求是已.test结尾的。java

三、前端控制器DispatcherServlet接收到请求,派发给咱们本身的控制器,即具体的控制器,如StartController,如何派发给本身的控制器呢,就须要一个HandlerMapping,即创建了请求与控制器之间的映射,HandlerMapping须要配置在test-Servlet.xml文件中。web

这里说一个比较简单的控制器,SimpleUrlHandlerMapping,配置代码以下:spring

<!-- 基于Url的控制器,比较简单的控制器 -->
       <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
             <property name="mappings" >
                   <props>
                         <prop key="start.test" >startController</ prop>
                         <prop key="add_emp.test" >addEmpController</ prop>       
                         <!-- UrlFilenameViewController -->
                         <prop key="add.test" >addEmpSuccController</ prop>
                   </props>
             </property>
       </bean>

四、转到哪一个具体的控制器,就须要按本身的要求去选择了。浏览器

上面提到的,本身创建的控制器,实现的是简单的Controller接口,以下:restful

       <bean id= "startController" class ="test.StartController"></ bean>mvc

经常使用的,以及好用的控制器,在通常项目中常常使用到的。app

用于直接跳转页面的控制器:jsp

ParameterizableViewController,UrlFilenameViewController

配置以下:

(1)须要指定视图名,name ="viewName" value= "login"

<!-- 参数化的ViewController,咱们不须要本身创建,只须要直接使用就能够了 -->
       <bean id= "loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" >
             <property name="viewName" value="login"/> 
       </ bean>

(2)不须要指定视图名,他是获取Url中的“.test”前面那一段。如“add_emp

<!-- 使用UrlFilenameViewController,就不须要配置视图名这个过程。 -->
       <bean id= "addEmpController"
             class="org.springframework.web.servlet.mvc.UrlFilenameViewController" >
       </bean>

使用时机:有时候,把全部的jsp文件隐藏在WEB-INF中里面。

进阶,控制器,包括

AbstractController

命令控制器——AbstractCommandController

(3)这个控制器开始,能够自动封装表单参数成Object commandc对象,控制器中只须要。

             //自动封装表单参数成command,再强制装换成 Emp对象。

            Emp emp=(Emp)command;

             //service.addEmp(emp);

            System. out.println(emp);

在配置文件中,须要制定Command是一个什么样类型的类。

<!-- 指定command对象是一个什么样的类,此处为员工类test.Emp -->
       <bean id= "addEmpSuccController" class="test.EmpController">
             <property name="commandClass" value="test.Emp"/>
       </bean>

如此就能够了。

(4)说到这个控制器可以自动封装表单成为咱们须要的Bean,表单中的类型为int或String类型,能够,若是是Date类型,就不能够。

整型正确转行,日期型不正确转化

属性编辑器的问题

如何提供本身的属性编辑器。

DataBind——数据绑定

给数据绑定对象注册一个日期类型的属性编辑器,须要重写初始化绑按期的方法

       @Override
       protected void initBinder(HttpServletRequest request,
                  ServletRequestDataBinder binder) throws Exception {
             // TODO Auto-generated method stub
             super.initBinder(request, binder);
      }

自定义为以下所示:

//注册了日期转换的编辑器
       @Override
       protected void initBinder(HttpServletRequest request,
                  ServletRequestDataBinder binder) throws Exception {
            binder.registerCustomEditor(Date. class, new CustomDateEditor(
                         new SimpleDateFormat("yyyy-MM-dd" ), true));
      }

表单控制器——SimpleFormController

(5)onSubmit方法,当表单用post方法提交时,会转到这个方法。若是进入一个页面以前有,有数据须要初始化,须要用到referenceData方法。建造一个map模型。

jsp页面须要使用到jstl包。

       @Override
       protected Map referenceData(HttpServletRequest request) throws Exception {
            Map<String, Object> model= new HashMap<String, Object>();
            model.put( "deptList", new String[]{"sales", "manage"});
             return model;
      }

       /**
       * onSubmit方法,是当表单提交时处理请求
       * 3.0版本后少用。
       * 若是使用command控制器,只要 Url符合要求,自动就会提交
       * 若是使用Form控制器,只有表单是method="post"时,才会去执行onSubmit方法。
       */
       @Override
       protected ModelAndView onSubmit(Object command) throws Exception {
            
            Emp emp = (Emp) command;
             // service.addEmp(emp);
            System. out.println(emp);
             return new ModelAndView(getSuccessView() );
            
      }

test-servlet.xml配置文件须要配置以下:

       <bean id= "addEmpController" class ="test.EmpFormController">
             <property name="commandClass" value="test.Emp" />
             <property name="formView" value="add_emp" />
             <property name="successView" value="success" />
       </bean>

(6)

五、视图解析器。

       <!--基于URL的视图解析器, 从逻辑视图名称到真正视图上面的映射 -->
       <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" >
             <property name="viewClass"
                   value="org.springframework.web.servlet.view.JstlView" />
             <property name="prefix" value="/WEB-INF/jsp/" />
             <property name="suffix" value=".jsp" />
       </bean>

       

跳转到哪一个页面,是根据这里设定的,

六、基于注解的MVC

  1. 加入包

  2. 当有多个配置文件时,能够在web.xml中配置以下:

    1. <servlet >
            <servlet-name >mvc</ servlet-name>
              < servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
            <init-param >
                   <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名称不变 -->
                   <param-value> /WEB-INF/classes/spring/*.xml </param-value>
            </init-param >
            <load-on-startup >1</ load-on-startup>
        </servlet >
    2. 看样子是知道了,虽然是在src/config里面创建配置文件,可是项目运行会把它放到上面的路径中。

    3.  下面的配置是重点!

    4. <init-param >
                   <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名称不变 -->
                   <param-value> /WEB-INF/classes/spring/*.xml </param-value>
            </init-param >
  3. 在Controller中,添加注解,如

    1. @Controller
      @RequestMapping("/test" )
      public class TestController {
            
             @RequestMapping("/start/{name}" )
             public String start(@PathVariable String name){
                  
                  System. out.println(name);
                   return "start" ;
            }
      
      }
    2. 上面使用了两个注解。看到了吧

  4.  在servlet.xml中,首先,须要扫描包含控制器的包,找到这些注解。

    1. <!-- 一、进行广泛扫描 -->
             <context:component-scan base-package="test.controller" />
    2. <!-- 二、视图解析器,使用 jsp或者jstl 最适合使用这个类。基于Resources的解析器 -->
             <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
                   <property name="prefix" value="/WEB-INF/page/"/>
                   <property name="suffix" value=".jsp"/>
             </bean>

  5. 详细讲              @RequestMapping ("/start" )

    1.  方法级别(必定要有),如上http://localhost:8080/@mvc/start.do

    2.  类级别,至关于根路径http://localhost:8080/@mvc/test/start.do

    3.  

  6.  restfull,Url层面上的。

相关文章
相关标签/搜索