Spring MVC入门-项目搭建步骤解析

来源:互联网 发布:js 对象 key 变量 编辑:程序博客网 时间:2024/05/29 02:30


 

详细Spring MVC项目搭建过程见链接:AAAAAAAAAAAAAAAAAA

此处使用Maven项目管理工具来管理SpringMVC项目。


第一步:Maven安装和项目搭建

       详细步骤见Maven篇:http://blog.csdn.net/csdn_terence/article/details/53517287


第二步:Spring MVC项目

1、pom.xml文件配置

<!--

头部项目约束信息、属性信息

-->

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.my.mavenweb</groupId>

  <artifactId>testMavenWebDemo</artifactId>

  <packaging>war</packaging>

  <version>0.0.1-SNAPSHOT</version>

  <name>testMavenWebDemoMaven Webapp</name>

  <url>http://maven.apache.org</url>

  <!—-

第一,在属性中声明一些软件包的版本 ,原因:如果工程比较复杂庞大,则可以通过这个配置比较清晰的指导依赖包的版本,方便我们做一些其他的而处理。

-->

   <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   

    <spring.version>4.3.1.RELEASE</spring.version>

    <junit.version>3.8.1</junit.version>

  </properties>

 

  <!--

第二、依赖管理,依赖管理是MAven比较核心的东西,声明使用指定版本的包,重在声明依赖,可以不引入实际的依赖,下面要使用4.3.1版本的spring包。

 -->

  <dependencyManagement>

    <dependencies>

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-framework-bom</artifactId>

           <version>${spring.version}</version>

           <type>pom</type>

           <scope>import</scope>

       </dependency>

    </dependencies>

  </dependencyManagement>

 

  <!-->

第三,加入依赖的软件包。

-->

  <dependencies>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-webmvc</artifactId>

    </dependency>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

 

  <!--  

第四,加入插件,用Jetty容器来测试部署项目。

 -->

  <build>

    <finalName>testMavenWebDemo</finalName>

    <plugins>

        <plugin>

           <groupId>org.eclipse.jetty</groupId>

           <artifactId>jetty-maven-plugin</artifactId>

           <version>9.2.2.v20140723</version>

            <executions>

               <!--  在打包成功后使用jettyrun来运行jetty服务-->

               <execution>

                    <phase>package</phase>

                    <goals>

                         <goal>run</goal>

                    </goals>

                </execution>

            </executions>

        </plugin>

    </plugins>

  </build>

</project>

2、web.xml文件配置

 

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appversion="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:web="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 

<!-- 自动生成的DocType默认使用webApp2.3的标准,会自动关闭EL表达式语言,所以此处不使用这个语言统一替换成版本2.4,默认支持EL -->

<!--  

第一 首先,载入spring MVC的监听器ContextLoaderListener,监听器中含有contextLoader,可以加载spring框架的包。作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。

然后,载入Spring MVC上下文配置文件applicationContext.xml,指定其路径,如果不指定,则默认在/WEB-INF/的根目录下。

 -->

 

    <display-name>ArchetypeCreated Web Application</display-name>

    <!--Spring应用上下文,理解层次化的ApplicationContext -->

    <context-param>

       <param-name>contextConfigLocation</param-name>

       <param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>

    </context-param>

    <listener>

       <listener-class>

           org.springframework.web.context.ContextLoaderListener

       </listener-class>

    </listener>

  

    <!--

第二DispatcherServlet是一种前端控制器,加载DispatcherServlet类,并配置指定其相应的DispatcherServlet.xml文件路径。

            DispatcherServlet 是Spring MVC的核心----前端控制器,用于Spring MVC的集中访问,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 

             DispatcherServlet主要担任职责调度工作,本身主要用于控制流程,职责如下:

            1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

            2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

            3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

            4、通过ViewResolver解析逻辑视图名到具体视图实现;

            5、本地化解析;

            6、渲染具体的视图等;

            7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

 

 -->

    <servlet>

       <servlet-name>mvc-dispatcher</servlet-name>

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

       <!--默认为/WEB-INF/$servlet-name$-servlet.xml,下面语句改变了该默认参数 -->

       <init-param>

           <param-name>contextConfigLocation</param-name>

           <param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>

       </init-param>

       <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

       <servlet-name>mvc-dispatcher</servlet-name>

       <!-- 表示mvc-dispatcher拦截所有请求 -->

       <url-pattern>/</url-pattern>

    </servlet-mapping>

</web-app>

 

3、applicationContext.xml文件配置

applicationContext是Spring 上下文相关的一个配置文件,此文件组成了整个应用中通用组件共同使用的bean管理,继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问、事件传播等方面进行了良好的支持。

其中,applicationContext的加载实现由两种方式,分别是ContextLoaderListener和ContextLoaderServlet。

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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.xsd

                 http://www.springframework.org/schema/context

                 http://www.springframework.org/schema/context/spring-context.xsd

                 http://www.springframework.org/schema/mvc

                 http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--启动基于AnnotationDI管理 -->

    <context:annotation-config/>

    <context:component-scanbase-package="com.terence.mvcdemo">

       <context:exclude-filtertype="annotation"

       expression="org.springframework.stereotype.Controller"/>

    </context:component-scan>

</beans>


4、DispatcherServlet.xml文件配置

 <?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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.xsd

                  http://www.springframework.org/schema/context

                  http://www.springframework.org/schema/context/spring-context.xsd

                  http://www.springframework.org/schema/mvc

                  http://www.springframework.org/schema/mvc/spring-mvc.xsd">

 

    <!-- 名称为mvc-dispatcherDispatcherServlet提供的Spring MVC配置。  

第一,利用annotationContext激活对标签生命周期的管理 ,方便识别标签配置的beans的声明 。用于激活@Required @Autowired,JSR 250's @PostConstruct @PreDestory and @Resource等标注

附:启动基于Annotation的DI管理

-->

    <context:annotation-config/>

 

    <!--

第二,是请求和控制区发生联系 DispatcherServlet上下文,只搜索@Controller标注的类 不搜索其他标注的类。

 -->

    <context:component-scanbase-package="com.terence.mvcdemo">

       <context:include-filtertype="annotation"

       expression="org.springframework.stereotype.Controller"/>

    </context:component-scan>

   

<!--

HandleMapping无需配置,SpringMVC可以默认启动下面的类,解析一些基于注解的AnnotationMappingDefaultAnnotationHandlerMapping

       annotation-drivenHandlerMapping

-->

<!--

第三,扩充注解驱动,可以将请求参数绑定到控制器参数,将URL中的参数直接映射到Controller注解中某个方法的参数,功能强大快捷。

 -->

    <mvc:annotation-driven/>

    <!-- 静态资源配置,对一些文件用到的图片等资源路径的映射配置 -->

    <mvc:resourcesmapping="/resources/**"location="/resources/"/>

 

<!--

第四,配置ViewResolver告诉DispatcherServlet应该用哪个View ,使用了JSTlView,前缀prefix和后缀suffix来配置

附:可以配置多个ViewRsolver,但是要使用order属性排序,并且必定要将InternalResolver放在最后,因为它最后会返回一个对象。

-->

    <beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 

    <beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 

    <propertyname="messageConverters"> 

        <list> 

            <beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 

              

                <propertyname="supportedMediaTypes"> 

                   <list> 

                       <value>text/html;charset=UTF-8</value> 

                       <value>application/json;charset=UTF-8</value> 

                   </list> 

                </property> 

            </bean> 

        </list> 

    </property> 

</bean>

    <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <propertyname="viewClass"

           value="org.springframework.web.servlet.view.JstlView"/>

       <propertyname="prefix"value="/WEB-INF/jsps/"/>

       <propertyname="suffix"value=".jsp"/>

    </bean>

</beans>

微笑

5、控制层Controller

@Controller   

@RequestMapping("/courses")

public class CourseController {

    private static Logger log=LoggerFactory.getLogger(CourseController.class);

    private CourseServicecourseService;

   

    @Autowired

    public void setCourseService(CourseService courseService)

    {

        this.courseService=courseService;

    }

 

    @RequestMapping(value="/view",method=RequestMethod.GET)            

    public String viewCourse(@RequestParam("courseId") Integer courseId,Model model)    {

        Course course=courseService.getCourseById(courseId);

        model.addAttribute(course);

        System.out.println(courseId);

        return"course_overview";

    }

解释

l        @Controller,通知上下文,声明这个类是一个Controller,用于访问控制使用,标识Controller注解之后会被Spring的DispatcherServlet的上下文所管理,并且完成依赖注入。

l        @RequestMapping(“/courses”),通过类级别的annotation映射注解 标明应该反映哪种类型的url,然后再映射到类中的方法上。该映射处理根目录url下的所有/courses/**,此类url都将被拦截。

l        @Autowired,声明自动执行,可对成员变量、方法和构造函数进行标注,来完成自动装配的工作。

l        @RequestMapping(value="/view",method=RequestMethod.GET),业务方法,提供一个根据标识查询内容的业务逻辑,通过注解Annotation,映射到类中的方法上,配合映射的类完成请求。

l        该声明方法将处理 http://localhost:8080/courses/view?courseId=123类型的请求。

l         public String viewCourse(@RequestParam("courseId") Integer courseId,Model model)    {   }

       @RequestParam(“courseId”),用于将路参courseId绑定给方法中的形参courseId,其中Model是SpringMVC特有的类型,可装载包装返回的对象。

 

6、服务层Service

 

1、@Service 告知上下文,声明一个服务的接口

 

@Service

public interface CourseService {

   Course getCourseById(IntegercouseId);

}

 

2、写一个实现该接口的服务类,并声明告知spring这是一个服务类。

@Service("courseService")

public class CourseServiceImpl implements CourseService {

    public Course getCourseById(Integer courseId)

    {

        Course course=new Course();

        course.setCourseId(courseId);

        course.setTitle("Java多线程");

        course.setImgPath("resources/imgs/course-img.jpg");

        course.setLearningNum(23568);

        course.setLevel(2);

        course.setLevelDesc("中级");

        course.setDuration(7200l);

        course.setDescr("多线程是日常开发中的常用知识,也是难用知识,一定要掌握好。");

       

        List<Chapter>chapterList=new ArrayList<Chapter>();

        wrapChapterList(courseId,chapterList);

        course.setChapterList(chapterList);

        return course;

    }

    public void wrapChapterList(Integer courseId,List<Chapter>chapterList)

    {

        Chapter chapter=new Chapter();

        chapter.setId(1);

        chapter.setCourseId(courseId);

        chapter.setOrder(2);

        chapter.setTitle("1 Java多线程背景应用");

        chapter.setDescr("主要介绍一下Java多线程的背景应用,了解背景知识,可以更好的应用的相应的场景中。");

        chapterList.add(chapter);

       

        Chapter chapter1=new Chapter();

        chapter1.setId(1);

        chapter1.setCourseId(courseId);

        chapter1.setOrder(2);

        chapter1.setTitle("2 Java线程初体验");

        chapter1.setDescr("Java语言层面对线程的支持,如何创建,启动和停止线程。如何使用常用的线程方法。用隋唐演义作为实例进行解说。");

        chapterList.add(chapter1);     

    }

}

 

参考代码

Reference Demo: testMavenDemo



0 0
原创粉丝点击