zoukankan      html  css  js  c++  java
  • spring MVC学习之二

    什么是Spring MVC

      Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。

      今天先从写一个Spring MVC的HelloWorld开始,让我们看看如何搭建起一个Spring mvc的环境并运行程序。

    软件参数

      Eclipse:Mars.1 Release (4.5.1)

      Tomcat: 8.0.36

      JDK:1.8.0_60

      Spring-framework: 4.0.4.RELEASE

    新建项目

      File-New-Other,选择Dynamic web project

      项目建好之后,目录结构如下:

    导入jar包

      我们基于Spring mvc框架进行开发,需要依赖一下的spring jar包:

    • spring-aop-4.0.4.RELEASE.jar
    • spring-beans-4.0.4.RELEASE.jar
    • spring-context-4.0.4.RELEASE.jar
    • spring-core-4.0.4.RELEASE.jar
    • spring-expression-4.0.4.RELEASE.jar
    • spring-web-4.0.4.RELEASE.jar
    • spring-webmvc-4.0.4.RELEASE.jar
    • commons-logging-1.1.1.jar(用来打印log)

      在WEB-INF目录下新建lib文件夹,并将上面的jar包放入其中。

      jar包可以点击这里下载。

    配置文件及编写代码

      web.xml(WEB-INF下)

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://java.sun.com/xml/ns/javaee"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     5     id="WebApp_ID" version="2.5">
     6     
     7     <!-- 配置DispatchcerServlet -->
     8     <servlet>
     9         <servlet-name>springDispatcherServlet</servlet-name>
    10         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    11         <!-- 配置Spring mvc下的配置文件的位置和名称 -->
    12         <init-param>
    13             <param-name>contextConfigLocation</param-name>
    14             <param-value>classpath:springmvc.xml</param-value>
    15         </init-param>
    16         <load-on-startup>1</load-on-startup>
    17     </servlet>
    18     
    19     <servlet-mapping>
    20         <servlet-name>springDispatcherServlet</servlet-name>
    21         <url-pattern>/</url-pattern>
    22     </servlet-mapping>
    23     
    24 </web-app>
    复制代码

    注意:1. line12-15用于配置spring mvc的配置文件的位置和名称,这里说明会新建一个springmvc.xml的配置文件

       2. 我们也可以不新建springmvc.xml,而是用默认的,默认的配置文件格式为/WEB-INF/[servlet-name]-servlet.xml,对应这里的就是springDispatcherServlet-servlet.xml

       3. 这里的servlet-mapping表示拦截的模式,这里是“/”,表示对于所有的请求的拦截,包括静态资源如html, js, jpg等。这时候对于静态资源的访问就会报404的错误。关于如何解决后面会介绍

      Springmvc.xml(scr下)

      在src目录下新建springmvc.xml

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:context="http://www.springframework.org/schema/context"
     5     xmlns:mvc="http://www.springframework.org/schema/mvc"
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
     8         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
     9         
    10         
    11         <!-- 配置自动扫描的包 -->
    12         <context:component-scan base-package="com.jackie.springmvc"></context:component-scan>
    13         
    14         <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
    15         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    16             <property name = "prefix" value="/WEB-INF/views/"></property>
    17             <property name = "suffix" value = ".jsp"></property>
    18         </bean>
    19 </beans>
    复制代码

    注意:1. line12表示spring监听的范围,这里是在com.jackie.springmvc下

       2. line15-18,是添加了一个视图解析器,用于把在控制器中handler的结构解析为实际的物理视图,这个要配合controller类来解析,详见下面。

      HelloWorld.java(com.jackie.springmvc.handlers下)

    复制代码
     1 package com.jackie.springmvc.handlers;
     2 
     3 import org.springframework.stereotype.Controller;
     4 import org.springframework.web.bind.annotation.RequestMapping;
     5 
     6 @Controller
     7 public class HelloWorld {
     8 
     9     /**
    10      * 1. 使用RequestMapping注解来映射请求的URL
    11      * 2. 返回值会通过视图解析器解析为实际的物理视图, 对于InternalResourceViewResolver视图解析器,会做如下解析
    12      * 通过prefix+returnVal+suffix 这样的方式得到实际的物理视图,然后会转发操作
    13      * "/WEB-INF/views/success.jsp"
    14      * @return
    15      */
    16     @RequestMapping("/helloworld")
    17     public String hello(){
    18         System.out.println("hello world");
    19         return "success";
    20     }
    21 }
    复制代码

    注意:1. 首先要在类的前面添加“Controller”注解,表示是spring的控制器,这里会写一个方法hello()

       2. hello方法上方有一个@RequestMapping, 是用于匹配请求的路径,比如这里匹配的请求路径就是“http://localhost:8080/springTest/springmvc/helloworld”,即当tomcat服务启动后,在浏览器输入这个url时,如果在这个方法打断点了,就会跳入该方法。

       3. 这个return的结果不是乱写的,这个返回的字符串就是与上面springmvc.xml中line15-18进行配合的,springmvc.xml中声明了prefix和suffix,而夹在这两者之间的就是这里返回的字符串,所以执行完这个方法后,我们可以得到这样的请求资源路径“/WEB-INF/views/success.jsp”,这个success.jsp是需要我们新建的

      index.jsp(WebContent下)

      在新建success.jsp之前,我们需要有一个入口,也就是这里的index.jsp

    复制代码
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10 
    11 <a href="helloworld">hello world</a>
    12 
    13 </body>
    14 </html>
    复制代码

      当访问index.jsp时,页面上会展示一个超链接,点击超链后,url中的地址就会发生跳转,由“http://localhost:8080/springTest/index.jsp”跳转到“http://localhost:8080/springTest/helloworld”,而这个url请求就会进入HelloWorld中的hello方法,因为其与该方法上的“/helloworld”匹配。

      success.jsp(WEB-INF/views下)

      该页面是作为请求成功后的相应页面

    复制代码
     1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
     2     pageEncoding="ISO-8859-1"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10 
    11 <h4>Success Page</h4>
    12 
    13 </body>
    14 </html>
    复制代码

    至此,我们完成了基于Spring mvc框架的HelloWorld程序的开发,包括要依赖的jar包,配置的文件,控制器代码的编写和展示页面的编写等。

    除此以外,再介绍下整个配置过程中遇到的一些小问题:

    1. tomcat服务器的添加

      从前面的介绍可以看出,我们的程序是通过浏览器发请求来获取想要的页面,那么这里就免不了要有一个web服务器,这里就是tomcat。

      首先你需要下载个tomcat,然后在eclipse->windows->preference->servers中绑定这个tomcat服务器;

      其次你需要在你新建的spring mvc项目中添加tomcat的支持,否则在新建的jsp文件中会提示报错“The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path”

      右键项目->build path->configure build path->add library->server runtime, 选择你的tomcat即可

      有了tomcat服务器,你就可以在index.jsp上右键run on server,选择你的tomcat服务器,这样就可以启动tomcat服务,帮助你完成网页的请求和响应操作。

    2. spring mvc如何访问静态资源

      关于使用spring mvc处理静态资源,比如html(发现之前的springmvc.xml中<property name = "suffix" value = ".jsp"></property>定义为jsp结尾就可以成功跳转,但是如果改为html并在web-inf下面新建了html文件后,并将suffix这里的".jsp"改为".html",无法跳转到想要的html页面,并且给出404错误,同时console给出错误信息为:No mapping found for HTTP request with URI [/springTest/WEB-INF/views/result.html] in DispatcherServ)

      最后发现是需要让spring明确要处理静态资源,原来的web.xml中只有

    1 <servlet-mapping>
    2     <servlet-name>springDispatcherServlet</servlet-name>
    3     <url-pattern>/</url-pattern>
    4 </servlet-mapping>

      其匹配的都是controller中类似@RequestMapping("/springmvc/helloworld")这样的注解配置的请求,而对于类似html/css/jpg等资源的访问就会得不到,所以需要在web.xml中加入以下类型的支持

    复制代码
     1 <servlet-mapping>
     2      <servlet-name>default</servlet-name>
     3      <url-pattern>*.css</url-pattern>
     4 </servlet-mapping>
     5 
     6 <servlet-mapping>
     7       <servlet-name>default</servlet-name>
     8       <url-pattern>*.gif</url-pattern>
     9 </servlet-mapping>
    10 
    11 <servlet-mapping>
    12     <servlet-name>default</servlet-name>
    13      <url-pattern>*.jpg</url-pattern>
    14 </servlet-mapping>
    15 
    16 <servlet-mapping>
    17      <servlet-name>default</servlet-name>
    18      <url-pattern>*.js</url-pattern>
    19 </servlet-mapping>
    20 
    21 <servlet-mapping>
    22       <servlet-name>default</servlet-name>
    23       <url-pattern>*.html</url-pattern>
    24 </servlet-mapping>
    复制代码

      这样就可以保证spring 能够拦截并处理静态资源

      这里将HelloWorld.java中的hello方法改为:

    @RequestMapping("/helloworld")
        public String hello(){
            System.out.println("hello world");
            return "Jackie";
    }

      Springmvc.xml改为:

    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name = "prefix" value="/WEB-INF/views/"></property>
                <property name = "suffix" value = ".jpg"></property>
    </bean>

      表示我们可以访问jpg静态图片资源了

    来自:http://www.cnblogs.com/bigdataZJ/p/springmvc1.html

  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/manmanlu/p/6428636.html
Copyright © 2011-2022 走看看