对springMVC框架项目的学习与解析

看到一句话自勉:程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。

今天我要整理的是现在项目用的框架SpringMVC,之前提到了他的优势,减少了配置文件的书写,下面就说下自己搭建框架的过程(推荐大家学习下Spring in action):

先来看一张流程图:


首先web.xml下配置DispatcherServlet(之前的建项目,导包不在说)

<!-- 配制spring分发器servlet -->

  <servlet>

  <servlet-name>action</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>action</servlet-name>

  <url-pattern>*.action</url-pattern>

  </servlet-mapping>

创建控制器HomeController:

public class HomeController extendsAbstractController {

  protectedModelAndViewhandleRequestInternal(HttpServletRequest arg0,

  HttpServletResponse arg1) throws Exception {

  System.out.println("hello world");

  returnnew ModelAndView("index");

  }

}

配置WEB-INF下的action-servlet.xml文件:

<!-- 控制器-->

  <bean name="/home.action"class="cn.itcast.springmvc.controller.HomeController">

  </bean>

 

  <!-- 内部资源视图解析器-->

  <bean id="internalResourceViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">

  <!-- 前缀-->

  <property name="prefix"value="/WEB-INF/jsps/"/>

  <!-- 后缀-->

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

  </bean>

提到处理器映射,我们说下一般有哪些:(bean名url处理器映射,简单url处理器映射,控制器类名处理器映射)

<!--beanurl处理器映射-->

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

  <property name="order"value="1" />

</bean>

<!-- 简单url处理器映射-->

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

<propertyname="mappings">

<props>

  <prop key="/bbb.action">helloController</prop>

</props>

</property>

<propertyname="order" value="2" />

</bean>

<!-- 控制器类名处理器映射 -->

<beanid="controllerClassNameHandlerMapping"class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">

  <property name="order"value="3" />

</bean>

还有就是控制器Controller的几种:

? CommandController(命令控制器)

* 需要继承AbstractCommandController类,并重写handle方法

* 通过构造方法注册命令类和命令名称,如:

  publicMyCommandController(){

  //注册命令类

  this.setCommandClass(Person.class);

  //命令名称

  this.setCommandName("person");

  }

? FormController(表单控制器)

* 需要继承SimpleFormController类,并重写doSubmitAction方法

* 通过构造方法注册命令类和命令名称,如:

  publicMyFormController(){

  this.setCommandClass(Person.class);

  this.setCommandName("person");

  }

* 在spring配置文件中对表单控制器进行配置,如:

  <!--表单控制器 -->

  <beanid="myFormController" name="/form.action"   class="cn.itcast.controller.MyFormController">

  <propertyname="successView" value="success"/>

  <propertyname="formView" value="personForm"/>

  </bean>

? WizardFormController(向导表单控制器)

* 需要继承AbstractWizardFormController类,并重写processFinish方法

*通过构造方法注册命令类和命令名称,如:

publicMyWizardFormController(){

  this.setCommandClass(Person.class);

  this.setCommandName("person");

}

* 在spring配置文件中对向导表单控制器进行配置,如:

<!-- 向导表单控制器 -->

<bean name="/wizard.action" id="myWizardFormControlle" class="cn.itcast.controller.MyWizardFormController">

<propertyname="pages">

<list>

<value>wizard/1</value>

<value>wizard/2</value>

<value>wizard/3</value>

</list>

</property>

</bean>

剩下就是spring的配置,这么我们采用注解方式,将dao,service,controller层分别注解:

dao:@Repository service:@Service  controller:@Controller

我们说不按照struts.xml方法配置方法跳转,那如何实现页面和方法的跳转那,springMVC则采用方法体上通过注解将前台方法体和后台执行绑定:

@requestMap(value="")在value中填写方法路径和方法名,其中还可以设置方法接受的方法methed,就是表单的get,post方法,同时我们还把所有视图的跳转都交给控制器,就是原本前台可以直接跳转的,我们也要过一次后台处理,一是通过后台加载数据,二是方便实现权限控制,将用户的所有操作都控制在服务器端,这个是权限粗粒度控制的优势。跳转有了,怎么加载跳转后的视图,就是肯定有新的url产生,这里就有新的类,ModelAndView这个类就是存放跳转后的url,以及要加载的数据。实战后,我想说,大家一定要注意ModelAndView类引包问题,我们使用的是Spring.servlet包,具体的我没记不清楚,但确实我多次错入这个误区,而且这个bug很难找,所以希望后来者小心,细心,多心。

还有一点我觉得需要记下,就是我们以前采用struts+hibernate+spring框架时,通常会对前台页面做伪静态化处理,这样做的好处在提高网站速度,方便搜索引擎优化调用,再个就是网站稳定性得到提升。之前ssh框架就用了urlrewrite框架做伪静态化处理,现在我们其实就不用这个技术来做,springMVC运行后,除第一次编译需要花费时间,剩下就会生成静态化。还有我们网站经常喜欢隐藏自己所用的技术,我们也经常看到网站大部分页面都是html结尾,这个我们就可以用框架来做,将类似action动作用html来代替,就是我们每个action都是以html结尾。

最后,每一个框架的重用都是对项目完善的分析,以及开源背后的强大,对于开发者,熟悉框架的最好方法就是边用边学习,不停的coding,从调试中就会学到框架带出来的快乐和忧愁,好,今天就这样。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。