SpringMVC入门学习

入门学习

前几天照着教程似懂非懂地搭建起一个简单的SpringMVC实例,现在是时候做一个入门学习,了解一下SpringMVC流程及工作细节。

框架介绍

SpringMVC是围绕一个DispatcherServlet 来设计的,这个Servlet会把请求分发给各个Controller,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传,总结起来就是功能挺强,有不少优点:

  • 清晰的职责分离。每个角色——控制器,验证器,命令对象,表单对象,模型对象, DispatcherServlet ,处理器映射,视图解析器,等等许多的工作,都可以由相应的对象来完成。

  • 强大、直观的框架和应用bean的配置。这种配置能力包括能够从不同的上下文中进行简单的引用,比如在web控制器中引用业务对象、验证器等。

  • 强大的适配能力、非侵入性和灵活性。SpringMVC支持你定义任意的控制器方法签名,在特定的场景下你还可以添加适合的注解(比
    如 @RequestParam 、 @RequestHeader 、 @PathVariable 等)

  • 可复用的业务代码,使你远离重复代码。你可以使用已有的业务对象作为命令对象或表单对象,而不需让它们去继承一个框架提供的什么基类。

  • 可定制的数据绑定和验证。类型不匹配仅被认为是应用级别的验证错误,错误值、本地化日期、数字绑定等会被保存。你不需要再在表单对象使用全String字段,然后再手动将它们转换成业务对象。

  • 可定制的处理器映射和视图解析。处理器映射和视图解析策略从简单的基于URL配置,到精细专用的解析策略,Spring全都支持。在这一点上,Spring比一些依赖于特定技术的web框架要更加灵活。

  • 灵活的模型传递。Spring使用一个名称/值对的Map来做模型,这使得模型很容易集成、传递给任何类型的视图技术。

  • 可定制的本地化信息、时区和主题解析。支持用/不用Spring标签库的JSP技术,支持JSTL,支持无需额外配置的Velocity模板,等等。

  • 一个简单但功能强大的JSP标签库,通常称为Spring标签库,它提供了诸如数据绑定、主题支持等一些特性的支持。这些定制的标签为标记(markup)你的代码提供了最大程度的灵活性。

  • 新增生命周期仅绑定到当前HTTP请求或HTTP会话的Bean类型。严格来说,这不是Spring MVC自身的特性,而是Spring MVC使用的上下文容器 WebApplicationContext 所提供的特性。这些bean的scope在6.5.4 请求、会话及全局会话scope一节有详细描述。

以Dispatcher为核心

Dispatcher 其本质是一个Servlet,采用前端控制器设计模式。SpringMVC 中Dispatcher处理请求的工作流如下:

Dispatcher工作流

既然是Servlet,其主要工作就是配置bean、初始化对象等(web.xml, [name]-servlet.xml)


很多资料上都是先实现Controller,毕竟框架中业务处理工作主要集中在此。可是本人总是喜欢按照用户使用的业务流程来进行框架的使用,所以很奇葩的开发流程出现了(项目配置xml–>数据bean封装–>前端页面–>Controller实现–>配置交付映射)

View解析

视图解析器 ViewResolver 负责处理视图名与实际视图之间的映射关系。视图接口 View 负责准备请求,并将请求的渲染交给某种具体的视图技术实现。

视图解析器

举一个简单的例子

<bean id="viewResolver" 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>

视图链

结合例子简单了解一下:

<!-- InternalResourceViewResolver 默认被放置在视图解析链的最后-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <!--根据URL解析视图名-->
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
</bean>

<!--根据指定配置文件使用视图解析器-->
<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
  <!--order属性指定了解析器的次序 order值越大越靠后-->
  <property name="order" value="1"/>
  <property name="location" value="/WEB-INF/views.xml"/>
</bean>

<!-- in views.xml 指定使用Excel视图-->
<beans>
  <bean name="report" class="org.springframework.example.ReportExcelView"/>
</beans>

控制器

控制器的实现内容比较多,会在以后的学习过程中单独记录,特别是基于注解的编程

补充最近问题

  • css无效:

    人为错误:css文件路径错误
    通过Firebug查看css文件的请求路径确实不正确,没有工程名,在浏览器中手动修改仍然访问不到。

    框架设置问题:在springmvc-servlet.xml中,设置拦截器将所有的请求url都拦截并交由dispatcher处理,导致css、js一类文件的访问请求都被拦截掉了。所以我们使用

      <!-- location:资源存放路径 mapping:url映射至location -->
      <mvc:resources location="/css/" mapping="/css/**"/>
      <mvc:resources location="/js/" mapping="/js/**"/>

    声明静态资源位置location属性表明位置,mapping表明映射到指定文件

路径问题

由于之前css加载路径有问题,导致样式一直不显示,所以有必要对工程的目录结构进行一下确认
Maven创建的webapp工程结构

图中显而易见

  • src/main/java 路径下存放的是java代码

  • Libraries 存放各种库文件jar包

  • 特别强调webapp,这是我们工程的根目录,即浏览器中url为http://localhost:8080/springmvc

  • webapp下的WEB-INF中的文件是不能通过浏览器输入url直接访问的,所以css,js一类的资源文件打包放在webapp下,url=localhost:8080/springmvc/css/*.css

  • 加深对uri理解,解决资源访问不到的问题
    uri = path + filename,所以在写相对路径的时候不能错误地将filename也算作一层路径

eg1:
页面文件 http://localhost:8080/TheOriginals/views/register.jsp的页面中引入资源
css文件 http://localhost:8080/TheOriginals/css/jquery.min.js
相对路径 ../css/jquery.min.js

eg2:
http://localhost:8080/TheOriginals/login,其中login是action,经过Controller后解析到视图/views/main.jsp但是uri没有改变,故此时css文件的相对路径是css/main.css

猜你喜欢

转载自blog.csdn.net/baidu_22153679/article/details/78026436