SpringMVC知识点

一、SpringMVC
1.HelloWorld案例
①步骤:
加jar包
在web.xml文件中配置DispatcherServlet
加入SpringMVC的配置文件
编写处理请求的处理器,并标识为处理器
编写视图

②配置web.xml文件
DispatcherServlet
③创建控制器类,并标识出来
@Controller
handler
④在springmvc.xml文件中配置

配置视图解析器:<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

⑤访问页面
index.jsp

1.概述
①Spring为表现层提供了基于MVC设计理念的优秀的Web框架,是目前主流的MVC框架之一。
②Spring3.0之后全面超越Struts2,成为最优秀的MVC框架。
③SpringMVC通过一套MVC注解,让POJO成为处理请求的的控制器,而无需实现任何接口。
④支持REST风格的URL请求。
⑥采用了松散耦合可插拔组件结构,比其他MVC框架更具有扩展性和灵活性

2.映射请求的注解
①@RequestMapping来映射一个请求的URL,SpringMVC使用@ReuqestMapping注解控制器指定可以处理
那些URL请求,在处理器的类定义及方法定义处都可标注。
标注在方法上,方法返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver解析器,
会有如下解析:通过 prefix + returnVal + suffix,得到实际的物理视图,然后做转发操作。
如:WEB-INF/views/success.jsp
②@RequestMapping标注位置:
类定义:提供初步的请求映射信息,相对于web应用的根目录
方法定义处:提供进一步的请求映射信息,相对于类定义处的URL,若类定义处标注@RequestMapping,则方法处标注相对于web应用的根目录
③除了可以映射URL之外,还可以映射请求参数,请求方法或请求头,@RequestMapping的value、method、params、heads
分别表示请求URL、请求方法、请求参数、请求头,他们之间是“与”的关系,联合使用多个条件可以让请求映射更加精确化
④@ReuqestMapping还支持Ant的风格的URL,Ant风格资源地址支持3种匹配符
⑤@PathVariable映射URL绑定的占位符,带占位符的URL是Spring3.0之后新增的功能,该功能在SpringMVC向着REST目标
挺近发展过程中具有里程碑的意义。通过@PathVariable可以将URL中占位符绑定到控制器处理方法的入参中:URL中的{xxx}
占位符可以通过@PathVariable{“xxx”}绑定到操作方法的入参中
⑥@RequestPrarm映射请求参数,其中:
value值即为请求参数的参数名
required该参数是否必须,默认为true
defaultValue请求参数的默认值
⑦@RequestHeader绑定请求报头的属性值,请求头包含若干个属性,服务器可据此获知客户端的信息,通过@RequestHeader
即可将请求头中的属性值绑定到处理方法的入参中。
⑧@CookieValue绑定请求中的Cookie值
⑨使用POJO对象绑定请求参数值,SpringMVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值,支持级联属性

3.REST:(资源)表现层状态转化,是目前最流行的一种互联网架构,它结构清晰、符合标准、易于理解、方便扩展,所以得到越来越多的网站的应用
资源:网络上的一个实体,或者说网络上的一个具体信息,每种资源对应一个特定的URI。
表现层:把资源具体呈现出来的形式
状态转化:没发出一个请求,就代表了客户端和服务器的一次交互过程,HTTP协议是一个无状态的协议,即所有的状态都保存咋服务端,因此,客户端想要操作服务器
必须通过某种手段,让服务器发生某种“状态转化”,而这种转化是建立在表现层之上的,所以叫做表现层状态转化。
具体说,就是在HTTP协议里面,四种表示操作方式的动词:GET、POST、PUT、DELETE,它们分别对应四种基本操作
GET用来获取资源,POST用来新建资源,PUT用来更新资源、DELETE用来删除资源
示例:
/order/1 HTTP GET:得到ID为1的order
/order/1 HTTP DELETE:删除ID为1的order
/order/1 HTTP PUT:更新ID为1的order
/order HTTP POST:新增order
HiddenHttpMethodFilter:由于浏览器form表单只支持GET和POST请求,而DELETE和PUT等method并不支持,Spring3.0添加了一个过滤器,
可以将这些请求转化为标准的HTTP,使得支持GET、POST、PUT、DELETE请求。
如何使用:
①配置org.springframework.web.filter.HiddenHttpMethodFilter过滤器:把POST请求转化为DELETE或PUT请求
②需要发送POST请求
③需要在发送POST请求时,携带一个name为”_method”的隐藏域,值为DELETE或PUT
④在SpringMVC的目标方法中如何得到id值呢? 使用@PathVariable注解

4.处理模型数据ModelAndView
SpringMVC提供了几种途径输出模型数据:
①ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据
②Map及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map、java.uti.Map
处理方法返回时,Map中的数据会自动添加到模型中
③@SessionAttribute:将模型中的某个属性暂存到HttpSession中,一便多个请求之间可以共享这个属性
④@ModelAttribute:方法入参标注该注解之后,入参的对象就会放到数据模型中

二、代码
1.页面
inde.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <!-- 1.@RequestMapping标注在方法上:映射URL请求 -->
    <a href="helloworld">Hello World!</a>
    <br><br>

    <!-- 2.@RequestMapping标注在类上:提供初步的请求映射信息,相对于web应用的根目录 -->    
    <a href="springmvc/testRequestMapping">testRequestMapping</a>
    <br><br>

    <!-- 3.@RequestMapping的method属性,因为Method属性指定为POST请求,但超链接是GET请求,所以使用from表单,更改请求方式 -->    
    <form action="springmvc/testMethod" method="post">
        <input type="submit" value="Submit"/>
    </form>
    <a href="springmvc/testMethod">testMethod</a>
    <br><br>

    <!-- 4.@RequestMapping映射请求参数和请求头,参数值age为10则,无法访问到资源,不是10则可以访问到 -->  
    <a href="springmvc/testParamsAndHeads?username=test&age=10">testParamsAndHeads age参数值不能为10</a>
    <br><br>

    <!-- 5.@RequestMapping支持Ant风格的URL -->   
    <a href="springmvc/testAntPath/123123/abc">testAntPath </a>
    <br><br>

    <!-- 6.@PathVariable注解 映射URL中的占位符到目标方法的参数-->    
    <a href="springmvc/testPathVariable/12">testPathVariable</a>
    <br><br>

    <!-- 7.REST风格的请求 -->
    <p>查找</p>
    <a href="springmvc/testRest/1">Test Rest GET</a>
    <br><br>

    <p>添加</p>
    <form action="springmvc/testRest" method="post">
        <input type="submit" value="Test Rest POST">
    </form>


    <p>删除</p>
    <form action="springmvc/testRest/1" method="post">
        <input type="hidden" name="_method" value="DELETE">
        <input type="submit" value="Test Rest DELETE">
    </form>

    <p>更新</p>
    <form action="springmvc/testRest/1" method="post">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="Test Rest PUT">
    </form>

    <!-- 8.RequestParam -->
    <a href="springmvc/testRequestParam?username=test&age=22">Test RquestParam</a>
    <br><br>

    <!-- 9.@RequestHeader -->
    <a href="springmvc/testRequestHeader">Test RequestHeader</a>
    <br><br>

    <!-- 10.@CookieValue绑定请求中的Cookie值 -->
    <a href="springmvc/testCookieValue">Test CookieValue</a>
    <br><br>

    <!-- 11.使用POJO对象绑定请求参数值 -->
    <form action="springmvc/testPojo" method="post">
        username:<input type="text" name="username">
        <br>
        password:<input type="password" name="password">
        <br>
        Email:<input type="text" name="email">
        <br>
        age:<input type="text" name="age">
        <br>
        city:<input type="text" name="address.city">
        <br>
        province:<input type="text" name="address.province">
        <br>
        <input type="submit" value="Submit">
    </form>
    <br><br>

    <!-- 12.使用Servlet原生的API -->
    <a href="springmvc/testServletAPI">Test testServletAPI</a>
    <br><br>

    <!-- 13.处理模型数据ModelAndView -->
    <a href="springmvc/testModelAndView">Test ModelAndView</a>
    <br><br>

    <!-- 14.处理模型数据Map -->
    <a href="springmvc/testMap">Test Map</a>
    <br><br>

    <!-- 15.处理模型数据SessionAttribute -->

    <!-- 
        16.处理模型数据ModelAttribute
        模拟修改操作
        1.原始数据为1,Tom,1231,test@.com,21
        2.要求:密码不能被修改
        3.表单回显,模拟操作直接在表单填写对象的属性值
     -->
    <form action="springmvc/testModelAttribute" method="post">
        <input type="hidden" name="id" value="1"/>
        userName:<input type="text" name="username" value="Tom">
        <br><br>
        Email:<input type="text" name="email" value="test@.com">
        <br><br>
        age:<input type="text" name="age" value="21">
        <br><br>
        <input type="submit" name="Submit">             
    </form>
    <br><br>
    <!-- 17.视图解析流程 -->  
    <a href="springmvc/testViewAndViewResolver">Test ViewAndViewResolver</a>
    <br><br>

    <!-- 18.自定义视图 -->
    <a href="springmvc/testView">Test View</a>
    <br><br>

    <!-- 19.重定向 -->
    <a href="springmvc/testRedirect">Test Redirect</a>
    <br><br>


</body>
</html>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入国际化标签 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <h3>Success Page</h3>
    <br><br>

    <!-- 处理模型数据ModelAndView -->
    time:${requestScope.time}
    <br><br>

    <!-- 处理模型数据Map -->
    Names:${requestScope.names }   
    <br><br>

    <!-- 处理模型数据SessionAttribute -->
    request User:${requestScope.user } 
    <br><br>
    <!-- 处理模型数据SessionAttribute -->
    Session User:${sessionScope.user } 
    <br><br>
    <!-- 国际化 -->
    <fmt:message key="i18n.username"></fmt:message>
    <br><br>
    <fmt:message key="i18n.password"></fmt:message>
    <br><br>
</body>
</html>

2.实体类
User.java

package com.test.springmvc.entities;

public class User {

    private String id;
    private String username;
    private String password;
    private String email;
    private String age;
    private Address address;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }

    public User(String username, String password, String email, String age) {
        super();
        this.username = username;
        this.password = password;
        this.email = email;
        this.age = age;
    }

    public User(String id, String username, String password, String email,
            String age) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.age = age;
    }
    public User() {
        super();
    }
    /*@Override
    public String toString() {
        return "User [username=" + username + ", password=" + password
                + ", email=" + email + ", age=" + age + ", address=" + address
                + "]";
    }*/
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password="
                + password + ", email=" + email + ", age=" + age + "]";
    }


}

Address.java

package com.test.springmvc.entities;

public class Address {

    private String province;
    private String city;
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    @Override
    public String toString() {
        return "Address [province=" + province + ", city=" + city + "]";
    }

}

3.Handle
HelloWorld.java

package com.test.springmvc.handlers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class HelloWorld {


    /**
     * 1.应答一个请求,使用@RequestMapping来映射一个请求的URL
     * 2.返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver解析器,会有如下解析:
     *通过 prefix + returnVal + suffix,得到实际的物理视图,然后做转发操作
     *如:WEB-INF/views/success.jsp
     */
    @RequestMapping("/helloworld")
    public String hello(){
        System.out.println("你好!");
        return "success";
    }

}

SpringmvcTest.java

package com.test.springmvc.handlers;

import java.util.Arrays;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.test.springmvc.entities.User;

//@SessionAttributes({"user"})
@Controller
@RequestMapping("/springmvc")
public class SpringmvcTest {

    private static String SUCCESS = "success";

    /**
     * 1.测试@RequestMapping标注在类定义处
     * @return
     */
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){
        System.out.println("testRequestMapping");
        return SUCCESS;
    }

    /**
     * 2.常用:使用Method属性指定请求属性
     * @return
     */
    @RequestMapping(value="/testMethod", method=RequestMethod.POST)
    public String testMethod(){
        System.out.println("testMehtod");
        return SUCCESS;
    }

    /**
     * 3.了解:映射请求参数和请求头
     * @return
     */
    @RequestMapping(value="/testParamsAndHeads",
                params={"username", "age!=10"}, headers={})
    public String testParamsAndHeads(){
        System.out.println("testParamsAndHeads");
        return SUCCESS;
    }

    /***
     * 4.Ant的风格的URL,Ant风格资源地址支持3种匹配符
     * @return
     */
    @RequestMapping("testAntPath/*/abc")
    public String testAntPath(){
        System.out.println("testAntPath");
        return SUCCESS;
    }

    /**
     * 4.@PathVariable注解映射URL中的占位符到目标方法的参数
     * @param id
     * @return
     */
    @RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id){
        System.out.println("testPathVariable" + id);
        return SUCCESS;
    }

    //5.REST风格
    /**
     * GET(查找)请求
     * @param id
     * @return
     */
    @RequestMapping(value="/testRest/{id}", method=RequestMethod.GET)
    public String testRESTGET(@PathVariable Integer id){
        System.out.println("test Rest GET:" + id);
        return SUCCESS;
    }

    /**
     * POST(添加)请求
     * @return
     */
    @RequestMapping(value="/testRest", method=RequestMethod.POST)
    public String testRESTPOST(){
        System.out.println("test Rest POST");
        return SUCCESS;
    }

    /**
     * DELETE(删除)请求
     * @param id
     * @return
     */
    @RequestMapping(value="/testRest/{id}", method=RequestMethod.DELETE)
    public String testRESTDELETE(@PathVariable Integer id){
        System.out.println("test Rest DELETE:" + id);
        return SUCCESS;
    }

    /**
     * PUT(更新)请求
     * @param id
     * @return
     */
    @RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT)
    public String testRESTPUT(@PathVariable Integer id){
        System.out.println("test Rest PUT:" + id);
        return SUCCESS;
    }


    /**
     * 6.使用@RequestPrarm映射请求参数,其中:
     *  value值即为请求参数的参数名
     *  required该参数是否必须,默认为true
     *  defaultValue请求参数的默认值
     * @return
     */
    @RequestMapping(value="/testRequestParam")
    public String testRequestParam(@RequestParam(value="username") String un, 
            @RequestParam(value="age", required=false, defaultValue="0") int age){
        System.out.println("testRequestParam:" + un + ":" + age);
        return SUCCESS;
    }

    /**
     * 7.@RequestHeader绑定请求报头的属性值
     * @param al
     * @return
     */
    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value="Accept-Language") String al){
        System.out.println("testRequestHeader:Accept-Language:" + al);
        return SUCCESS;
    }

    /**
     * 8.@CookieValue绑定请求中的Cookie值
     * @return
     */
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value="JSESSIONID") String sessionId){
        System.out.println("testCookieValue:sessionID:" + sessionId);
        return SUCCESS;
    }

    /**
     * 9.使用POJO对象绑定请求参数值
     * @return
     */
    @RequestMapping("/testPojo")
    public String testPojo(User user){
        System.out.println("testPojo:" + user);
        return SUCCESS;
    }

    /**
     * 10.使用Servlet原生的API
     */
    @RequestMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request, 
            HttpServletResponse response){
        System.out.println("testServletAPI:" + request + ":" + response);
        return SUCCESS;
    }

    /**
     * 11.处理模型数据1,目标方法的返回值可以是ModelAndView类型,其中可以包含视图和模型信息
     * SpringMVC会把ModelAndView的model中的数据放入到request域对象中。
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        String viewName = SUCCESS;
        ModelAndView modelAndView = new ModelAndView(viewName);
        //添加模型数据到ModelAndView中
        modelAndView.addObject("time", new Date());

        return modelAndView;
    }

    /**
     * 12.处理模型数据2,目标方法可以添加Map类型的参数
     * @return
     */
    @RequestMapping("/testMap")
    public String testMap(Map<String, Object> map){
        map.put("names", Arrays.asList("Lili", "Tom", "Jerry"));

        return SUCCESS;
    }

    /**
     * 13.@SessionAttribute,在控制器上标注@SessionAttributes({"user"}),该注解只能放到类的上面
     * @return
     */
    @RequestMapping("/testSessionAttribute")
    public String testSessionAttribute(Map<String, Object> map){
        User user = new User("Tom", "1231", "test@qq.com", "21");
        map.put("user", user);
        return SUCCESS;
    }

    /**
     * 14.ModelAttribute
     * @param user:该参数的部分属性是从数据库中获取的,另一部分属性是form表单映射的数据
     * @return
     */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("修改:" + user);
        return SUCCESS;
    }

    /**
     * 1.有@ModelAttribute标记的方法,会在目标方法(14.testModelAttribute())执行之前被SpringMVC调用
     * 2.从数据库中取出对象
     * 3.把对象放入到Map中
     * 4.传入目标方法的参数(user),该对象的部分参数是从数据库中获取的,另一部分的属性是表单映射过来的 
     * 5.SpringMVC从Map中取出User对象,并把表单映射的参数赋值给该User对象对应的属性
     * 6.SpringMVC把上述对象传入到目标方法的参数
     *注意:在@modelAttribute修饰的方法中,放入到Map时的键需要和目标方法入参类型的第一个字母小写的字符串一致
     * @param id
     */
    @ModelAttribute
    public void getUser(@RequestParam(value="id", required=false) Integer id, Map<String, Object> map){
        System.out.println("ModelAttribute");
        if(id != null){
            //模拟从数据库库中获取对象
            User user  = new User("1", "Tom", "1231", "test@.com", "21");
            System.out.println("从数据库中获取对象");
            map.put("user", user);
        }
    }

    /**
     * 15.视图解析流程
     * 视图和视图解析器:
     *  对于返回类型为String、ModelAndView、View的处理方法,SpringMVC也会在内部将他们装配成一个ModelAndView对象
     *它包含了逻辑名和模型对象的视图,SpringMVC借助视图解析器得到最终的视图对象
     *ModelAndView——>ViewResolver——>视图对象(JSP/JSTL/PDF)
     *
     *  以国际化为例,演示视图解析
     */
    @RequestMapping("/testViewAndViewResolver")
    public String testViewAndViewResolver(){
        System.out.println("testViewAndViewResolver");
        return SUCCESS;
    }

    /**
     * 16.自定义视图
     */
    @RequestMapping("/testView")
    public String testView(){
        System.out.println("testView");
        return "helloView";
    }

    /**
     * 17.重定向,一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理,如果返回的字符串中带有forword:或
     * redirect:前缀时,SpringMVC会对他们进行特殊处理,将forword:和redirect当成指示符,其后的字符串作为URL
     * 来处理。
     */
    @RequestMapping("/testRedirect")
    public String testRedirect(){
        System.out.println("testRedirect");
        return "redirect:/index.jsp";
    }

}

4.视图类
HelloView.java

package com.test.springmvc.view;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;


/**
 * 自定义视图,注意注解@Component不能忘了
 *
 */
@Component
public class HelloView implements View{

    @Override
    public String getContentType() {
        return "text/html";
    }

    @Override
    public void render(Map<String, ?> arg0, HttpServletRequest arg1,
            HttpServletResponse arg2) throws Exception {
        arg2.getWriter().print("Hello View Time:" + new Date());
    }

}

5.配置文件
国际化
i18n_en_US.properties

i18n.username=Username
i18n.password=Password

i18n_zh_CN.properties

i18n.username=u7528u6237u540D
i18n.password=u5BC6u7801

i18n.properties

i18n.username=Username
i18n.password=Password

web.xml

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Demo18_Spring_MVC</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

<!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter:可以把POST请求转化为DELETE或PUT请求 -->
    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>       
    </filter-mapping> 

<!-- 配置DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--    
            配置DispatcherServlet的初始化参数:配置SpringMVC配置文件的名称和位置,
        实际上也可以不通过contextConfigLocation配置SpringMVC的配置文件,而使用默认的
        默认的配置文件为:/WEB-INF/<servlet-name>-servlet.xml
        -->
        <!-- <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param> -->
        <!-- 当前web应用被加载时创建 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 应答所有请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>



</web-app>

dispatcherServlet-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

<!-- 配置自动扫描的包 -->
    <context:component-scan base-package="com.test.springmvc"></context:component-scan>

<!-- 配置视图解析器,如何把handler的方法返回的值解析为实际的物理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置前缀,配置前缀时,一定要注意,不能少了第一个斜杠,它代表根目录,少了的话,会因为@RequestMapping注解到类上而出现路径问题-->
        <property name="prefix" value="/WEB-INF/views/"></property>
        <!-- 配置后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

<!-- 自定义视图,配置视图解析器:BeanNameViewResolver,使用视图的名字来解析视图,若希望下载的是一个Excel文档,
    则可以设置响应头Content-Disposition的值为attachment;filename=xxx.xls
    该配置文件中,配置了两个视图解析器,那么使用哪个呢?
    通过配置order属性,来定义视图的优先级,order的值越小,优先级越高
--> 
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="1"></property>
    </bean>

<!-- 配置国际化资源文件 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"></property>
    </bean>

<!-- 配置直接转发的页面,可以直接向相应的页面转发,而无需再经过Handler的方法。但是这种方法会导致@RequestMapping注解失效。 -->
    <mvc:view-controller path="/success" view-name="success"/>
<!-- 解决办法:在实际开发中通常会配置mvc:annotation-driven  标签 -->
    <mvc:annotation-driven></mvc:annotation-driven>

</beans>

6.用到的jar包

commons-logging-1.1.1.jar
jstl.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
standard.jar
原文地址:https://www.cnblogs.com/tengpengfei/p/10453968.html