Spring 的 MVC(1)

一些 tips:

  • 如果一个对象在设置完了 property 以后需要初始化调用某个方法,可以使用 init-method;如果喜欢用 annotation 可以用 PostConstruct 和 PreDestroy
  • 如果一个对象是通过(另)一个类或者 bean 的方法生成的,可以使用:前者 class 指定 class = 类和 factory-method;后者使用 factory-bean 和 factory-method。

前面学习了一些 spring 的常见用法,这里 follow 它的文档和 Spring in Action 一书的 logic,简单的介绍一下 Spring 对 MVC 的支持。

首先我们简单的回顾一下 django 里面的 MVC:数据作为 model 通过一些 declaration 做的 ORM,view 是如何渲染 web pages 这一般需要某种 templating 的支持,而 controller 是接受一个 request 返回一个 response,实现中间的 logic。

在 spring 的 MVC 模型里面,主要的逻辑是通过 controller 串起来,接受请求的第一个 controller 是DispatcherServlet,它负责将请求分发到后面的 controller 里面,设计良好的 controller 都是管理自己那一小部分的任务,然后将请求传递给后面的 controller 的。controller 需要的数据从 model 这部分获得,最后的 controller 将数据和 view 的名字放在一起返回给 DispatcherServlet,然后后者进行对数据的渲染,渲染的手段比较常见的就是 JSP 这种嵌在 HTML 的模板语言。因此我们可以看出,如果使用 Spring 的 MVC 我们至少需要一个 DispatcherServlet,这其实是下图中的 front controller

Spring MVC

spring MVC 的起点是 web.xml,这里面通常会对 DispatcherServlet 进行初步的配置,某些配置也可以通过特定的类来实现,那么一般这些对象都会在这里初始化。同时也可以进行 URL 的映射。下面是一个来自手册上的例子

<web-app>

    <servlet>
        <servlet-name>golfing</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>golfing</servlet-name>
        <url-pattern>/golfing/*</url-pattern>
    </servlet-mapping>

</web-app>

比较有用的是一些 resolver,通过他们我们可以简化某些事情,比如通过 ModelAndView 选择某个 jsp 之类的文件进行 rendering 的时候就不必写完整的路径。

我们需要让 spring MVC 知道某个 request 怎么到我们实现的那些 controller 里面去,将什么 URL 地址调用什么方法,嗯,现在熟知的做法就是通过 annotation 将这些信息注入到代码里面。spring 的好处就在于我们可以利用其 IoC 将不少 model 的东西嵌入到 controller,这样 controller 可以集中注意力在实现逻辑上,而忘掉这些 model 和 view 相关的东西。controller 返回的类型比较丰富,可以根据不同的需要来选择,参见这里

其实另外的两部分 model 和 view 都是现成的,hibernate 可以提供很好的 model 而 view 通过 jsp 就能搞定了。

实践

有了以上理论,我们需要进行一些初步的实验,为此我们需要一个服务器,能够产生一个 deploy 到该服务器上的 war,hmm 那么开始。debian 上现在又 tomcat7,安装即可。研究了一下似乎不适合用户身份启动服务器作罢,个么就当 root 来执行好了,似乎会切换到 tomcat 用户下,不过 anyway,先这样处理。之后得配置 tomcat,其实改动不是很大,到 /etc/tomcat7/tomcat-users.xml 里面加入一些 role 和 user,下面是我的简单配置:

 <role rolename="manager"/>
  <role rolename="admin"/>
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <user username="admin" password="mypass" roles="manager,admin,manager-gui,manager-script"/>

之后重启 tomcat 服务器,你就应该能到浏览器里面访问 127.0.0.1:8080/manager 了。之后需要为 maven 配置一下服务器访问需要的密码,用户的配置文件在 ~/.m2/settings.xml,如果没有的话,可以去 /etc/maven 里面把系统的 copy 过来,这个文件当然很 powerful 了,比如你可以把一些默认的东西都塞进去(我比较常用 assembly,估计后面就放这里了),在 servers 那个 section 加入需要的东西,比如下面的

    <server>
      <id>localTomcat</id>
      <username>admin</username>
      <password>mypass</password>
    </server>

这样访问 localTomcat 的时候就会使用以上用户名和密码,下面就是需要创建一个合适的 archetype,我在 maven 的 repository 里面找了个,

mvn archetype:generate -DarchetypeGroupId=co.ntier -DarchetypeArtifactId=spring-mvc-archetype \
-DarchetypeVersion=1.0.2 -DgroupId=sandbox.demo -DartifactId=test-spring-mvc

这样你就获得了一个非常简单的 archetype 供我们学习 spring MVC。下面是目录结构

.
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── sandbox
│       │       └── demo
│       │           ├── config
│       │           │   └── MvcConfiguration.java
│       │           └── controller
│       │               └── HomeController.java
│       └── webapp
│           ├── resources
│           │   └── style.css
│           └── WEB-INF
│               ├── views
│               │   └── home.jsp
│               └── web.xml

我们首先需要添加一些配置到 pom.xml,这样我们才能 deploy 到 tomcat 上

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>tomcat-maven-plugin</artifactId>
        <configuration>
  	  <url>http://127.0.0.1:8080/manager/text</url>
  	  <server>localTomcat</server>
  	  <path>/sandbox</path>
        </configuration>
      </plugin>

这个 plugin 能帮助我们进行 deploy,不少 link 上写的 url 都是 manager 在我这里似乎不 work。Okay,现在你就可以运行 mvn package tomcat:deploy 了,之后通过 http://127.0.0.1:8080/sandbox/ 就能看到 hello world 了。其他一些简单的操作如 redeploy、undeploy 可以帮助你在更新了 war 之后重新发布什么的。hmm…

——————
And Isaac’s servants digged in the valley, and found there a well of springing water.

Advertisements
Spring 的 MVC(1)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s