1. Spring调配半天没搞定,原来是web.xml应该放在WEB-INF的目录下,而不是webcontent目录下;
  2. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener;一个错误引发的血案,整个上午外加大半个下午我都在搞清楚这个东西,原来是因为lib下面没有拷贝引用的jar;在eclipse中有一个Library,Web App Library,这个目录直指WEB-INF/lib,配置是在.settings下面的org.eclipse.wst.common.component,wb-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,是最基本的Spring的Url和Handler处理器,如果没有声明任何mapping,默认就是使用它;通过分析请求资源路径,来映射到指定的Controller中;和Mapping配套的定义的就是adapter,Spring的内部机制是dispatcher接收到请求,然后根据定义,实例化Mapping,然后mapping根据定义的adapter类型到adapter池中去找匹配的Handler(Handler必须继承和adapter相一致的handler,比如Handler是SimpleControllerHandlerAdapter,那么Controller就要继承自Controller并实现requestHandler;那要是HttpRequestHandleAadpter,那么controller就要实现HttpRequestHandler,并实现里面定义的函数;mapping是决定解析的机制,即request和handler(controller)的映射,(是注解的还是beanurl);adapter则定义了controller的根是什么样的,用于mapping去定位;
  5. Spring可以在声明bean的时候,指定cacheSeconds来进行缓存等对于response的设定;
  6. ETags:Entity Tags,用来表明请求资源是否有被改变,多半都是Web服务器内置支持,比如Apache,tomcat都支持对ETag的判断;
  7. Spring的第三个基本Bean就是ViewResolver(前两个mapping以及handlerAdapter),他定义了如何根据指定的ViewId,找到对应的页面,这个bean里面定义了jsp文件路径以及需要处理的文件类型(.jsp);
  8. WebContentGenerator里面定义了很多和Http-response相关的内容,比如method,是否需要session(isRequireSession,如果请求没有对应的session将会抛出异常,isUseCacheControlHeader,是否使用缓存;AbstractController继承自这个类,同时还实现了controller,所以它是比直接继承Controller拥有更加丰富的功能,可以在声明bean的时候对于这些Http请求/相应做一些约束和指令;
  9. 如果是properties文件发生了变化,tomcat会探测到并进行自动重新加载配置文件,但是对于sping的配置文件发生了变化,则没有探测出来;不做任何动作;
  10. 调试MVC的时候,一度总是资源没有找到,后来发现是因为URL中应该添加工程名称http://localhost:8002/simplemvc-chapter2/hello;
  11. simpleFormController的property里面定义了两个View,FormView以及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对应的JSP,Controller返回ModelAndView之后,ViewResolver将会根据ViewName附加.jsp去寻找对应的页面来进行渲染(还包括${...}占位符的填充;Spring正常情况只能制定一种ViewResolver(只能处理一种文件);
  14. 点,就是因为错误的理解为,Spring将会递归遍历UserModelContainer中所以字段找到同名属性进行赋值;但是真实情况是:UserName其实是直接付给UserContainer中同名属性(只是查看一级),如果同名属性被注册为CustomerEditor,那么进行自定义处理;其实PropertyEditorSupport主要不是做类型校验,而是做类型转换,比如QueryString中addree=LN-DL-高新区,那么可以设计一个Address对象,以"-"做分隔符,来为Province,City以及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. 切记拦截器(Interceptor)在xml中配置的位置为顶端,如果把它放置在底部,将会导致拦截器失效;拦截器是全局有效的,所以拦截器的意义在于可以影响全局(比如记录日志,验证来源),如果只是局部,可以考虑直接在具体的controller里面来做这件事情;可以指定多个拦截器,配置中<list>节点下面的配置顺序很重要,就是按照这个顺序来执行拦截器的;
  17. 拦截器有三个方法,方别是controller处理前(preHandle),controller处理后(postHandle)以及全部执行完毕(包括页面渲染/生成)(afterCompletion),其中preHandle如果返回为false,那么就终止执行,后续包括其他拦截器,controller都不在执行,返回的就是一个空白页面;
  18. 拦截器的核心配置为:

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

<property name="interceptors">

<list>

<ref bean="interceptor1" />

<ref bean="interceptor2" />

</list>

</property>

</bean>

  1. 拦截器需要继承HandlerInterceptorAdapter
  2. 关于自定义错误:
    后台:errors.rejectValue("userName", "username.not.empty");
    前台:<input type="text" value="${uuv.userName }"/><form:errors path="UserMode.userName" cssStyle="color.red"></form:errors>;path中的UserMode来自于后台的构造函数:super.setCommandName("UserMode");
  3. 还可以使用validator来进行封装,继承自Validator:

public class UserInfoValidator implements Validator {

@Override

public boolean supports(Class<?> clazz) {

return UserModel.class == clazz;

}

@Override

public void validate(Object target, Errors errors) {

errors.rejectValue("userName", "", "公司名称请用全称");

}

}

前端代码:<form:errors path="user.userName" cssStyle="color.red"></form:errors>用来接收userName异常信息显式;

配置文件:

<bean id="myValidator" class="cn.javass.chapter2.web.validator.UserInfoValidator"/>

<bean name="/reg" class="cn.javass.chapter2.web.controller.RegisterController">

... ...

<property name="validator" ref ="myValidator"/>

</bean>

  1. 拦截器和过滤器是有层面区别:Filter是包裹Interceptor的;
  2. 使用注解的MVC,handlerMapping使用的是:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
    HandlerAdapter使用的是:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter ;ViewResolver还是用:org.springframework.web.servlet.view.InternalResourceViewResolver不变;
  3. Controller级别声明@Controller,在方法级别声明@RequestMapping("/hello");即可;
  4. 页面端处理和之前是一样的,通过${message}来获取对应的信息;如果你的后台通过mv.setObject("message", userInfo),useInfo是一个你定义的包含属性userName(同时又get/set函数),这个时候,你需要在前台通过${message.userName}来获得后台的赋值;其实之前讲述的AbstractCommandControl里面定义的Command,只不过做了一件事情,就是new了一个entity,因为前台都是通过${user.userName}这样的形式进行数据绑定,request的时候,会根据服务器返回的user字段数据进行绑定;提交的时候,会把这些数据收集,在后台放置到一个Command对象中(根据字段名称进行映射);
  5. 如果是在controller类级别添加RequestMapping声明,这是添加对于资源路径限制,比如:

@Controller

@RequestMapping("/user")

public class HelloworldAnnocation {

@RequestMapping("/hello")

public ModelAndView helloWorld(){... ...

可以匹配http://ip:port/user/hello,但是无法匹配http://ip:port/hello;

  1. 基于注解的MVC:

配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

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

    xsi:schemaLocation="http://www.springframework.org/schema/beans

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

    <bean

        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

    <bean

        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

    <bean

        class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="viewClass"

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

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

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

    </bean>

    <bean class="com.simplemvc.annocation.HelloworldAnnocation"/>  

</beans> 

1)三大核心对象,HandleMapping,HandleAdapter以及ViewResolver

 

请求

    @RequestMapping(value="/usr", method=RequestMethod.GET)

    public ModelAndView reg(){

        ModelAndView mv = new ModelAndView();

        UserInfo u = new UserInfo();

        u.setUserName("Jim");

        mv.setViewName("reg");

        mv.addObject("user", u);

        System.out.println("Just get method");

        return mv;

    }

1)需要注明method是GET;

2)如果不需要向前台绑定数据,方法可以返回值为String,返回页面的名称即可,比如 return "reg";但是如果需要向前台绑定数据,那么,就需要生成ModelAndView对象,对其进行addObject处理;

3)前台绑定使用"user"做索引进行字段绑定,比如:
<input type="text" name="userName" value="${user.userName}"/>

 

提交处理

    @RequestMapping(value="/usr", method=RequestMethod.POST)

    public ModelAndView regSumbit(HttpServletRequest request, UserInfo user){

        ModelAndView mv = new ModelAndView();

        System.out.println("model's address is: " + user.getAddress());

        user.setUserName("Lorry");

        user.setAddress(user.getAddress() + "_returnback");

        mv.addObject("user", user);

        mv.setViewName("reg");

 

        return mv;

    }

1)需要注明method是POSt;

2)接受UserInfo对象,注意要保证前台input控件的name和UserInfo中字段是对应关系;比如:
<input type="text" name="userName" value="${user.userName}"/>

 

页面

<body>

    <form method="post">

        User Name: <input type="text" name="userName" value="${user.userName}" /></br> 

        User Address: <input type="text" name="address" value="${user.address }" /></br>

        <!-- <input type="submit" style="size:50px" value="Click"/> -->

        <input type="submit" value="Submit" />

    </form>

</body>

1)form标签需要声明method为"post";

2)name属性需要和后台绑定Model字段保持一致;value属性使用后台赋值对象名称做索引;

 

Parameter(QueryString的处理)

public String requestparam2(@RequestParam("username") String username) 

@RequestParam注解主要有哪些参数:

value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码

defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如"#{systemProperties['java.vm.version']}"。

 

@PathVariable绑定URI模板变量值

  1. @RequestMapping(value="/users/{userId}/topics/{topicId}")  
  2. public String test(  
  3.        @PathVariable(value="userId") int userId,   
  4.        @PathVariable(value="topicId") int topicId)   

Spring之Spring MVC的更多相关文章

  1. 深入分析Spring 与 Spring MVC容器

    1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...

  2. tomcat 7下spring 4.x mvc集成websocket以及sockjs完全参考指南

    之所以sockjs会存在,说得不好听点,就是因为微软是个流氓,现在使用windows 7的系统仍然有近半,而windows 7默认自带的是ie 8,有些会自动更新到ie 9,但是大部分非IT用户其实都 ...

  3. Spring与Struts2整合VS Spring与Spring MVC整合

    Spring与Struts2整合,struts.xml在src目录下 1.在web.xml配置监听器 web.xml <!-- 配置Spring的用于初始化ApplicationContext的 ...

  4. 搭建Spring、Spring MVC、Mybatis和Freemarker

    搭建Spring.Spring MVC.Mybatis和Freemarker 1.pom文件 <project xmlns="http://maven.apache.org/POM/4 ...

  5. java(样品集成框架spring、spring mvc、spring data jpa、hibernate)

    这是你自己的参考springside集成框架的开源项目.主要的整合spring.spring mvc.spring data jpa.hibernate几个框架,对于这些框架中仍然感觉更舒适sprin ...

  6. Spring、Spring MVC、MyBatis

    Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Sp ...

  7. Spring框架和MVC原理

    Spring框架和MVC原理 目录 Spring框架 SpringMVC工作原理 参考资料 回到顶部 Spring框架 Spring当前框架有20个jar包,大致可以分为6大模块: Core Cont ...

  8. IDEA下创建Maven项目,并整合使用Spring、Spring MVC、Mybatis框架

    项目创建 本项目使用的是IDEA 2016创建. 首先电脑安装Maven,接着打开IDEA新建一个project,选择Maven,选择图中所选项,下一步. 填写好GroupId和ArtifactId, ...

  9. spring、spring mvc、mybatis框架整合基本知识

    学习了一个多月的框架知识了,这两天很想将它整合一下.网上看了很多整合案例,基本都是基于Eclipse的,但现在外面公司基本都在用Intellij IDEA了,所以结合所学知识,自己做了个总结,有不足之 ...

  10. Struts+Spring+Hibernate、MVC、HTML、JSP

    javaWeb应用 JavaWeb使用的技术,比如SSH(Struts.Spring.Hibernate).MVC.HTML.JSP等等技术,利用这些技术开发的Web应用在政府项目中非常受欢迎. 先说 ...

随机推荐

  1. careercup-递归和动态规划 9.5

    9.5 编写一个方法,确定某字符串的所有排列组合. 类似leetcode:Permutations 解法: 跟许多递归问题一样,简单构造法非常管用.假设有个字符串S,以字符序列a1a2a...an表示 ...

  2. Android(java)学习笔记161:Framework运行环境之启动SystemServer进程

          SystemServer进程是zygote孵化出的第一个进程,该进程是从ZygoteInit.java的main函数中调用startSystemServer()开始的.与启动普通进程的差别 ...

  3. 获取本地IP和端口号的指令

    ipconfig就可以获取ip 获取端口号的指令: 开始--运行--cmd--输入netstat an(中间有一空格)

  4. c语言冒泡排序,指针,数组

    冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复 ...

  5. linux 软连接方式实现上传文件存储目录的无缝迁移

    背景: 由于前期的磁盘空间规划与后期的业务要求不符合.原先/home被用于用户上传文件的存储目录,但是由于上传文件的逐渐增多,而原来的/home目录的空间不足,需要给/home目录进行扩容.同时各个应 ...

  6. js验证

    验证短日期(2007-06-05) function strDateTime(str) {    var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1 ...

  7. 利用javascript实现文本的自动输出

    主要利用了setTimeout(),递归和String.substring(); 做出的效果就像是有一个打字员在打字. <!doctype html> <html lang=&quo ...

  8. w3c 学习html DOM

    什么是DOM? DOM是W3C标准,定义了访问HTML 和 XML文档的标准 W3C 文档对象模型(DOM)是中立于平台和语言接口,它允许程序动态的访问和更新文档的内容.结构和样式. W3C DOM ...

  9. SQL Server系统表sysobjects介绍与使用(转)

    SQL Server系统表sysobjects介绍与使用 关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可 ...

  10. Jstl标签库/Filter过滤器

    JSTLJSP Standard Tag Library JSP标准标签库 是Sun公司定义的一套标准,由Apache组织基于这套标准开发的一套标准库之后又转给Sun公司被称为JSTL,成为了java ...