zoukankan      html  css  js  c++  java
  • SpringMVC总结

    1.什么是SpringMvc?

    Spring MVC是一个基于MVC(Model  view Controller)模式的WEB框架,SpringMvc作为Spring中的一个模块,可以与Spring无缝集成,为应用程序中的Web层(表现层)提出的一套优秀的解决方案。它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化、等等)。

     

    2.SpringMVC入门

        (1)准备Spring环境: SpringMVCSpring为核心,而Spring最核心的模块是IOC/DI容器,也就是SpringMVC的核心类和控制器要交给Spring管理。故项目中拥有Spring的运行环境.

        (2) 备SpringMVC   jar包。

            spring-webmvc-4.1.2.RELEASE.jar  SpringMVCjar文件。

            spring-web-4.1.2.RELEASE.jar     SpringWeb项目运行的支持。

        (3)在web.xml中配置核心控制器  DispatcherServlet

    这里是web.xml中的类容:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     <display-name>springmvc</display-name>
      <welcome-file-list>
          <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      
     <!--  1.配置所有的请求均要到达核心控制器(dispatcherServlet)里去 -->
         <servlet>
             <servlet-name>springmvc</servlet-name>
             <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
             
     <!-- 启动springmvc的核心控制器的时候,就初始化加载springmvc的配置文件 -->
     <!-- 一般spring的配置文件都在放在src中或者resource文件中  -->
            <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:applicationContext-mvc.xml</param-value>
            </init-param>
            
    <!-- DispatcherServlet启动比较耗时,在启动加载文件的时候就进行加载 -->
            <load-on-startup>1</load-on-startup>
         </servlet>
         
         
         <servlet-mapping>
             <servlet-name>springmvc</servlet-name>
             <url-pattern>/</url-pattern>
         </servlet-mapping>
         
         <!-- 支持UTF-8编码 -->
      <filter>
          <filter-name>characterEncoding</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
          <init-param>
              <param-name>encoding</param-name>
              <param-value>UTF-8</param-value>
          </init-param>
      </filter>
      <filter-mapping>
          <filter-name>characterEncoding</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
     </web-app>
    View Code

     这里是 applicationContext-mvc.xml 类容:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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
    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">
    
        <!--  测试spring的环境:-->
        <bean id="mybean" class="java.util.Date"></bean>
        
        
         <!-- 开启Spring的注解的扫描:@Controller @Service @Repository @Component等 。默认存在-->
         <context:annotation-config />
         
         <!-- 组件扫描路径 -->
        <context:component-scan base-package="com.gs"/>
        
        
        <!-- 开启springMVC的默认处理控制器 :处理静态资源 -->
        <mvc:default-servlet-handler /> 
        
        <!-- 开启Springmvc的注解驱动:扫描@RequestMapping等注解 -->
         <mvc:annotation-driven/>
        
        
        <!--     springmvc的映射配置文件 -->
        <bean id="/hello1" class="com.gs.controller.HelloController"/>
        <bean id="/hello2" class="com.gs.controller.HandlerController"/>
        
        <!-- 配置文件上传解析器,id="multipartResolver",这个id不能乱写 
                      设置一个maxUploadSize属性,就是上传文件的大小 -->
         <bean id="multipartResolver"
                class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize">
                <value>2000000000</value>
            </property>
       </bean>
    </beans>
    View Code

    注意:

      1.一般spring的配置文件applicationContext-mvc.xml 都在放在src中或者resource文件中,我们可以通过web.xml配置告诉SpringMVC我们的配置文件路径。

    <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:applicationContext-mvc.xml</param-value>
    </init-param>
    View Code

      2. 如果我们把spring的配置文件放在 WEB-INF 文件夹中,不需要在web.xml中配置上面代码。 但是:

    启动Tomcat服务器的时候会初始化SpringMVC中的DispatcherServlet,而这个DispatcherServlet会根据配置文件初始化Spring容器,默认配置文件路径为:/WEB-INF/<servlet-name>-servlet.xml。

    故:把配置文件更名为springmvc-servlet.xml。

    3. springmvc 控制器三种实现方式

    ① 实现Controller接口重写 handleRequest(HttpServletRequest req, HttpServletResponse resp)方法,返回值为 ModelAndView的对象,

    并且还要将该类交给spring管理,配置的id的值就是该控制器的访问路径

    public class HelloController implements Controller{
    	@Override
    	public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
    	
    		//ModelAndView对象是springmvc控制器中的一个对象,用于封装数据模型和返回页面视图
    		ModelAndView mv = new ModelAndView();
    		mv.setViewName("/jsp/index.jsp");
    		return mv;
    	}
    }
    

      

    ② 实现HttpRequestHandler接口 重写 handleRequest(HttpServletRequest req, HttpServletResponse resp)方法,没有返回值。

    并且还要将该类交给spring管理,配置的id的值就是该控制器的访问路径

    public class HandlerController implements HttpRequestHandler {
    	@Override
    	public void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    		//ModelAndView对象是springmvc控制器中的一个对象,用于封装数据模型和返回页面视图
    		ModelAndView mv = new ModelAndView();
    		mv.setViewName("/jsp/index.jsp");
    	}
    }
    

    ③ 普通类(pojo)和注解 @RequestMapping

    首先要开启SprigMVC注解支持:

    <!-- 开启Spring的注解的扫描:@Controller @Service @Repository @Component等 。默认存在-->
    	 <context:annotation-config />
    	 
    	 <!-- 组件扫描路径 -->
        <context:component-scan base-package="com.gs"/>
        
        
        <!-- 开启springMVC的默认处理控制器 :处理静态资源 -->
    	<mvc:default-servlet-handler /> 
        
    	<!-- 开启Springmvc的注解驱动:扫描@RequestMapping等注解 -->
    	 <mvc:annotation-driven/>
    

     

    @Controller
    @RequestMapping("/pojo")
    public class PojoController {
    	
    	@RequestMapping("/add")
    	public String addddddddddd(){
    		//访问该方法的具体路径是 /pojo/add
    		System.out.println("进来了");
    		return "/jsp/index.jsp";
    	}
    }
    

      

    4. springmvc  控制器常用操作:

    接收页面传递参数、绑定数据到页面、返回json数据、文件上传、文件下载等

          参数接收,首先要考虑乱码问题(Post请求才有问题)。然而springmvc框架本身没有处理请求编码,但是spring框架为我们提供了一个请求编码过滤器,我们在web.xml配置一个请求编码过滤器。

    <!-- 支持UTF-8编码 -->
      <filter>
      	<filter-name>characterEncoding</filter-name>
      	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      	<init-param>
      		<param-name>encoding</param-name>
      		<param-value>UTF-8</param-value>
      	</init-param>
      </filter>
      <filter-mapping>
      	<filter-name>characterEncoding</filter-name>
      	<url-pattern>/*</url-pattern>
      </filter-mapping>
    

      

    1. 参数接收方式

    ① 通过控制器的执行方法参数来接收普通参数(表单的name属性对应的值要和传入的参数一致)

    ② 通过Domain模型对象来接收(表单的name属性对应的值要和模型对象的属性的名称一样)

    ③ 通过传统的HttpServletRequest接收

    ④ 通过url中的参数接收(restfull风格) @PathVariable("id")转换

     

    2. 数据传递

    就是Controller往前台(页面)传递数据

    ① 通过ModelAndView对象传递

    ② 通过Model对象传递

    ③ 通过request对象传递

    ④ 通过返回值传递

    具体代码如下:

    @Controller
    @RequestMapping("/user")
    public class UserController {
    	
    	//	1. 通过控制器的执行方法参数来接收普通参数
    	@RequestMapping("/add1")
    	public String add111(@RequestParam("username") String name1, @RequestParam("age")String age1) {
    		System.out.println( name1 +","+ age1 );
    		return "/jsp/index.jsp";
    	}
    	
    	// 2. 通过模型对象来接收(常用) ,形参中提供接受数据的模型对象.
    	@RequestMapping("/add2")
    	public String add222(User u) {
    		System.out.println(u);
    		return "/jsp/index.jsp";
    	}
    	
    	//	3. 接收url地址栏中参数的请求,(用户请求参数值)
    	@RequestMapping("/add3/{a}")
    	public String add333(@PathVariable("a")Long id) {
    		System.out.println(id);
    		return "/jsp/index.jsp";
    	}
    	
    	// 4. 通过传统的HttpServletRequest接收  
    		 // 4.1   将数据返回到前台页面  
    			// 方式 1. 通过ModelAndView对象传递
    	@RequestMapping("/add401")
    	public ModelAndView service(HttpServletRequest req,HttpServletResponse resp) {
    		System.out.println(req.getParameter("username"));//获取前台页面的数据
    		//将数据返回到前台页面
    		//方式一:
    		ModelAndView mv = new ModelAndView();
    		mv.addObject("msg", "登陆成功401");
    		mv.addObject("user",new User("TOM",401));
    		mv.setViewName("../jsp/index.jsp");
    		return mv;
    	}
    	
    	    //4.2   通过Model对象传递
    	@RequestMapping("/add402")
    	public String add4022(Model model) {
    		//将数据返回到前台页面
    		//方式二:
    		model.addAttribute("msg", "登录成功402");
    		model.addAttribute("user", new User("TOM",402));
    		return "/jsp/index.jsp";
    	}
    		//4.3   通过request对象传递
    	@RequestMapping("/add403")
    	public String add4033(ServletRequest request) {
    		//将数据返回到前台页面
    		//方式三:
    		request.setAttribute("msg", "登录成功403");
    		request.setAttribute("user", new User("TOM",403));
    		return "/jsp/index.jsp";
    	}
    		
    		//4.4   通过返回值传递
    	@RequestMapping("/add404") 
    	public User add4044() {
    		//将数据返回到前台页面
    		//方式四:
    		User u = new User("TOM",404);
    		return u;
    	}
    }
    

     

     3. 返回json数据   主要在方法上加上:@ResponseBody   //返回值以json数据格式进行返回

     

      对日期格式的特殊处理(后面要用到的知识)

      从后台向前台:

      默认返回的日期格式为时间戳,而在前台我们希望显示出指定规则的日期字符串。如:

      默认:{"name""小明哥","birthdate"121223223}

      期望: {"name""小明哥","birthdate""2025-12-12 14:12:12"}

      在日期get属性,字段上,添加一个格式化注解

      @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

      从前台向后台:

      在后台模型的setter方法上,添加注解

      @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")

      访问地址:localhost:8080/jsonV587?birthDay=2017-06-13 16:50:53

    4. 文件下载:

    @RequestMapping("/filedownload/{name}")
    	public void download(@PathVariable("name")String filename,HttpServletRequest req,HttpServletResponse resp) throws IOException {
    		//设置下载文件的名称(通过控制器下载文件时,浏览器可以显示你要下载的文件的文件名称) 
    		resp.setHeader("Content-Disposition","attachment;filename="+filename+".jpg");
    		//获取文件的输出流
    		OutputStream out = resp.getOutputStream();
    		//获取下载文件的地址
    		String filePath ="F:/workspace/springMVC_day01/WebContent/download/"+filename+".jpg";
    		//获取文件输入流
    		FileInputStream fis = new FileInputStream(filePath); 
    		//文件流拷贝
    		IOUtils.copy(fis, out);
    	}
    

      

    5.文件上传:

    @RequestMapping("/fileupload")
    	public String fileupload(String name,MultipartFile file,HttpServletRequest request) throws FileNotFoundException, IOException {
    		System.out.println(name);     
    		System.out.println("进行文件上传");     
    		//1.获取原始的文件名
    		String oldFileName = file.getOriginalFilename();
    		//2.获取文件的后缀名
    		String extName = FilenameUtils.getExtension(oldFileName);
    		//3. 生成一个随机的文件名
    		String uuidname = UUID.randomUUID().toString();
    		String fileName = uuidname+","+extName;
    		//4.设置文件保存的路径
    		String fileDir = request.getServletContext().getRealPath("/upload");
    		System.out.println(fileDir);
    		File filed = new File(fileDir,fileName);
    		if(!filed.getParentFile().exists()) {
    			filed.getParentFile().mkdirs();
    		}
    		//5. 将数据以流的方式写入该文件中 
    		IOUtils.copy(file.getInputStream(), new FileOutputStream(filed));
    		return "../jsp/index.jsp";  
    	}
    

      

    5. SpringMVC的执行流程

    1. 用户向服务器发送请求,请求被SpringMVC前端控制DispatcherServlet捕获;

    2. DispatcherServlet 接收到请求后, 将根据 请求信息 交给 处理器映射器 (HandlerMapping)

    3. HandlerMapping 根据用户的url请求 查找匹配该url的 Handler,并返回一个执行链 HandlerExecutionChain对象

    4. DispatcherServlet 根据获得的Handler,选择一个合适(管理Controller的方式:有xml方式和注解方式)的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)并返回 ModelAndView 给 DispatcherServlet

    5. DispatcherServlet 将 ModelAndView 请求 ViewResolver(视图解析器)解析,返回具体 View

    6. DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中),并将页面响应给用户。

    组件说明:

    •  DispatcherServlet:前端控制器

               用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,

               由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

     

    • HandlerMapping:处理器映射器

       HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,

         例如:配置文件方式,实现接口方式,注解方式等。

     

    •  Handler:处理器

       Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

            由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

     

    • HandlAdapter:处理器适配器

      通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

     

    • ViewResolver:视图解析器

      View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,

      再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

    视图名规则

        视图名字符串前缀:

         forward:/xxx.jsp 采用转发。(默认,地址栏不变)

               redirect:/xxx.jsp  采用重定向。

        new ModelAndView("forward:/userList");

        new ModelAndView("redirect:/user");

     

    • View:视图

      springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

     

    参考: https://www.cnblogs.com/gxc6/p/9544563.html

  • 相关阅读:
    dotnetcharting 生成柱状图,饼图等统计图
    asp.net 前后台相互调用
    SQL基础和高级(语法格式)总结二
    自己动手JQuery插件开发
    SQL基础之创建数据库,表,架构
    SQL基础和高级(语法格式)总结一
    ado.net总结
    [Nescafé 26] 小猫爬山&&售货员的难题&&区间众数(随机化大法好)
    POJ2774 后缀自动机&后缀数组
    【方向学习】单片机
  • 原文地址:https://www.cnblogs.com/gshao/p/10520397.html
Copyright © 2011-2022 走看看