zoukankan      html  css  js  c++  java
  • Spring之Spring MVC

    1. Spring调配半天没搞定,原来是web.xml应该放在WEB-INF的目录下,而不是webcontent目录下;
    2. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener;一个错误引发的血案,整个上午外加大半个下午我都在搞清楚这个东西,原来是因为lib下面没有拷贝引用的jar;在eclipse中有一个LibraryWeb App Library,这个目录直指WEB-INF/lib,配置是在.settings下面的org.eclipse.wst.common.componentwb-resource节点中配置了/WebContent,意味着该目录下面的jar将会用于编译;Web工程其实是需要将需要的Jar包放置到lib下面,然后Web app Library将会自动感应出来(在Build Path中的Web app Library中显示出来);也就是说:Web项目是不需要ref lib,只要维护好web app lib就可以;
    3. Spring中定义的servlet节点定义了dispachter类以及加载bean的内心;如果没有通过param-init节点进行contextConfigLocation节点指定,那么默认的加载的路径为WEB-INF下面的[servletname]-servlet;如果指定了则从指定的文件中加载bean文件;
    4. BeanNameUrlHandlerMapping,是最基本的SpringUrlHandler处理器,如果没有声明任何mapping,默认就是使用它;通过分析请求资源路径,来映射到指定的Controller中;和Mapping配套的定义的就是adapterSpring的内部机制是dispatcher接收到请求,然后根据定义,实例化Mapping,然后mapping根据定义的adapter类型到adapter池中去找匹配的HandlerHandler必须继承和adapter相一致的handler,比如HandlerSimpleControllerHandlerAdapter,那么Controller就要继承自Controller并实现requestHandler;那要是HttpRequestHandleAadpter,那么controller就要实现HttpRequestHandler,并实现里面定义的函数;mapping是决定解析的机制,即requesthandlercontroller)的映射,(是注解的还是beanurl);adapter则定义了controller的根是什么样的,用于mapping去定位;
    5. Spring可以在声明bean的时候,指定cacheSeconds来进行缓存等对于response的设定;
    6. ETagsEntity Tags,用来表明请求资源是否有被改变,多半都是Web服务器内置支持,比如Apachetomcat都支持对ETag的判断;
    7. Spring的第三个基本Bean就是ViewResolver(前两个mapping以及handlerAdapter),他定义了如何根据指定的ViewId,找到对应的页面,这个bean里面定义了jsp文件路径以及需要处理的文件类型(.jsp);
    8. WebContentGenerator里面定义了很多和Http-response相关的内容,比如method,是否需要sessionisRequireSession,如果请求没有对应的session将会抛出异常,isUseCacheControlHeader,是否使用缓存;AbstractController继承自这个类,同时还实现了controller,所以它是比直接继承Controller拥有更加丰富的功能,可以在声明bean的时候对于这些Http请求/相应做一些约束和指令;
    9. 如果是properties文件发生了变化,tomcat会探测到并进行自动重新加载配置文件,但是对于sping的配置文件发生了变化,则没有探测出来;不做任何动作;
    10. 调试MVC的时候,一度总是资源没有找到,后来发现是因为URL中应该添加工程名称http://localhost:8002/simplemvc-chapter2/hello
    11. simpleFormControllerproperty里面定义了两个ViewFormView以及SuccessView,前者用来定义请求返回页面,后者用来定义成功页面(doSubmitAction没有抛出异常); 这就是request-Post页面的配置形式
      <bean name="/reg" class="cn.javass.chapter2.web.controller.RegisterController">
      <property name="formView" value="register"/>
      <property name="successView" value="redirect:/success"/>
      </bean>
    12. SimpleFormController中处理提交机制为:如果提交的name不是"_cancel"那么就走doSubmit方法,如果是,那么就映射到onCancel方法中去;对于redirect关键字,代表着其实是相应先到客户端,然后再让客户端向目标地址再发请求,所以通过Fidler看到的其实是两个请求;比如取消提交,首先请求是register,服务器response,在Response Header中的"Transport"节点添加值为Location: http://localhost:8002/simplemvc-chapter2/cancel然后客户端再次向Location地址发送请求; 所以对于formView, successView以及CancelView指代都是返回到客户端的;redirect不过是在Response Header里面的Transport添加了Redirect的地址而已;
    13. setViewName其实是和ViewResolver进行接力,ViewResolver里面定义了到哪里去找View对应的JSPController返回ModelAndView之后,ViewResolver将会根据ViewName附加.jsp去寻找对应的页面来进行渲染(还包括${...}占位符的填充;Spring正常情况只能制定一种ViewResolver(只能处理一种文件);
    14. SpringAbstractCommandController提供了command对象,用来接收queryString或者Form中内容,其中PropertyEditorSupport就是用于验证提交的内容的;首先需要重写controllerinitBinder方法;通知Controller在填充Command的时候那些类型(除了原生类型之外的)需要进行处理,以及处理的类什么:binder.registerCustomEditor(UserModel.class, new UserNameEditor());注意,UserModeCommand类型的一个字段类型(Comand需要在构造函数的时候指定);构造UserNameEditor的时候注意:继承自PropertyEditorSupport,重写setAsText;整个的处理流程是:QueryStringForm)到了dispatcher,再根据一些配置决定将请求转交给AbstractCommandController的某个类,构造Command对象,在给属性进行复制的时候,首先判断这个属相的类型是否有被注册为自定义处理(registerCustomerEditor),如果是有,则调用注册的editorsetAsText方法进行处理,构造该属性;昨天晚上我弄到12点,就是因为错误的理解为,Spring将会递归遍历UserModelContainer中所以字段找到同名属性进行赋值;但是真实情况是:UserName其实是直接付给UserContainer中同名属性(只是查看一级),如果同名属性被注册为CustomerEditor,那么进行自定义处理;其实PropertyEditorSupport主要不是做类型校验,而是做类型转换,比如QueryStringaddree=LN-DL-高新区,那么可以设计一个Address对象,以"-"做分隔符,来为ProvinceCity以及Street三字段赋值;
    15. 作为BindException类型通过getModel()方式获得command对象并传递到同台,<form:form><form:error path="*">...解析机制并不是找modelView.addObject(key, command)里面的key,而是解析command里面的key值,这个key值是AbstractCommandController中构造函数时候调用setCommandName(key)是指定的key值;当然,对于页面元素的渲染,使用的是addObject的时候指定的Key值来做索引,比如value="${objectKey.username}"form:form/error是基于自身的key
    16. setViewName其实是和ViewResolver进行接力,ViewResolver里面定义了到哪里去找View对应的JSPController返回ModelAndView之后,ViewResolver将会根据ViewName附加.jsp去寻找对应的页面来进行渲染(还包括${...}占位符的填充;
  • 相关阅读:
    beta冲刺————第二天(2/5)
    beta冲刺————第一天(1/5)
    个人作业——软件产品案例分析
    c++第七次作业____最后的总结
    计算器图形界面
    object-oriented second work
    第五次作业(文件处理)
    object-oriented first work
    第四次作业--计算器简单计算
    新的Calculator的规范作业
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/5230482.html
Copyright © 2011-2022 走看看