SpringMvc之在学习(1)

Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。

(1) Http请求:客户端请求提交到DispatcherServlet。
(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。
(3) 调用处理器:DispatcherServlet将请求提交到Controller。
(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。
(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
(8) Http响应:视图负责将结果显示到客户端。

SpringMVC接口解释

(1)DispatcherServlet接口:

Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

(2)HandlerMapping接口: 能够完成客户请求到Controller映射。
(3)Controller接口: 需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。 Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。 从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
(4)ViewResolver接口: Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。

web.xml加载过程

配置中央(前端)控制器

 <!--配置SpringMVC的中央控制器-->
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
完整的
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!--Spring自带的字符集过滤器-->
    <filter>
        <filter-name>encodingFilter</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--配置SpringMVC的中央控制器-->
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

对应的路径 /WEB-INFO/Springmvc-servlet.xml

springmvc-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.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--SpringMVC框架的配置文件-->

    <!--自动扫描@Controller注解的类-->
    <context:component-scan base-package="com.kaishengit.controller">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <mvc:annotation-driven/>

    <!--静态资源不经过中央控制器-->
    <mvc:default-servlet-handler/>

    <!--视图解析器-->
    <bean id="viewResolver" 
          class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--文件上传的视图解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="100000000"/>
    </bean>



</beans>

Controller

@Controller
public class HomeController {

    @RequestMapping("/home")
    public String home() {
        System.out.println("Hello,SpringMVC!");
        return "home";
    }

}

更多RequestMapping

package com.kaishengit.controller;

import com.kaishengit.exception.NotFoundException;
import com.kaishengit.pojo.Account;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    //@RequestMapping(method = RequestMethod.GET)
    @GetMapping
    public String list(Model model) {
        Account account = new Account();
        account.setUserName("jack");
        account.setAge(23);

        Account account2 = new Account();
        account2.setUserName("Rose");
        account2.setAge(22);

        List<Account> accountList = Arrays.asList(account,account2);
        model.addAttribute("accountList",accountList);
        return "user/list";
    }

    @GetMapping("/new")
    public String newUser() {
        return "user/add";
    }

    @PostMapping("/new")
    public String saveUser(Account account,
                           RedirectAttributes redirectAttributes) {
        System.out.println(account);

        redirectAttributes.addFlashAttribute("message","添加成功");
        return "redirect:/user";
    }

    //@GetMapping(value = "/check/{userName}",produces = "text/plain;charset=UTF-8")
    @RequestMapping(value = "/check/{userName}",method = RequestMethod.GET,
                produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String checkUserName(@PathVariable String userName) {
        if(userName.equals("tom")) {
            return "不可用";
        } else {
            return "可以用";
        }
    }

    @RequestMapping(value = "/api/{id:\\d+}",method = RequestMethod.GET)
    @ResponseBody
    public Account findById(@PathVariable Integer id) {
        Account account = new Account();
        account.setUserName("李四");
        account.setAge(23);
        return account;
    }

    @RequestMapping("/http")
    public String method(HttpServletRequest request, HttpServletResponse response,
                         HttpSession session) {

        return "user/list";
    }

    @RequestMapping(value = "/upload",method = RequestMethod.GET)
    public String fileUpload() {
        return "user/upload";
    }

    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    public String saveFile(String name, MultipartFile file) {
        System.out.println("Name:" + name);
        if(!file.isEmpty()) {
            //上传表单控件的name属性值
            System.out.println("getName:" + file.getName());
            //上传文件的原始名称
            System.out.println("getOriginalFilename:" + file.getOriginalFilename());
            //文件大小(字节)
            System.out.println("size: " + file.getSize());
            //文件的MIME类型
            System.out.println("ContentType:" + file.getContentType());

            //InputStream inputStream = file.getInputStream();
        }
        return "redirect:/user";
    }

    @RequestMapping("/u-{id:\\d+}")
    public String showUser(@PathVariable Integer id) {
        if(id == 100) {
            throw new NotFoundException();
        }
        return "redirect:/user";
    }



}


http://127.0.0.1:8080/springmvc/user/page?p=2
@RequestMapping("/page")
public String page(@RequestParam(value="p")int pageNum) {
System.out.println(pageNum);
return "";
} @
RequestMapping("/page")
public String page(@RequestParam(value="p",defaultValue="1",required=false) int pageNum) {
System.out.println(pageNum);
return "";
}

文件上传jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data">
        <input type="text" name="name">
        <input type="file" name="file">
        <button>upload</button>
    </form>
</body>
</html>

image

image

控制器基于注解

<mvc:annotation-driven/>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容