SpringMVC-个人总结

1 什么是SpringMVC?

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

Spring MVC是属于Spring 框架的WEB模块中的一个部分。

参考Spring的体系结构图

SpringMVCweb层的mvc开发框架,属于Spring框架的WEB模块中的一个部分。

2 SpringMVC的执行流程

  1. 启动服务器的时候配置在web.xml文件中的中央控制器【DispatcherServlet】被初始化完成,并且加载配置的springMVC的配置文件。
  2. 客户端浏览器发送http请求。
  3. http请求被中央控制器【DispatcherServlet】拦截,转交给url解析器解析。
  4. Url解析器解析http请求,得到具体的请求路径。
  5. Url解析器将解析得到的具体的请求路径返回给中央控制器【DispatcherServlet】。
  6. 中央控制器【DispatcherServlet】将得到的具体的请求路径转交给控制器适配器。
  7. 控制器适配器根据具体的请求路径查找与之对应的请求处理类。
  8. 请求处理类就执行具体的请求处理,得到ModelAndView对象【1.数据。2.跳转地址】,将ModelAndView对象交给控制器适配器,控制器适配器将ModelAndView对象返回给中央控制器【DispatcherServlet】。
  9. 中央控制器【DispatcherServlet】将ModelAndView对象转交给视图解析器去解析。
  10. 视图解析器解析ModelAndView对象,得到一个具体的数据显示路径,将这个具体的数据显示路径返回给中央控制器【DispatcherServlet】。
  11. 中央控制器【DispatcherServlet】得到具体的数据显示路径之后,将路径所代表的资源转换执行成一个html数据。

将转换执行后的html数据返回给客户端浏览器。

3 请求的访问路径配置

3.1 web.xml文件中DispatcherServlet配置的<url-pattern>

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

对应 http://127.0.0.1:8080/springmvc1/add

3.1.2 <url-pattern>*.do</url-pattern>

对应  http://127.0.0.1:8080/springmvc1/add.do

3.1.3 <url-pattern>/*</url-pattern>  这是一个错误的方式

 

3.2 springmvc配置文件中的控制器的name属性值

控制器的name属性值设置要与web.xml文件中DispatcherServlet配置的<url-pattern>

的配置形式一致

3.2.1 web.xml文件中DispatcherServlet配置的<url-pattern>/</url-pattern>那么springmvc配置文件中的控制器的name属性值应该为“/xxxx”

3.2.2 web.xml文件中DispatcherServlet配置的<url-pattern>*.do</url-pattern>那么springmvc配置文件中的控制器的name属性值应该为“/xxxx.do”

以后控制器的name属性值会被@RequestMapper注解的value属性代替

4 ModelAndView类

4.1 请求处理方法的返回值是ModelAndView类

4.2 组成ModelAndView类的第一部分是一个Model【模型】封装数据

第二部分是一个View【视图】展示数据的页面元素

4.3 ModelAndView类是用来封装数据,展示数据的页面元素。

4.4 构造方法ModelAndView()来创建ModelAndView类的对象

ModelAndView  mav=new ModelAndView();

4.5 封装数据的方法addObject(attributeName, attributeValue)相当于setAttribute(key,value)

mav.addObject("username","zhangsan");

4.6 设置展示数据的页面元素的名称setViewName(viewName)

mav.setViewName("test");

mav.setViewName("test.jsp");

mav.setViewName("test.html");

mav.setViewName("控制器对应的请求处理路径");

mav.setViewName("test");---forword跳转[转发]

mav.setViewName("forward:test.jsp");

mav.setViewName("redirect:test.jsp");----sendRedirect跳转[重定向]

5 视图解析器

InternalResourceViewResolver------解析展示数据的页面元素

<!-- 视图解析器 -->
<!-- 利用请求处理类中的得到的视图名,通过视图解析器的前缀和后缀合并得到一个完整的页面元素的访问路径。 -->
	 <!-- prefix+视图名称+suffix : 完整的页面元素的访问路径 -->
	 <!-- prefix==http://localhost:8080/demo1/ -->
	 <!-- 视图名称:ModelAndView中setViewName("test")的参数test -->
	 <!-- suffix:后缀[.jsp] -->
	 <!-- http://localhost:8080/demo1/test.jsp -->
	 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	 	<property name="prefix" value="/"></property>
	 	<property name="suffix"  value=""></property>
	 </bean>

6 DispatcherServlet中央处理器设置加载SpringMVC配置文件的设置

我们在启动程序的时候需要加载SpringMVC配置文件,此时这个SpringMVC配置文件的位置可能有所不同,SpringMVC配置文件在不同的位置是DispatcherServlet中央处理器如何配置SpringMVC配置文件的位置。

6.1 通过init-param元素配置加载SpringMVC配置文件

6.2 SpringMVC配置文件在src/main/resources文件夹下的时候:

src/main/resources----->springmvcconfig.xml

<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvcconfig.xml</param-value>
</init-param>

6.3 SpringMVC配置文件在WEB-INF文件夹下的时候:

src/main/webapp/WEB-INF----->springmvcconfig.xml

<init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/myspringmvc.xml</param-value>
</init-param>

6.4 如果我们不在web.xml文件中配置init-param元素配置加载SpringMVC配置文件

  1. 将SpringMVC配置文件放放置在WEB-INF文件夹下
  2. SpringMVC配置文件,名称“<servlet-name>-servlet.xml”

   例如:myspringmvc-servlet.xml

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

SpringMVC配置文件

  src/main/webapp/WEB-INF-------[springmvc-servlet.xml]

注意:通常情况下我们把SpringMVC配置文件/资源文件【jsp/html】放置在WEB-INF文件夹

 

7 @Controller/@RequestMapping/@Service/@RestController/@Component/@Autowired/@Resource/@RequestBody/

@ResponseBody

1.@Controller---表示我们所编写的java类是一个处理请求的控制器类。

              只能作用在java类。

              可以使用@Component去代替,在javaweb程序中是分层出来的为了表名java类是一个控制器,我们才使用@Controller

 

2.@RequestMapping--设置控制器类/请求处理方法的访问路径的。

可以作用在java类,表示配置这个java类的访问路径;

package com.click369.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/hello")
public class HelloController {

       @RequestMapping("/testHello.do")
       public ModelAndView testHello(){
        System.out.println("处理具体请求的方法");
        ModelAndView  modelAndView=new ModelAndView();
        modelAndView.addObject("username","zhangsan");
        modelAndView.setViewName("test.jsp");
        return  modelAndView;
    }
}

Url --  http://127.0.0.1:8080/hello/testHello.do

如果控制器类中没有@RequestMapping("/hello")

Url -- http://127.0.0.1:8080/testHello.do

也可以作用在请求处理方法上,表示配置这个请求处理方法的访问路径。

package com.click369.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
	@RequestMapping("/hello.do")
	public  ModelAndView  sayHello(){
		ModelAndView mav=new ModelAndView();
		mav.addObject("test","hello");
		mav.setViewName("test.jsp");
		return mav;
	}
}

访问路径:http://localhost:8080/hello.do

@RequestMapping--设置控制器类/请求处理方法的访问路径的

@Controller

@RequestMapping("/test")

public class TestHandler{

@RequestMapping("/hello.test")

public ModelAndView handleRequest() throws Exception {

               System.out.println("处理用户请求1111111111..............");

               return null;

       }

}

访问路径:http://localhost:8080/test/hello.test

@RequestMapping的属性

1.value表示设置访问路径[可以省略]  @RequestMapping(value="/test")/@RequestMapping("/test")

     设置访问路径的时候可以设置通配符

      ? : 匹配任何单字符

例如:@RequestMapping("/?hello.test")

8 请求处理方法接收请求参数值

1.@PathVariable 定义在方法上获取请求url路径上的参数数据

http请求:http://localhost:8080/mvc/user/login/zhangsan/123456

请求参数:/zhangsan/123456

package com.click369.springmvc.handler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value="/user")
public class UserHandler {
    //处理注册请求的方法
	@RequestMapping(value="/register1/{username}/{mypass}",method=RequestMethod.GET)
	public  ModelAndView  registerMethod1(@PathVariable("username")String name,
			@PathVariable("mypass")String pass)throws Exception{
		System.out.println("name=="+name);
		System.out.println("pass=="+pass);
		ModelAndView  mav=new ModelAndView();
		mav.addObject("myname",name);
		mav.addObject("mypass",pass);
		mav.setViewName("test");
		return mav;
	}
}

测试:http://localhost:8080/mvc/user/register1/zhangsan/123456

 

 

2.@RequestParam  定义在方法上,获取请求中通过key=value方式传递的参数数据

http请求:http://localhost:8080/test/my?name=zhangsan&password=123456

请求参数:name=zhangsan&password=123456

请求处理方法:

registerMethod2(@RequestParam("username")String name,

@RequestParam("password")String pass)

 

格式:@RequestParam("form表单中input元素的name属性值")String 形式参数

说明:通过@RequestParam将form表单中input元素的name属性值得到赋值给形式参数,然后在请求处理方法中使用这形式参数

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<h2>用户注册</h2>
<form action="register.do">
    用户名:<input type="text" name="myname"><br>
    密码:<input type="password" name="mypass"><br>
    年龄:<input type="text" name="myage"><br>
    地址:<input type="text" name="myaddress"><br>
    注册日期:<input type="text" name="myday"><br>
    <input type="submit" value="注册">
</form>
</body>
</html>
@RequestMapping("register.do")
//通过@RequestParam将form表单中input元素的name属性值得到赋值给形式参数,然后在请求处理方法中使用这形式参数
public ModelAndView testGetReqParam1(@RequestParam("myname")String name,
                                    @RequestParam("mypass")String pass,
                                    @RequestParam("myage")Integer age,
                                    @RequestParam("myaddress")String address,
                                    @RequestParam("myday")String day){
    System.out.println("testGetReqParam1------");
    System.out.println("myname------"+name);
    System.out.println("mypass------"+pass);
    System.out.println("myage------"+age);
    System.out.println("myaddress------"+address);
    System.out.println("myday------"+day);
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("myname",name);
    modelAndView.addObject("mypass",pass);
    modelAndView.addObject("myage",age);
    modelAndView.addObject("myaddress",address);
    modelAndView.addObject("myday",day);
    modelAndView.setViewName("test.jsp");
    return modelAndView;
}

3.HttpServletRequest对象接收数据

@RequestMapping("register.do")
public ModelAndView testGetReqParam2(HttpServletRequest req){
    System.out.println("testGetReqParam2------");
    String name=req.getParameter("myname");
    String pass=req.getParameter("mypass");
    Integer age=Integer.parseInt(req.getParameter("myage"));
    String address=req.getParameter("myaddress");
    String day=req.getParameter("myday");
    System.out.println("myname------"+req.getParameter("myname"));
    System.out.println("mypass------"+pass);
    System.out.println("myage------"+age);
    System.out.println("myaddress------"+address);
    System.out.println("myday------"+day);
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("myname",name);
    modelAndView.addObject("mypass",pass);
    modelAndView.addObject("myage",age);
    modelAndView.addObject("myaddress",address);
    modelAndView.addObject("myday",day);
    modelAndView.setViewName("test.jsp");
    return modelAndView;
}

4.在请求处理方法中定义对应参数变量,参数变量的名称与页面元素的name属性值相同

@RequestMapping("register.do")
//参数的名称一定要与表单中name属性值一样
public ModelAndView testGetReqParam3(String myname,String mypass,
                                  Integer myage,String myaddress,
                                     String myday){
    System.out.println("testGetReqParam3------");
    System.out.println("myname------"+myname);
    System.out.println("mypass------"+mypass);
    System.out.println("myage------"+myage);
    System.out.println("myaddress------"+myaddress);
    System.out.println("myday------"+myday);
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("myname",myname);
    modelAndView.addObject("mypass",mypass);
    modelAndView.addObject("myage",myage);
    modelAndView.addObject("myaddress",myaddress);
    modelAndView.addObject("myday",myday);
    modelAndView.setViewName("test.jsp");
    return modelAndView;
}

5.将需要提交的请求参数值封装到java对象中【java对象的成员变量的名称一定要与页面元素的name属性值相同

package com.click369.springmvc.demo;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class UserBean {
    private  String myname;
    private  String mypass;
    private  Integer myage;
    private  String myaddress;
    //时间日期型数据
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date myday;

    public String getMyname() {
        return myname;
    }

    public void setMyname(String myname) {
        this.myname = myname;
    }

    public String getMypass() {
        return mypass;
    }

    public void setMypass(String mypass) {
        this.mypass = mypass;
    }

    public Integer getMyage() {
        return myage;
    }

    public void setMyage(Integer myage) {
        this.myage = myage;
    }

    public String getMyaddress() {
        return myaddress;
    }

    public void setMyaddress(String myaddress) {
        this.myaddress = myaddress;
    }

    public Date getMyday() {
        return myday;
    }

    public void setMyday(Date myday) {
        this.myday = myday;
    }
}
@RequestMapping("register.do")
//参数的名称一定要与表单中name属性值一样
public ModelAndView testGetReqParam4(UserBean user){
    System.out.println("testGetReqParam4------");
    String name=user.getMyname();
    String pass=user.getMypass();
    Integer age=user.getMyage();
    String address=user.getMyaddress();
    Date day=user.getMyday();
    System.out.println("myname------"+user.getMyname());
    System.out.println("mypass------"+user.getMypass());
    System.out.println("myage------"+user.getMyage());
    System.out.println("myaddress------"+user.getMyaddress());
    System.out.println("myday------"+user.getMyday());
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("myname",name);
    modelAndView.addObject("mypass",pass);
    modelAndView.addObject("myage",age);
    modelAndView.addObject("myaddress",address);
    modelAndView.addObject("myday",day);
    modelAndView.setViewName("test.jsp");
    return modelAndView;
}

6.将被提交的请求参数组织成json数据

9 SpringMVC的文件上传和下载

创建上传用的javaweb项目

导入依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->

<dependency>

  <groupId>org.springframework</groupId>

  <artifactId>spring-webmvc</artifactId>

  <version>4.2.4.RELEASE</version>

</dependency>

<!-- commons-fileupload组件 -->

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->

<dependency>

  <groupId>commons-fileupload</groupId>

  <artifactId>commons-fileupload</artifactId>

  <version>1.3.1</version>

</dependency>

<!-- 配置ServletAPI依赖 -->

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

  <groupId>javax.servlet</groupId>

  <artifactId>javax.servlet-api</artifactId>

  <version>3.0.1</version>

  <scope>provided</scope>

</dependency>

配置web.xml文件

<!-- 配置中央处理器-->

<servlet>

  <servlet-name>dispatcherServlet</servlet-name>

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

  <init-param>

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

    <param-value>classpath:springmvc.xml</param-value>

  </init-param>

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

</servlet>

<servlet-mapping>

  <servlet-name>dispatcherServlet</servlet-name>

  <!--http://127.0.0.1:8080/springmvc1/add.do-->

  <url-pattern>*.do</url-pattern>

</servlet-mapping>

完善项目结构

创建springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

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

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

创建上传文件用的html页面

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>上传文件</title>

</head>

<body>

    <center>

        <form  action="/myupload.do" method="post" enctype="multipart/form-data">

            选择文件:<input type="file" name="myfile"/><br>

            <input type="submit" value="开始上传" />

        </form>

    </center>

</body>

</html>

创建处理上传请求的控制器

package com.click369.test.controller;

import org.springframework.stereotype.Controller;

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

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import java.io.File;

import java.util.Iterator;

/**

 * 处理上传文件请求的控制器

 */

@Controller

public class TestUpLoadConntroller {

    /**

     * 处理上传文件的请求处理方法

     */

    @RequestMapping(value = "/myupload.do",method = RequestMethod.POST)

    public ModelAndView  myupload(HttpServletRequest request)throws Exception{

        ModelAndView  mav=new ModelAndView();

        System.out.println("测试上传文件的请求处理方法");

        //将当前类中的ServletContext对象转换成CommonsMultipartResolver

        ServletContext servletContext=request.getSession().getServletContext();

        CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver(servletContext);

        //检验HttpServletRequest是否是一个文件上传请求

        if(commonsMultipartResolver.isMultipart(request)){

            //将HttpServletRequest对象变成多部分MultipartHttpServletRequest

            MultipartHttpServletRequest multipartreq=(MultipartHttpServletRequest)request;

            //从MultipartHttpServletRequest对象中得到文件名称

            Iterator<String> itname=multipartreq.getFileNames();

            //遍历包含有name属性值的Iterator集合

            while(itname.hasNext()){

                //得到name属性值

                String nameshuxing=itname.next().toString();

                //根据得到的neme属性值得到具体的文件

                MultipartFile multipartfile=multipartreq.getFile(nameshuxing);

                String newfilename="";

                if(multipartfile!=null){

                    //重新为上传来的文件命名

                    long haomiaoshu=System.currentTimeMillis();

                    //得到被上传来的文件的真实名称【MavenJavaWeb.war】

                    String  zhenFileName=multipartfile.getOriginalFilename();

                    //得到文件的后缀名

                    String houzhuiming=zhenFileName.substring(zhenFileName.lastIndexOf("."));

                    newfilename=haomiaoshu+houzhuiming;

                    // 获取项目的根目录

                    String realPath = servletContext.getRealPath("/upload");

                    File uploadpicdir = new File(realPath);

                    if(!uploadpicdir.exists()){

                        //创建upload目录

                        uploadpicdir.mkdirs();

                    }

                    //组织一个保存文件的对象【文件保存目录+文件名称】

                    String pathfile=uploadpicdir.getAbsolutePath()+File.separator+newfilename;

                    System.out.println(pathfile);

                    File saveFile=new File(pathfile);

                    //保存文件到本地磁盘

                    multipartfile.transferTo(saveFile);

                }

                //得到上传成功以后的文件的http访问地址

                String reqURL=request.getRequestURL().toString();

                reqURL=reqURL.substring(0,reqURL.lastIndexOf("/"));

                reqURL=reqURL+"/upload/"+newfilename;

                //http://127.0.0.1:8080/upload/xxxxxx.jpg

                System.out.println("reqURL=="+reqURL);

            }

            mav.setViewName("success.html");

        }else{

            mav.setViewName("error.html");

        }

        return  mav;

    }

}

配置SpringMVC的配置文件

<?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:mvc="http://www.springframework.org/schema/mvc"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

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

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

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

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

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

    <!-- 开启mvc注解 -->

    <mvc:annotation-driven></mvc:annotation-driven>

    <!--配置自动扫描包-->

    <context:component-scan base-package="com.click369.test.controller"></context:component-scan>

    <!-- 视图解析器-->

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <property name="maxUploadSize" value="104857600" />

        <property name="maxInMemorySize" value="4096" />

        <property name="defaultEncoding" value="UTF-8"></property>

    </bean>

</beans>

部署测试

1.创建javaweb项目

2.导入依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->

<dependency>

  <groupId>org.springframework</groupId>

  <artifactId>spring-webmvc</artifactId>

  <version>4.2.4.RELEASE</version>

</dependency>

<!-- commons-fileupload组件 -->

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->

<dependency>

  <groupId>commons-fileupload</groupId>

  <artifactId>commons-fileupload</artifactId>

  <version>1.3.1</version>

</dependency>

<!-- 配置ServletAPI依赖 -->

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

  <groupId>javax.servlet</groupId>

  <artifactId>javax.servlet-api</artifactId>

  <version>3.0.1</version>

  <scope>provided</scope>

</dependency>

3.配置web.xml文件

<!-- 配置中央处理器-->

<servlet>

  <servlet-name>dispatcherServlet</servlet-name>

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

  <init-param>

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

    <param-value>classpath:springmvc.xml</param-value>

  </init-param>

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

</servlet>

<servlet-mapping>

  <servlet-name>dispatcherServlet</servlet-name>

  <!--http://127.0.0.1:8080/springmvc1/add.do-->

  <url-pattern>*.do</url-pattern>

</servlet-mapping>

4.完善项目结构

5.创建springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

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

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

6.创建下载传文件用的html页面

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>文件下载</title>

</head>

<body>

    <center>

        <a href="dowload.do?filename=mybatis.jpg">MyBatis框架图标</a>

        <a href="dowload.do?filename=MavenJavaWeb.war">MavenJavaWeb.war</a>

        <a href="dowload.do?filename=Servlet(1).docx">Servlet(1).docx</a>

    </center>

</body>

</html>

7.创建控制器类

package com.click369.test.controller;



import org.apache.commons.io.FileUtils;

import org.springframework.http.HttpHeaders;

import org.springframework.http.HttpStatus;

import org.springframework.http.MediaType;

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Controller;

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



import javax.servlet.http.HttpServletRequest;

import java.io.File;



/**

 * 处理下载请求的控制器类

 */

@Controller

public class TestDowloadController {

    @RequestMapping(value="/dowload.do")

    public ResponseEntity<byte[]> dowloadMethod(HttpServletRequest req)throws Exception{

        //得到请求中的文件名称

        String filename=req.getParameter("filename");

        //得到保存文件的目录地址

        //String realPath = req.getSession().getServletContext().getRealPath("/upload");

        String realPath = "F:"+File.separator+"upload";

        //创建保存文件的目录的文件对象

        File uploadpicdir = new File(realPath);

        //创建被下载的文件对象

        File file=new File(uploadpicdir,filename);

        System.out.println(file.getAbsolutePath());

        //设置http协议头

        HttpHeaders headers = new HttpHeaders();

        headers.setContentDispositionFormData("attachment",filename);

        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);

    }

}

8.配置springmvc配置文件

<?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:mvc="http://www.springframework.org/schema/mvc"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

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

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

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

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

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

    <!-- 开启mvc注解 -->

    <mvc:annotation-driven></mvc:annotation-driven>

    <!--配置自动扫描包-->

    <context:component-scan base-package="com.click369.test.controller"></context:component-scan>

</beans>

9.部署测试

10 SSM

S-Spring  [业务]

S-SpingMVC  [web]

M-MyBatis  [dao]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值