8.spring的MVC框架
以前一直是用spring的mvc开发,但是是别人搭建的,自己也不是很懂,就在那用,也就是程序员最悲哀的事情,会用,不懂原理,一离开人家写的框架,自己就像不会编程似的,现在看了spring这本书,一下就明白了原来前辈们写的spring框架的东西,还是因为自己没去学习的缘故。
我自己的这份总结写的很快,中间很多如acegi安全框架,RMI远程服务,还有企业级应用,这些我暂时都还用不上,所以就没去看。我认为spring最重要的就是装配bean,理解ioc,aop,以及它的MVC(当然你要喜欢这个MVC),总共5-6章知识就够了,现在就来写spring的mvc。
要说spring的mvc框架,给从请求说起,当请求离开浏览器时,会带有用户提交的信息,那么请求的第一站就是spring的前端控制器---DispatcherServlet.
1.DispatcherServlet,从名字可以看出,他自身应该不会处理请求,而是委托给系统中的其他模块进行真正的处理。没错,你没有看错,又是委托,spring中到处都是使用委托,它的aop,事务处理,现在的前端控制器都是如此。到达 DispatcherServlet后,它会根据一组规则,来确定这个请求有怎样的方式去找控制器对象(真正处理的那个bean)。这个规则就是HandlerMapping。
2.HandlerMapping,共有4种,可以帮助 DispatcherServlet找到处理请求的正确控制器。处理器映射可以帮助DispatcherServlet找到处理请求的正确控制器
处理器映射
如何将请求映射到控制器
BeanNameUrlHandlerMappping
根据控制器的名字将控制器映射到URL
SimpleUrlHandlerMapping
用上下文配置文件中定义的属性集合将控制器映射到URL
ControllerCalssNameHandlerMapping
通过将控制器的类名作为URL的基础将控制器映射到URL
CommonsPathMapHandlerMapping
使用控制器代码中的元数据将控制映射到URL。元数据使用Jakarta Commons Attributes(http://jakarta.aqache.org/commons/attributes)定义
它的默认值是BeanNameUrlHandlerMappping,也就是说通过bean的名字来找真正的处理器。
现在已经找到了控制器Controller.
3.Controller 在控制器上,请求卸载下它的负载,等待控制器处理这些信息,完成业务逻辑后,需要返回给用户并在浏览器中显示的信息。这些信息被称为模型,一般是在jsp上显示出来(用jstl),控制器一般只有很少的处理工作,它一般是用service层给它提供的服务,所以这里就用到了ioc,你怎么获得这个service层的服务呢?注入进来,获得。有了模型,给告诉它被发送到哪里显示啊,所以还有视图,控制器将模型和视图打包到一个对象里叫做ModelAndView。接着将ModelAndView发送回 DispatcherServlet。
4.ModelAndView 它本身并不带有JSP的路径,而是只有视图的逻辑名,你可以想象成关键字。比如/WEB-INF/jsp/home.jsp。视图的逻辑名就是home,而/WEB-INF/jsp/和.jsp这2个信息, DispatcherServlet会要求一个视图解析器根据这2个信息来协助查找实际的jsp。
5.请求工作基本完成了,将相应对象返回给浏览器。
配置 DispatcherServlet
其中 xxxx-spring-servlet.xml是你配置所有 Controller的地方。这里面要配置视图解析器
spring建议将配置文件分开配置,Controller在一个配置文件,dao和service也要分开,不过我自己觉得没必要,所以把dao和service配置在一起。
当然还要有
配置上Controller依赖的dao和service
其中 myproject-spring-ds.xml就是dao和service的配置文件。
最后还要配置一个上下文载入器,保证其他上下文文件都载入。
这样web.xml中的配置文件就基本完成了,当然像日志啊,encodingFilter,hibernateFilter等,也要在这里配置,不细说了。
写控制器的时候,你可以实现Controller接口,但是我认为比较好的方法是继承AbstractController,或者你可以自己再写一个核心控制器,来继承AbstractController,里面有你自己的方法。当然要根据实际情况来编写。
spring的mvc,想要搞出一套自己用的爽的,要花很大功夫,比如Dao层可以自己写BaseDAOHibernate,来继承AbstractHibernateDAO,当然自己写个牛B的通用分页,也是很重要的。诸如此类的细节太多了。要慢慢完善自己的mvc框架。
以前一直是用spring的mvc开发,但是是别人搭建的,自己也不是很懂,就在那用,也就是程序员最悲哀的事情,会用,不懂原理,一离开人家写的框架,自己就像不会编程似的,现在看了spring这本书,一下就明白了原来前辈们写的spring框架的东西,还是因为自己没去学习的缘故。
我自己的这份总结写的很快,中间很多如acegi安全框架,RMI远程服务,还有企业级应用,这些我暂时都还用不上,所以就没去看。我认为spring最重要的就是装配bean,理解ioc,aop,以及它的MVC(当然你要喜欢这个MVC),总共5-6章知识就够了,现在就来写spring的mvc。
要说spring的mvc框架,给从请求说起,当请求离开浏览器时,会带有用户提交的信息,那么请求的第一站就是spring的前端控制器---DispatcherServlet.
1.DispatcherServlet,从名字可以看出,他自身应该不会处理请求,而是委托给系统中的其他模块进行真正的处理。没错,你没有看错,又是委托,spring中到处都是使用委托,它的aop,事务处理,现在的前端控制器都是如此。到达 DispatcherServlet后,它会根据一组规则,来确定这个请求有怎样的方式去找控制器对象(真正处理的那个bean)。这个规则就是HandlerMapping。
2.HandlerMapping,共有4种,可以帮助 DispatcherServlet找到处理请求的正确控制器。处理器映射可以帮助DispatcherServlet找到处理请求的正确控制器
处理器映射
如何将请求映射到控制器
BeanNameUrlHandlerMappping
根据控制器的名字将控制器映射到URL
SimpleUrlHandlerMapping
用上下文配置文件中定义的属性集合将控制器映射到URL
ControllerCalssNameHandlerMapping
通过将控制器的类名作为URL的基础将控制器映射到URL
CommonsPathMapHandlerMapping
使用控制器代码中的元数据将控制映射到URL。元数据使用Jakarta Commons Attributes(http://jakarta.aqache.org/commons/attributes)定义
它的默认值是BeanNameUrlHandlerMappping,也就是说通过bean的名字来找真正的处理器。
现在已经找到了控制器Controller.
3.Controller 在控制器上,请求卸载下它的负载,等待控制器处理这些信息,完成业务逻辑后,需要返回给用户并在浏览器中显示的信息。这些信息被称为模型,一般是在jsp上显示出来(用jstl),控制器一般只有很少的处理工作,它一般是用service层给它提供的服务,所以这里就用到了ioc,你怎么获得这个service层的服务呢?注入进来,获得。有了模型,给告诉它被发送到哪里显示啊,所以还有视图,控制器将模型和视图打包到一个对象里叫做ModelAndView。接着将ModelAndView发送回 DispatcherServlet。
4.ModelAndView 它本身并不带有JSP的路径,而是只有视图的逻辑名,你可以想象成关键字。比如/WEB-INF/jsp/home.jsp。视图的逻辑名就是home,而/WEB-INF/jsp/和.jsp这2个信息, DispatcherServlet会要求一个视图解析器根据这2个信息来协助查找实际的jsp。
5.请求工作基本完成了,将相应对象返回给浏览器。
配置 DispatcherServlet
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/myproject-spring-servlet.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
其中 xxxx-spring-servlet.xml是你配置所有 Controller的地方。这里面要配置视图解析器
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix">
<value>/WEB-INF/view/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="contentType">
<value>text/html;charset=UTF-8</value>
</property>
</bean>
spring建议将配置文件分开配置,Controller在一个配置文件,dao和service也要分开,不过我自己觉得没必要,所以把dao和service配置在一起。
当然还要有
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
配置上Controller依赖的dao和service
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/myproject-spring-ds.xml</param-value>
</context-param>
其中 myproject-spring-ds.xml就是dao和service的配置文件。
最后还要配置一个上下文载入器,保证其他上下文文件都载入。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这样web.xml中的配置文件就基本完成了,当然像日志啊,encodingFilter,hibernateFilter等,也要在这里配置,不细说了。
写控制器的时候,你可以实现Controller接口,但是我认为比较好的方法是继承AbstractController,或者你可以自己再写一个核心控制器,来继承AbstractController,里面有你自己的方法。当然要根据实际情况来编写。
spring的mvc,想要搞出一套自己用的爽的,要花很大功夫,比如Dao层可以自己写BaseDAOHibernate,来继承AbstractHibernateDAO,当然自己写个牛B的通用分页,也是很重要的。诸如此类的细节太多了。要慢慢完善自己的mvc框架。