spring mvc

技术标签: springmvx

1. 框架的作用

SpringMVC主要解决了控制器如何接收客户端的请求,并将处理结果响应给客户端的问题。

在传统的Java EE开发中,控制器是Servlet,主要存在的问题有:

  1. 每个Servlet都需要在web.xml中配置,一个完整的项目可能需要大量代码完成所有Servlet的配置,所以,存在配置过多、管理难度大的问题;
  2. 由于一个完整的项目中可能有大量的Servlet,则项目启动后,会消耗大量的内存去存储这些Servlet的对象;
  3. 由于一个完整的项目中可能有大量的Servlet,在编码时,管理难度也会增加;
  4. 原生的Java EE中的API使用并不便利!

2. 框架的核心组件

在SpringMVC中,有以下5大核心组件(还有其它组件):

  • DispatcherServlet:接收请求,并分发给各个控制器
  • HandlerMapping:处理请求路径与控制器的映射关系
  • ModelAndView:控制器的处理结果
  • ViewResolver:处理视图名与具体使用的视图组件的映射关系
  • Controller:具体处理请求并给出响应结果

具体的工作流程图:

 

项目目录如下:

pom为maven依赖管理配置文件

配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.tedu.spring</groupId>
    <artifactId>springmvc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

web。xml为tomcat启动时的加载文件。

配置如下:

<?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"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <display-name>springmvc</display-name>
    <!--默认欢乐生肖-->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>def.jsp</welcome-file>
    </welcome-file-list>
    <!--配置前端控制器-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--启动顺序级别-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <!--这里是/而不是/* /会只拦截界面,不拦截静态资源-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--配置post乱码过滤器-->
    <filter>
        <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--配置自定义过滤器-->
    <filter>
        <filter-name>CustomFilter</filter-name>
        <filter-class>com.g7go.spring.filter.CustomFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>CustomFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

spring-mvc。xml 为springmvc核心配置文件,在web。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-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    <!-- 组件扫描 -->
    <context:component-scan base-package="com.g7go.spring"/>

    <!--ViewResolver:视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 注解驱动 -->
    <mvc:annotation-driven/>

    <!--在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,
    会在Spring MVC上下文中定义一个
    org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
    它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,
    就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,
    才由DispatcherServlet继续处理。-->
    <!--<mvc:default-servlet-handler/>-->

    <!--location:指location指定的目录不要拦截,直接请求,这里指在根目录下的resources文件下的所有文件
    mapping:值在resources文件下的所有文件(**代表所有文件)
    所有意思就是在根目录下resources的所有文件不会被DispatcherServlet拦截,直接访问,当做静态资源交个Servlet处理 -->
    <mvc:resources mapping="/images/**" location="/WEB-INF/images/"/>
    <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/>
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>

    <mvc:interceptors>
        <!--拦截器1-->
        <mvc:interceptor>
            <!--配置拦截器的作用路径-->
            <mvc:mapping path="/**"/>
            <!--排除-->
            <mvc:exclude-mapping path="/js/**"/>
            <mvc:exclude-mapping path="/css/**"/>
            <mvc:exclude-mapping path="/images/**"/>
            <!--定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截-->
            <bean class="com.g7go.spring.Interceptor.CustomInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

获取参数方法,以及注解的使用.

package com.g7go.spring.controller;

import com.g7go.spring.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * RequestMapping
 * Controller
 * RequestParam
 * RequestBody
 * ResponseBody
 * PathVariable
 * RequestHeader
 * CookieValue;
 * -------
 * GetMapping
 * PostMapping
 * PutMapping
 * DeleteMapping
 * PatchMapping
 *
 * @Author: Mr_li
 * @CreateDate: 2019-03-01$ 11:22$
 * @Version: 1.0
 */
@Controller
public class TestController {

    @RequestMapping("hello.do")
    public String showHello() {
        System.out.println("HelloController.showHello()");
        return null;
    }

    @RequestMapping("test1.do")
    public String showTest1() {
        System.out.println("HelloController.showTest1()");
        //视图解析器的作用
//        return "/WEB-INF/a/test1.jsp";
        return "test1";
    }


    @RequestMapping("test2.do")
    public String showTest2(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        System.out.println("username=" + username);
        System.out.println("password=" + password);

        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping("test3.do")
    public String showTest3(String username, String password) {
        System.out.println("username=" + username);
        System.out.println("password=" + password);

        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping("test4.do")
    public String showTest4(User user) {
        System.out.println(user);

        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping("/{id}/test5.do")
    public String showTest5(@PathVariable("id") int id) {
        System.out.println(id);

        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping(value = "/{id}/test6.do")
    public String showTest6(@PathVariable("id") int id) {
        System.out.println(id);

        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping(value = {"/{id}/test7.do", "/{id}/test8.do"})
    public String showTest7(@PathVariable("id") int id) {
        System.out.println(id);

        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping(value = "communityId:[a-z-]+}-{version:\\d\\.\\d\\.\\d}.{extension:\\.[a-z]}")
    public String showTest9(@PathVariable String communityId) {
        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping(value = "/test10.do", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public String showTest10(@PathVariable String communityId) {
        // 暂不关心后续的页面
        return null;
    }

    /**
     * responseBody就是返回值是json数据,使用@responseBody,就可以省略produces属性
     *
     * @param communityId
     * @return
     */
//    @RequestMapping(value = "/test11s.do", method = RequestMethod.POST)
    @PostMapping("")
    @ResponseBody
    public String showTest11(@PathVariable String communityId) {
        // 暂不关心后续的页面
        return null;
    }

    /**
     * 返回值是json数据,字符编码为utf-8
     *
     * @param communityId
     * @return
     */
    @RequestMapping(value = "/test12.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
    public String showTest12(@PathVariable String communityId) {
        // 暂不关心后续的页面
        return null;
    }

    /**
     * 接受值是json数据,字符编码为utf-8
     *
     * @param json
     * @return
     */
    @RequestMapping(value = "/test12.do", method = RequestMethod.POST, consumes = "application/json;charset=utf-8")
    public String showTest16(String json) {
        // 暂不关心后续的页面
        return null;
    }

    /**
     * 设定必须包含username 和age两个参数,且age参数不为10 (可以有多个参数)
     *
     * @param communityId
     * @return
     */
    @RequestMapping(value = "/test13.do", method = RequestMethod.POST, params = {"username", "age!=10"})
    public String showTest13(@PathVariable String communityId) {
        // 暂不关心后续的页面
        return null;
    }

    /**
     * 仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.g7go.com/”的请求;
     *
     * @param communityId
     * @return
     */
    @RequestMapping(value = "/test14.do", method = RequestMethod.POST, headers = "Referer=http://www.g7go.com/")
    public String showTest14(@PathVariable String communityId) {
        // 暂不关心后续的页面
        return null;
    }

    @RequestMapping(value = "/test15.do", method = RequestMethod.POST, headers = "Referer=http://www.g7go.com/")
    public String showTest15(@RequestParam(value = "username", required = true, defaultValue = "zhang") String communityId) {
        // 暂不关心后续的页面
        return null;
    }
}

渲染页面

package com.g7go.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.HashMap;
import java.util.Map;

/**
 * 作用描述
 *
 * @Author: Mr_li
 * @CreateDate: 2019-03-01$ 11:40$
 * @Version: 1.0
 */
@Controller
public class TestController2 {

    @RequestMapping("/")
    public ModelAndView test1(String username, String password) {
        String viewName = null;
        String message = null;
        Map<String, Object> model = new HashMap<String, Object>();
            if ("root".equals(username)) {
                if ("1234".equals(password)) {
                    System.out.println("登陆成功");
                } else {
                    viewName = "error";
                    message = "[2] 密码错误!";
                    model.put("msg", message);
                }
        } else {
            viewName = "error";
            message = "[2] 用户名不存在!";
            model.put("msg", message);
        }ModelAndView mav = new ModelAndView(viewName, model);

        return mav;
    }

    @RequestMapping("test2.do")
    public String test2(String username, String password, ModelMap modelMap) {
        String message = null;
        if ("root".equals(username)) {
            if ("1234".equals(password)) {
                System.out.println("登陆成功");
            } else {
                message = "[3] 密码错误!";
                modelMap.addAttribute("msg", message);
                return "error";
            }
        } else {
            message = "[3] 用户名不存在!";
            modelMap.addAttribute("msg", message);
            return "error";
        }
        return null;
    }

    @RequestMapping("test3.do")
    public String test3(String username, String password, Model model) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("...", "...");
        model.addAllAttributes(map);
        return "redirect:index.do";
    }
}

这里只说配置,更详细的请看官方文档.

版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明。
本文链接:
快乐赛车投注 优优彩票网 五分时时彩 秒速快3 秒速时时彩 德国时时彩 吉林快3 欢乐生肖 海南4+1走势图 三分时时彩