【JavaEE】Springmvc搭建方法及example

现在介绍SSH的文章很多,但是适合自己需求的却经常找不到,这些东西呢,会了之后总会感觉别人的程序哪里哪里别扭,会之前呢就感觉很混乱,而且SSH的官方文档,至少在我看来是“会者勉强能看、不会者一片迷茫”的,最主要的是没有什么demo,也可能因为我太low了,高手勿喷,我的感觉就是根据文档呢很容易明白如果写了A就能怎么样写了B又能怎么样,但是这个A或者B到底写在哪能让程序跑起来呢,更是会者不难、难者不会。我隔了两年没有做这方面的项目,最近重新拾起来,不再用struts,用spring、spring mvc、hibernate、spring security、spring oauth2搭建网站,这篇包括下面几篇文章,我会简述我搭建最基本环境的过程并给出demo,然后再详细地讲一些配置。

在各个文章我会分别介绍,每篇都附有example,可以根据情况进行修改:

springmvc(本文)

springmvc+spring

springmvc+spring+hibernate

springmvc+spring+hibernate+spring security

springmvc+spring+hibernate+spring security+spring oauth2

 

这篇文章就来介绍springmvc环境的搭建。

1. pom.xml

首先来看都需要加入哪些包,我使用maven来管理包的依赖。

<properties>
    <spring.version>4.0.4.RELEASE</spring.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>javax.servlet.jsp.jstl-api</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
    <dependency>
        <groupId>tomcat</groupId>
        <artifactId>servlet-api</artifactId>
        <version>5.5.23</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>tomcat</groupId>
        <artifactId>jsp-api</artifactId>
        <version>5.5.23</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
</dependencies>

核心的包就是spring-webmvc,这个包导入之后会自动导入spring-core,spring-web等它的依赖包;

后面jstl、taglibs等包的导入是为了在jsp页面中使用jstl等标签;

commons-fileupload是为了文件上传的需要,本demo中没有上传文件的部分,不过哪个网站能没有上传图片呢?

hibernate-validator的导入是为了正常使用springmvc的valid,springmvc的valid只有接口没有实现,如果要使用它的功能需要导入一个实现包,导入hibernate-validator就是为了这个目的,本文的demo里面没有用到validation,所以只是为了运行基本demo,这个可以不导入;

jackson-mapper的导入是为了使用springmvc返回json的功能,对于这个功能springmvc也是只有接口没有实现,如果不导入实现包,要返回json时会返回406错误。jackson-core包会作为依赖导入。

2. web.xml

springmvc和struts的一个机制上的区别就是,struts是一层一层的拦截器在过滤,springmvc是只有一个核心的Servlet,所以首先按照正常注册Servlet的方法,在web.xml中注册这个springmvc:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    metadata-complete="true" version="3.0">
    
    <servlet>
        <servlet-name>spring-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

springmvc还要做很多配置,那些配置在单独的配置文件里,这个配置文件的默认位置就是在web.xml相同目录下的<servlet-name>-servlet.xml,比如我的servlet-name配置的是spring-dispatcher,那么我的springmvc配置文件的默认位置就是web.xml同目录下的spring-dispatcher-servlet.xml。

3. spring-dispatcher-servlet.xml

下一步就是配置springmvc,编辑WEB-INF/spring-dispatcher-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <context:component-scan base-package="org.zhangfc.demo4springmvc.mvc"/>

    <mvc:annotation-driven />

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="maxUploadSize" value="2000000"/>
    </bean>

    <mvc:resources mapping="/static/**" location="/resources/"/>

    <mvc:default-servlet-handler />

</beans>

Springmvc的虚拟路径与处理函数的映射,是通过annotation来设置的,这些类都在哪个包下面,就是那个component-scan属性配置的,并设置支持annotation支持,springmvc的每一个处理函数都会返回一个String类型的变量(有的函数返回值就是String,有的返回值是一个对象,对象里有一个viewResolver需要的字符串),我这个设置就是设置一个前缀和后缀,举个例子来说,对于函数返回的这个String,比如是abc,那么需要渲染的文件就是/pages/abc.jsp。

multipartResolver是上传文件需要的配置,还是那句话,本demo中用不到,不过还是写上,哪个项目里不需要上传点东西呢。

最后一个属性,是对静态资源的映射,经过这个映射之后,要访问/static/a.png时,实际访问的就是/resources/a.png。

4. HomeController.java

下面来写一个控制器,位置在上面component-scan配置的package下,springmvc用RequestMapping的annotation来指定虚拟路径,把类这一级的和方法级的加在一起就是最终的虚拟路径,看这段代码:

@Controller
@RequestMapping("/")
public class HomeController {
    @RequestMapping("")
    public String home(){
        return "index";
    }
    
    @RequestMapping("/json")
    @ResponseBody
    public Map<String, String> json(){
        Map<String, String> result = new HashMap<String, String>();
        result.put("zhangsan", "hello");
        result.put("lisi", "world");
        result.put("wangwu", "nihao");
        return result;
    }
}

这儿类这个级别的RequestMapping的值是"/",home这个方法级别的呢值是空,两个加起来就是"/",而json这个方法的RequestMapping是"/json",所以,当访问的URL是"/"的时候,会调用home这个方法来处理,返回值是一个字符串index,还记得前面的viewResolver吗,根据那个配置,这个方法执行完成之后会渲染/pages/index.jsp,所以在WEB-INF的同级目录下创建pages目录(也就是WEB-INF的兄弟目录),再创建index.jsp,运行整个工程,访问"http://localhost:8080/demo4springmvc/"得到的就是index.jsp,因为json方法有一个@ResponseBody的annotation,它的返回值直接给客户端,所以访问"http://localhost:8080/demo4springmvc/json"得到的就是json串:

{"lisi":"world","zhangsan":"hello","wangwu":"nihao"}

源码下载

这是springmvc的最基本的demo,详细的用法,我会各个框架整合在一起之后再写。

posted @ 2014-11-14 23:29  琴剑飘零  阅读(4801)  评论(2编辑  收藏  举报